Files @ r25503:6bea84d257d1
Branch filter:

Location: cpp/openttd-patchpack/source/src/command.cpp - annotation

translators
Update: Translations from eints
japanese: 4 changes by akaregi
korean: 2 changes by telk5093
  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
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r9111:983de9c5a848
r6123:049e9624d068
r5584:545d748cc681
r6453:b0b56773284a
r18617:524f2e0f54dc
r5584:545d748cc681
r8116:df67d3c5e4fd
r15850:2444eb8842d1
r5584:545d748cc681
r5584:545d748cc681
r8114:866ed489ed98
r17265:6b8bc35a03d2
r8232:f2761d7ff77f
r8247:adcdb6aead11
r10208:ef8fcc3dc4ca
r10208:ef8fcc3dc4ca
r8306:a191fc6e2f8e
r15284:a975e22a01ee
r16026:de6f171ab049
r5584:545d748cc681
r8264:d493cb51fe8a
r8264:d493cb51fe8a
r21383:942c32fb8b0e
r21383:942c32fb8b0e
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r5584:545d748cc681
r15734:ae8e2e185874
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r5584:545d748cc681
r23698:1872cc5b7dd7
r23698:1872cc5b7dd7
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r5584:545d748cc681
r15839:2b7528d029e3
r15840:d15dd78ef53e
r15844:ff366b80a3cf
r16065:69bb359ad9c9
r21664:0999bd2815df
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r15855:2be9e0211a54
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r24481:a5bae7e5e10a
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r24061:a798207d2b21
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r15162:d47b50bb10ac
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r18762:ec777ff0426a
r24015:cc5c1a7cb59f
r18762:ec777ff0426a
r18768:3747fd5dec42
r15647:143f3f9972e7
r15648:c23281f890bf
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r20745:b1ebcc10c74a
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r18770:fe0f5aab3963
r14227:fac6f4bbb585
r18769:52b4e8d83a42
r18772:80ffc4ed8122
r18772:80ffc4ed8122
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
r5584:545d748cc681
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r5584:545d748cc681
r14227:fac6f4bbb585
r21353:433db3a92931
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r25225:126e4a36a4eb
r23241:d2e564fdfd80
r6667:b4b3f745e39c
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r14227:fac6f4bbb585
r6832:856e7cea465f
r19224:da5678df5fbc
r19224:da5678df5fbc
r18369:bc3de8f003de
r14981:edf3934972c6
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r14813:2dc255bde71a
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r5584:545d748cc681
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r23821:1c36ff7872a7
r18771:b0bbffcb9160
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r18771:b0bbffcb9160
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r21015:66c8525eaadb
r16683:8141fd5ad91e
r8500:936f1fe6d36a
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r18771:b0bbffcb9160
r16683:8141fd5ad91e
r18771:b0bbffcb9160
r16683:8141fd5ad91e
r23698:1872cc5b7dd7
r5584:545d748cc681
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r15844:ff366b80a3cf
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r21664:0999bd2815df
r5584:545d748cc681
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r5584:545d748cc681
r21589:e50e2a9f3abb
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r8500:936f1fe6d36a
r16683:8141fd5ad91e
r5584:545d748cc681
r19680:46fc084fceea
r24688:9c99e0da7aad
r24481:a5bae7e5e10a
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r5584:545d748cc681
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r5584:545d748cc681
r16683:8141fd5ad91e
r24061:a798207d2b21
r5584:545d748cc681
r20472:590c958fe91c
r20472:590c958fe91c
r5584:545d748cc681
r20472:590c958fe91c
r20472:590c958fe91c
r8500:936f1fe6d36a
r20472:590c958fe91c
r20472:590c958fe91c
r8500:936f1fe6d36a
r20472:590c958fe91c
r20472:590c958fe91c
r5584:545d748cc681
r16683:8141fd5ad91e
r5584:545d748cc681
r23280:382c4bba9365
r7559:3b00f02bc9f6
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r8500:936f1fe6d36a
r20742:35845025ed4c
r20742:35845025ed4c
r16683:8141fd5ad91e
r18762:ec777ff0426a
r18762:ec777ff0426a
r24015:cc5c1a7cb59f
r18778:4848b0595531
r18759:13af6c1d62ca
r16683:8141fd5ad91e
r5584:545d748cc681
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r8500:936f1fe6d36a
r16683:8141fd5ad91e
r8500:936f1fe6d36a
r17266:fd37372a3e14
r20745:b1ebcc10c74a
r16683:8141fd5ad91e
r18770:fe0f5aab3963
r23280:382c4bba9365
r18778:4848b0595531
r18778:4848b0595531
r18772:80ffc4ed8122
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r18872:35e831d058c7
r18872:35e831d058c7
r20329:0b11d054e50d
r20329:0b11d054e50d
r20329:0b11d054e50d
r20329:0b11d054e50d
r21218:8daf27729482
r20339:ff8e383cfb7d
r21212:c2aec15458f2
r21218:8daf27729482
r22830:80781225f8f0
r24220:eba5f923a47c
r5584:545d748cc681
r16683:8141fd5ad91e
r5584:545d748cc681
r16683:8141fd5ad91e
r5584:545d748cc681
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r5584:545d748cc681
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r21353:433db3a92931
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r25225:126e4a36a4eb
r23241:d2e564fdfd80
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r19224:da5678df5fbc
r19224:da5678df5fbc
r5584:545d748cc681
r5584:545d748cc681
r7559:3b00f02bc9f6
r23607:36c15679007d
r7559:3b00f02bc9f6
r19944:25a78576fb5e
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r10237:950177a262c8
r5584:545d748cc681
r10604:3c1ed1b55521
r5584:545d748cc681
r23607:36c15679007d
r5584:545d748cc681
r5584:545d748cc681
r7559:3b00f02bc9f6
r10604:3c1ed1b55521
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r18369:bc3de8f003de
r5584:545d748cc681
r10237:950177a262c8
r10237:950177a262c8
r10604:3c1ed1b55521
r5584:545d748cc681
r5584:545d748cc681
r14981:edf3934972c6
r14981:edf3934972c6
r14981:edf3934972c6
r14981:edf3934972c6
r14981:edf3934972c6
r14981:edf3934972c6
r14981:edf3934972c6
r14981:edf3934972c6
r14981:edf3934972c6
r14981:edf3934972c6
r14981:edf3934972c6
r14981:edf3934972c6
r14981:edf3934972c6
r14981:edf3934972c6
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r17266:fd37372a3e14
r16685:e529cb769028
r24521:57ec498b9221
r16685:e529cb769028
r16685:e529cb769028
r16688:22b2d3bda737
r16685:e529cb769028
r16685:e529cb769028
r16685:e529cb769028
r8232:f2761d7ff77f
r5584:545d748cc681
r10624:44138dbb3250
r10624:44138dbb3250
r10624:44138dbb3250
r10624:44138dbb3250
r10624:44138dbb3250
r10624:44138dbb3250
r10624:44138dbb3250
r10624:44138dbb3250
r11090:9276cea703d4
r10624:44138dbb3250
r10626:59619471b98d
r10624:44138dbb3250
r10624:44138dbb3250
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r10499:570896340d7a
r13057:58af81fcdcf8
r7559:3b00f02bc9f6
r10624:44138dbb3250
r7559:3b00f02bc9f6
r11090:9276cea703d4
r5584:545d748cc681
r6943:a727ca1f1062
r5584:545d748cc681
r5584:545d748cc681
r10855:5a3c2f38f98e
r5584:545d748cc681
r12475:c74159068e83
r12475:c74159068e83
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r6123:049e9624d068
r8486:c39f3abc76c0
r23517:1a32c3c14728
r8232:f2761d7ff77f
r10499:570896340d7a
r8232:f2761d7ff77f
r14304:dc9cb5b9e881
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r8519:a269c621b681
r14814:3d4abc0944bc
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r8230:33d57fce0ec2
r23517:1a32c3c14728
r10499:570896340d7a
r14304:dc9cb5b9e881
r14222:128de2aca190
r5584:545d748cc681
r14814:3d4abc0944bc
r5584:545d748cc681
r5584:545d748cc681
r6123:049e9624d068
r8519:a269c621b681
r10207:a1fc2f2a33db
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r10207:a1fc2f2a33db
r10207:a1fc2f2a33db
r7559:3b00f02bc9f6
r10207:a1fc2f2a33db
r7559:3b00f02bc9f6
r6990:2b928bd441ba
r5584:545d748cc681
r10207:a1fc2f2a33db
r11919:363b629324b9
r11917:612c11f7ab47
r5584:545d748cc681
r5584:545d748cc681
r10624:44138dbb3250
r10624:44138dbb3250
r10624:44138dbb3250
r10624:44138dbb3250
r10624:44138dbb3250
r10624:44138dbb3250
r10624:44138dbb3250
r10624:44138dbb3250
r10624:44138dbb3250
r10624:44138dbb3250
r10624:44138dbb3250
r7559:3b00f02bc9f6
r10207:a1fc2f2a33db
r7559:3b00f02bc9f6
r14813:2dc255bde71a
r14813:2dc255bde71a
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r7559:3b00f02bc9f6
r10499:570896340d7a
r7559:3b00f02bc9f6
r10499:570896340d7a
r10207:a1fc2f2a33db
r14813:2dc255bde71a
r7559:3b00f02bc9f6
r10499:570896340d7a
r5584:545d748cc681
r14224:4cf91ac6c669
r23838:bfeaabaa7b1d
r14224:4cf91ac6c669
r17966:0c023b07072a
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r17966:0c023b07072a
r14224:4cf91ac6c669
r23280:382c4bba9365
r10605:0da991e601f2
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r5584:545d748cc681
r14224:4cf91ac6c669
r5584:545d748cc681
r5584:545d748cc681
r5584:545d748cc681
r24267:a453396675d0
r16686:7f6b83a717de
r16686:7f6b83a717de
r16686:7f6b83a717de
r16686:7f6b83a717de
r15854:1a79e88a5296
r15855:2be9e0211a54
r15850:2444eb8842d1
r14224:4cf91ac6c669
r14304:dc9cb5b9e881
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r21155:4f83de14e882
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r18245:fb370bf5a3c0
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r23607:36c15679007d
r23818:7609f20f2104
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14304:dc9cb5b9e881
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r21283:ba592c088a09
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r5584:545d748cc681
r5584:545d748cc681
r14224:4cf91ac6c669
r10604:3c1ed1b55521
r10604:3c1ed1b55521
r10605:0da991e601f2
r10605:0da991e601f2
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r23607:36c15679007d
r5584:545d748cc681
r10605:0da991e601f2
r18369:bc3de8f003de
r10692:ff32a4e34c54
r11090:9276cea703d4
r7521:58ef67185405
r15850:2444eb8842d1
r15850:2444eb8842d1
r15850:2444eb8842d1
r10855:5a3c2f38f98e
r21283:ba592c088a09
r10855:5a3c2f38f98e
r12024:9896e4dc0d8d
r15360:111b979f44e3
r12026:96e8bcc60bf7
r12023:d3ea36a7c778
r12023:d3ea36a7c778
r12023:d3ea36a7c778
r18744:51d0ed99c8f2
r21283:ba592c088a09
r12023:d3ea36a7c778
r10997:839c6ffde00e
r23674:a5bafa1a02c5
r15284:a975e22a01ee
r15284:a975e22a01ee
r14224:4cf91ac6c669
r18923:99aed75c0fd1
r18923:99aed75c0fd1
r23517:1a32c3c14728
r18923:99aed75c0fd1
r21283:ba592c088a09
r18923:99aed75c0fd1
r21283:ba592c088a09
r18923:99aed75c0fd1
r5584:545d748cc681
r18923:99aed75c0fd1
r18923:99aed75c0fd1
r5584:545d748cc681
r18923:99aed75c0fd1
r18923:99aed75c0fd1
r18923:99aed75c0fd1
r18923:99aed75c0fd1
r18923:99aed75c0fd1
r18923:99aed75c0fd1
r18923:99aed75c0fd1
r18936:2ed714e2a8fa
r18936:2ed714e2a8fa
r18936:2ed714e2a8fa
r18936:2ed714e2a8fa
r18936:2ed714e2a8fa
r18923:99aed75c0fd1
r21283:ba592c088a09
r5584:545d748cc681
r5584:545d748cc681
r12023:d3ea36a7c778
r12023:d3ea36a7c778
r5584:545d748cc681
r5584:545d748cc681
r18753:19e74c935c2d
r16618:d89f0c3f42e7
r15284:a975e22a01ee
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r21283:ba592c088a09
r5584:545d748cc681
r14981:edf3934972c6
r5584:545d748cc681
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r23517:1a32c3c14728
r21283:ba592c088a09
r14224:4cf91ac6c669
r21283:ba592c088a09
r14224:4cf91ac6c669
r15284:a975e22a01ee
r15284:a975e22a01ee
r15284:a975e22a01ee
r15284:a975e22a01ee
r15284:a975e22a01ee
r15284:a975e22a01ee
r15284:a975e22a01ee
r15284:a975e22a01ee
r15284:a975e22a01ee
r15284:a975e22a01ee
r15284:a975e22a01ee
r14224:4cf91ac6c669
r18923:99aed75c0fd1
r18923:99aed75c0fd1
r18923:99aed75c0fd1
r18923:99aed75c0fd1
r18923:99aed75c0fd1
r14304:dc9cb5b9e881
r14304:dc9cb5b9e881
r21283:ba592c088a09
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r15036:b7a46ecb32b6
r15036:b7a46ecb32b6
r15036:b7a46ecb32b6
r14224:4cf91ac6c669
r21283:ba592c088a09
r14224:4cf91ac6c669
r14224:4cf91ac6c669
r10207:a1fc2f2a33db
r11944:3b8f9f948e8d
r11944:3b8f9f948e8d
r23607:36c15679007d
r5584:545d748cc681
r5584:545d748cc681
r10207:a1fc2f2a33db
r5584:545d748cc681
r8306:a191fc6e2f8e
r8306:a191fc6e2f8e
r8306:a191fc6e2f8e
r21283:ba592c088a09
r5584:545d748cc681
r14224:4cf91ac6c669
r8854:b4bbf0180038
r8854:b4bbf0180038
r14547:a4cc19b19cd3
r14547:a4cc19b19cd3
r14547:a4cc19b19cd3
r14547:a4cc19b19cd3
r14547:a4cc19b19cd3
r14549:56c5f10f6f93
r8854:b4bbf0180038
r8854:b4bbf0180038
r8854:b4bbf0180038
r8854:b4bbf0180038
r8854:b4bbf0180038
r8854:b4bbf0180038
r8854:b4bbf0180038
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r21155:4f83de14e882
r21155:4f83de14e882
r17828:bcc2d03aefbe
r21155:4f83de14e882
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r21155:4f83de14e882
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
/*
 * 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.cpp Handling of commands. */

#include "stdafx.h"
#include "landscape.h"
#include "error.h"
#include "gui.h"
#include "command_func.h"
#include "network/network_type.h"
#include "network/network.h"
#include "genworld.h"
#include "strings_func.h"
#include "texteff.hpp"
#include "town.h"
#include "date_func.h"
#include "company_func.h"
#include "company_base.h"
#include "signal_func.h"
#include "core/backup_type.hpp"
#include "object_base.h"

#include "table/strings.h"

#include "safeguards.h"

CommandProc CmdBuildRailroadTrack;
CommandProc CmdRemoveRailroadTrack;
CommandProc CmdBuildSingleRail;
CommandProc CmdRemoveSingleRail;

CommandProc CmdLandscapeClear;

CommandProc CmdBuildBridge;

CommandProc CmdBuildRailStation;
CommandProc CmdRemoveFromRailStation;
CommandProc CmdConvertRail;

CommandProc CmdBuildSingleSignal;
CommandProc CmdRemoveSingleSignal;

CommandProc CmdTerraformLand;

CommandProc CmdBuildObject;
CommandProc CmdSellLandArea;

CommandProc CmdBuildTunnel;

CommandProc CmdBuildTrainDepot;
CommandProc CmdBuildRailWaypoint;
CommandProc CmdRenameWaypoint;
CommandProc CmdRemoveFromRailWaypoint;

CommandProc CmdBuildRoadStop;
CommandProc CmdRemoveRoadStop;

CommandProc CmdBuildLongRoad;
CommandProc CmdRemoveLongRoad;
CommandProc CmdBuildRoad;

CommandProc CmdBuildRoadDepot;

CommandProc CmdConvertRoad;

CommandProc CmdBuildAirport;

CommandProc CmdBuildDock;

CommandProc CmdBuildShipDepot;

CommandProc CmdBuildBuoy;

CommandProc CmdPlantTree;

CommandProc CmdMoveRailVehicle;

CommandProc CmdBuildVehicle;
CommandProc CmdSellVehicle;
CommandProc CmdRefitVehicle;
CommandProc CmdSendVehicleToDepot;
CommandProc CmdSetVehicleVisibility;

CommandProc CmdForceTrainProceed;
CommandProc CmdReverseTrainDirection;

CommandProc CmdClearOrderBackup;
CommandProc CmdModifyOrder;
CommandProc CmdSkipToOrder;
CommandProc CmdDeleteOrder;
CommandProc CmdInsertOrder;
CommandProc CmdChangeServiceInt;

CommandProc CmdBuildIndustry;
CommandProc CmdIndustryCtrl;

CommandProc CmdSetCompanyManagerFace;
CommandProc CmdSetCompanyColour;

CommandProc CmdIncreaseLoan;
CommandProc CmdDecreaseLoan;

CommandProc CmdWantEnginePreview;
CommandProc CmdEngineCtrl;

CommandProc CmdRenameVehicle;
CommandProc CmdRenameEngine;

CommandProc CmdRenameCompany;
CommandProc CmdRenamePresident;

CommandProc CmdRenameStation;
CommandProc CmdRenameDepot;

CommandProc CmdPlaceSign;
CommandProc CmdRenameSign;

CommandProc CmdTurnRoadVeh;

CommandProc CmdPause;

CommandProc CmdBuyShareInCompany;
CommandProc CmdSellShareInCompany;
CommandProc CmdBuyCompany;

CommandProc CmdFoundTown;
CommandProc CmdRenameTown;
CommandProc CmdDoTownAction;
CommandProc CmdTownGrowthRate;
CommandProc CmdTownRating;
CommandProc CmdTownCargoGoal;
CommandProc CmdTownSetText;
CommandProc CmdExpandTown;
CommandProc CmdDeleteTown;

CommandProc CmdChangeSetting;
CommandProc CmdChangeCompanySetting;

CommandProc CmdOrderRefit;
CommandProc CmdCloneOrder;

CommandProc CmdClearArea;

CommandProc CmdGiveMoney;
CommandProc CmdMoneyCheat;
CommandProc CmdChangeBankBalance;
CommandProc CmdBuildCanal;
CommandProc CmdBuildLock;

CommandProc CmdCreateSubsidy;
CommandProc CmdCompanyCtrl;
CommandProc CmdCustomNewsItem;
CommandProc CmdCreateGoal;
CommandProc CmdRemoveGoal;
CommandProc CmdSetGoalText;
CommandProc CmdSetGoalProgress;
CommandProc CmdSetGoalCompleted;
CommandProc CmdGoalQuestion;
CommandProc CmdGoalQuestionAnswer;
CommandProc CmdCreateStoryPage;
CommandProc CmdCreateStoryPageElement;
CommandProc CmdUpdateStoryPageElement;
CommandProc CmdSetStoryPageTitle;
CommandProc CmdSetStoryPageDate;
CommandProc CmdShowStoryPage;
CommandProc CmdRemoveStoryPage;
CommandProc CmdRemoveStoryPageElement;
CommandProc CmdScrollViewport;
CommandProc CmdStoryPageButton;

CommandProc CmdLevelLand;

CommandProc CmdBuildSignalTrack;
CommandProc CmdRemoveSignalTrack;

CommandProc CmdSetAutoReplace;

CommandProc CmdCloneVehicle;
CommandProc CmdStartStopVehicle;
CommandProc CmdMassStartStopVehicle;
CommandProc CmdAutoreplaceVehicle;
CommandProc CmdDepotSellAllVehicles;
CommandProc CmdDepotMassAutoReplace;

CommandProc CmdCreateGroup;
CommandProc CmdAlterGroup;
CommandProc CmdDeleteGroup;
CommandProc CmdAddVehicleGroup;
CommandProc CmdAddSharedVehicleGroup;
CommandProc CmdRemoveAllVehiclesGroup;
CommandProc CmdSetGroupFlag;
CommandProc CmdSetGroupLivery;

CommandProc CmdMoveOrder;
CommandProc CmdChangeTimetable;
CommandProc CmdSetVehicleOnTime;
CommandProc CmdAutofillTimetable;
CommandProc CmdSetTimetableStart;

CommandProc CmdOpenCloseAirport;

#define DEF_CMD(proc, flags, type) {proc, #proc, (CommandFlags)flags, type}

/**
 * The master command table
 *
 * This table contains all possible CommandProc functions with
 * the flags which belongs to it. The indices are the same
 * as the value from the CMD_* enums.
 */
static const Command _command_proc_table[] = {
	DEF_CMD(CmdBuildRailroadTrack,       CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_RAILROAD_TRACK
	DEF_CMD(CmdRemoveRailroadTrack,                     CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_REMOVE_RAILROAD_TRACK
	DEF_CMD(CmdBuildSingleRail,          CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_SINGLE_RAIL
	DEF_CMD(CmdRemoveSingleRail,                        CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_REMOVE_SINGLE_RAIL
	DEF_CMD(CmdLandscapeClear,                         CMD_DEITY, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_LANDSCAPE_CLEAR
	DEF_CMD(CmdBuildBridge,  CMD_DEITY | CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_BRIDGE
	DEF_CMD(CmdBuildRailStation,         CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_RAIL_STATION
	DEF_CMD(CmdBuildTrainDepot,          CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_TRAIN_DEPOT
	DEF_CMD(CmdBuildSingleSignal,                       CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_SIGNALS
	DEF_CMD(CmdRemoveSingleSignal,                      CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_REMOVE_SIGNALS
	DEF_CMD(CmdTerraformLand,           CMD_ALL_TILES | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_TERRAFORM_LAND
	DEF_CMD(CmdBuildObject,              CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_OBJECT
	DEF_CMD(CmdBuildTunnel,                 CMD_DEITY | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_TUNNEL
	DEF_CMD(CmdRemoveFromRailStation,                          0, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_REMOVE_FROM_RAIL_STATION
	DEF_CMD(CmdConvertRail,                                    0, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_CONVERT_RAILD
	DEF_CMD(CmdBuildRailWaypoint,                              0, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_RAIL_WAYPOINT
	DEF_CMD(CmdRenameWaypoint,                                 0, CMDT_OTHER_MANAGEMENT      ), // CMD_RENAME_WAYPOINT
	DEF_CMD(CmdRemoveFromRailWaypoint,                         0, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_REMOVE_FROM_RAIL_WAYPOINT

	DEF_CMD(CmdBuildRoadStop,            CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_ROAD_STOP
	DEF_CMD(CmdRemoveRoadStop,                                 0, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_REMOVE_ROAD_STOP
	DEF_CMD(CmdBuildLongRoad,CMD_DEITY | CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_LONG_ROAD
	DEF_CMD(CmdRemoveLongRoad,            CMD_NO_TEST | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_REMOVE_LONG_ROAD; towns may disallow removing road bits (as they are connected) in test, but in exec they're removed and thus removing is allowed.
	DEF_CMD(CmdBuildRoad,    CMD_DEITY | CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_ROAD
	DEF_CMD(CmdBuildRoadDepot,           CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_ROAD_DEPOT
	DEF_CMD(CmdConvertRoad,                                    0, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_CONVERT_ROAD

	DEF_CMD(CmdBuildAirport,             CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_AIRPORT
	DEF_CMD(CmdBuildDock,                               CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_DOCK
	DEF_CMD(CmdBuildShipDepot,                          CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_SHIP_DEPOT
	DEF_CMD(CmdBuildBuoy,                               CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_BUOY
	DEF_CMD(CmdPlantTree,                               CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_PLANT_TREE

	DEF_CMD(CmdBuildVehicle,                       CMD_CLIENT_ID, CMDT_VEHICLE_CONSTRUCTION  ), // CMD_BUILD_VEHICLE
	DEF_CMD(CmdSellVehicle,                        CMD_CLIENT_ID, CMDT_VEHICLE_CONSTRUCTION  ), // CMD_SELL_VEHICLE
	DEF_CMD(CmdRefitVehicle,                                   0, CMDT_VEHICLE_CONSTRUCTION  ), // CMD_REFIT_VEHICLE
	DEF_CMD(CmdSendVehicleToDepot,                             0, CMDT_VEHICLE_MANAGEMENT    ), // CMD_SEND_VEHICLE_TO_DEPOT
	DEF_CMD(CmdSetVehicleVisibility,                           0, CMDT_COMPANY_SETTING       ), // CMD_SET_VEHICLE_VISIBILITY

	DEF_CMD(CmdMoveRailVehicle,                                0, CMDT_VEHICLE_CONSTRUCTION  ), // CMD_MOVE_RAIL_VEHICLE
	DEF_CMD(CmdForceTrainProceed,                              0, CMDT_VEHICLE_MANAGEMENT    ), // CMD_FORCE_TRAIN_PROCEED
	DEF_CMD(CmdReverseTrainDirection,                          0, CMDT_VEHICLE_MANAGEMENT    ), // CMD_REVERSE_TRAIN_DIRECTION

	DEF_CMD(CmdClearOrderBackup,                   CMD_CLIENT_ID, CMDT_SERVER_SETTING        ), // CMD_CLEAR_ORDER_BACKUP
	DEF_CMD(CmdModifyOrder,                                    0, CMDT_ROUTE_MANAGEMENT      ), // CMD_MODIFY_ORDER
	DEF_CMD(CmdSkipToOrder,                                    0, CMDT_ROUTE_MANAGEMENT      ), // CMD_SKIP_TO_ORDER
	DEF_CMD(CmdDeleteOrder,                                    0, CMDT_ROUTE_MANAGEMENT      ), // CMD_DELETE_ORDER
	DEF_CMD(CmdInsertOrder,                                    0, CMDT_ROUTE_MANAGEMENT      ), // CMD_INSERT_ORDER

	DEF_CMD(CmdChangeServiceInt,                               0, CMDT_VEHICLE_MANAGEMENT    ), // CMD_CHANGE_SERVICE_INT

	DEF_CMD(CmdBuildIndustry,                          CMD_DEITY, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_INDUSTRY
	DEF_CMD(CmdIndustryCtrl,            CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_INDUSTRY_CTRL

	DEF_CMD(CmdSetCompanyManagerFace,                          0, CMDT_OTHER_MANAGEMENT      ), // CMD_SET_COMPANY_MANAGER_FACE
	DEF_CMD(CmdSetCompanyColour,                               0, CMDT_OTHER_MANAGEMENT      ), // CMD_SET_COMPANY_COLOUR

	DEF_CMD(CmdIncreaseLoan,                                   0, CMDT_MONEY_MANAGEMENT      ), // CMD_INCREASE_LOAN
	DEF_CMD(CmdDecreaseLoan,                                   0, CMDT_MONEY_MANAGEMENT      ), // CMD_DECREASE_LOAN

	DEF_CMD(CmdWantEnginePreview,                              0, CMDT_VEHICLE_MANAGEMENT    ), // CMD_WANT_ENGINE_PREVIEW
	DEF_CMD(CmdEngineCtrl,                             CMD_DEITY, CMDT_VEHICLE_MANAGEMENT    ), // CMD_ENGINE_CTRL

	DEF_CMD(CmdRenameVehicle,                                  0, CMDT_OTHER_MANAGEMENT      ), // CMD_RENAME_VEHICLE
	DEF_CMD(CmdRenameEngine,                          CMD_SERVER, CMDT_OTHER_MANAGEMENT      ), // CMD_RENAME_ENGINE

	DEF_CMD(CmdRenameCompany,                                  0, CMDT_OTHER_MANAGEMENT      ), // CMD_RENAME_COMPANY
	DEF_CMD(CmdRenamePresident,                                0, CMDT_OTHER_MANAGEMENT      ), // CMD_RENAME_PRESIDENT

	DEF_CMD(CmdRenameStation,                                  0, CMDT_OTHER_MANAGEMENT      ), // CMD_RENAME_STATION
	DEF_CMD(CmdRenameDepot,                                    0, CMDT_OTHER_MANAGEMENT      ), // CMD_RENAME_DEPOT

	DEF_CMD(CmdPlaceSign,                              CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_PLACE_SIGN
	DEF_CMD(CmdRenameSign,                             CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_RENAME_SIGN

	DEF_CMD(CmdTurnRoadVeh,                                    0, CMDT_VEHICLE_MANAGEMENT    ), // CMD_TURN_ROADVEH

	DEF_CMD(CmdPause,                    CMD_SERVER | CMD_NO_EST, CMDT_SERVER_SETTING        ), // CMD_PAUSE

	DEF_CMD(CmdBuyShareInCompany,                              0, CMDT_MONEY_MANAGEMENT      ), // CMD_BUY_SHARE_IN_COMPANY
	DEF_CMD(CmdSellShareInCompany,                             0, CMDT_MONEY_MANAGEMENT      ), // CMD_SELL_SHARE_IN_COMPANY
	DEF_CMD(CmdBuyCompany,                                     0, CMDT_MONEY_MANAGEMENT      ), // CMD_BUY_COMANY

	DEF_CMD(CmdFoundTown,                CMD_DEITY | CMD_NO_TEST, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_FOUND_TOWN; founding random town can fail only in exec run
	DEF_CMD(CmdRenameTown,                CMD_DEITY | CMD_SERVER, CMDT_OTHER_MANAGEMENT      ), // CMD_RENAME_TOWN
	DEF_CMD(CmdDoTownAction,                                   0, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_DO_TOWN_ACTION
	DEF_CMD(CmdTownCargoGoal,                          CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_TOWN_CARGO_GOAL
	DEF_CMD(CmdTownGrowthRate,                         CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_TOWN_GROWTH_RATE
	DEF_CMD(CmdTownRating,                             CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_TOWN_RATING
	DEF_CMD(CmdTownSetText,             CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_TOWN_SET_TEXT
	DEF_CMD(CmdExpandTown,                             CMD_DEITY, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_EXPAND_TOWN
	DEF_CMD(CmdDeleteTown,                           CMD_OFFLINE, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_DELETE_TOWN

	DEF_CMD(CmdOrderRefit,                                     0, CMDT_ROUTE_MANAGEMENT      ), // CMD_ORDER_REFIT
	DEF_CMD(CmdCloneOrder,                                     0, CMDT_ROUTE_MANAGEMENT      ), // CMD_CLONE_ORDER

	DEF_CMD(CmdClearArea,                            CMD_NO_TEST, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_CLEAR_AREA; destroying multi-tile houses makes town rating differ between test and execution

	DEF_CMD(CmdMoneyCheat,                           CMD_OFFLINE, CMDT_CHEAT                 ), // CMD_MONEY_CHEAT
	DEF_CMD(CmdChangeBankBalance,                      CMD_DEITY, CMDT_MONEY_MANAGEMENT      ), // CMD_CHANGE_BANK_BALANCE
	DEF_CMD(CmdBuildCanal,                              CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_CANAL
	DEF_CMD(CmdCreateSubsidy,                          CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_CREATE_SUBSIDY
	DEF_CMD(CmdCompanyCtrl, CMD_SPECTATOR | CMD_CLIENT_ID | CMD_NO_EST, CMDT_SERVER_SETTING  ), // CMD_COMPANY_CTRL
	DEF_CMD(CmdCustomNewsItem,          CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_CUSTOM_NEWS_ITEM
	DEF_CMD(CmdCreateGoal,              CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_CREATE_GOAL
	DEF_CMD(CmdRemoveGoal,                             CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_REMOVE_GOAL
	DEF_CMD(CmdSetGoalText,             CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_SET_GOAL_TEXT
	DEF_CMD(CmdSetGoalProgress,         CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_SET_GOAL_PROGRESS
	DEF_CMD(CmdSetGoalCompleted,        CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_SET_GOAL_COMPLETED
	DEF_CMD(CmdGoalQuestion,            CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_GOAL_QUESTION
	DEF_CMD(CmdGoalQuestionAnswer,                     CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_GOAL_QUESTION_ANSWER
	DEF_CMD(CmdCreateStoryPage,         CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_CREATE_STORY_PAGE
	DEF_CMD(CmdCreateStoryPageElement,  CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_CREATE_STORY_PAGE_ELEMENT
	DEF_CMD(CmdUpdateStoryPageElement,  CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_UPDATE_STORY_PAGE_ELEMENT
	DEF_CMD(CmdSetStoryPageTitle,       CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_SET_STORY_PAGE_TITLE
	DEF_CMD(CmdSetStoryPageDate,                       CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_SET_STORY_PAGE_DATE
	DEF_CMD(CmdShowStoryPage,                          CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_SHOW_STORY_PAGE
	DEF_CMD(CmdRemoveStoryPage,                        CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_REMOVE_STORY_PAGE
	DEF_CMD(CmdRemoveStoryPageElement,                 CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_REMOVE_STORY_ELEMENT_PAGE
	DEF_CMD(CmdScrollViewport,                         CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_SCROLL_VIEWPORT
	DEF_CMD(CmdStoryPageButton,                        CMD_DEITY, CMDT_OTHER_MANAGEMENT      ), // CMD_STORY_PAGE_BUTTON

	DEF_CMD(CmdLevelLand, CMD_ALL_TILES | CMD_NO_TEST | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_LEVEL_LAND; test run might clear tiles multiple times, in execution that only happens once

	DEF_CMD(CmdBuildLock,                               CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_LOCK

	DEF_CMD(CmdBuildSignalTrack,                        CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_SIGNAL_TRACK
	DEF_CMD(CmdRemoveSignalTrack,                       CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_REMOVE_SIGNAL_TRACK

	DEF_CMD(CmdGiveMoney,                                      0, CMDT_MONEY_MANAGEMENT      ), // CMD_GIVE_MONEY
	DEF_CMD(CmdChangeSetting,                         CMD_SERVER, CMDT_SERVER_SETTING        ), // CMD_CHANGE_SETTING
	DEF_CMD(CmdChangeCompanySetting,                           0, CMDT_COMPANY_SETTING       ), // CMD_CHANGE_COMPANY_SETTING
	DEF_CMD(CmdSetAutoReplace,                                 0, CMDT_VEHICLE_MANAGEMENT    ), // CMD_SET_AUTOREPLACE
	DEF_CMD(CmdCloneVehicle,                         CMD_NO_TEST, CMDT_VEHICLE_CONSTRUCTION  ), // CMD_CLONE_VEHICLE; NewGRF callbacks influence building and refitting making it impossible to correctly estimate the cost
	DEF_CMD(CmdStartStopVehicle,                               0, CMDT_VEHICLE_MANAGEMENT    ), // CMD_START_STOP_VEHICLE
	DEF_CMD(CmdMassStartStopVehicle,                           0, CMDT_VEHICLE_MANAGEMENT    ), // CMD_MASS_START_STOP
	DEF_CMD(CmdAutoreplaceVehicle,                             0, CMDT_VEHICLE_MANAGEMENT    ), // CMD_AUTOREPLACE_VEHICLE
	DEF_CMD(CmdDepotSellAllVehicles,                           0, CMDT_VEHICLE_CONSTRUCTION  ), // CMD_DEPOT_SELL_ALL_VEHICLES
	DEF_CMD(CmdDepotMassAutoReplace,                           0, CMDT_VEHICLE_CONSTRUCTION  ), // CMD_DEPOT_MASS_AUTOREPLACE
	DEF_CMD(CmdCreateGroup,                                    0, CMDT_ROUTE_MANAGEMENT      ), // CMD_CREATE_GROUP
	DEF_CMD(CmdDeleteGroup,                                    0, CMDT_ROUTE_MANAGEMENT      ), // CMD_DELETE_GROUP
	DEF_CMD(CmdAlterGroup,                                     0, CMDT_OTHER_MANAGEMENT      ), // CMD_ALTER_GROUP
	DEF_CMD(CmdAddVehicleGroup,                                0, CMDT_ROUTE_MANAGEMENT      ), // CMD_ADD_VEHICLE_GROUP
	DEF_CMD(CmdAddSharedVehicleGroup,                          0, CMDT_ROUTE_MANAGEMENT      ), // CMD_ADD_SHARE_VEHICLE_GROUP
	DEF_CMD(CmdRemoveAllVehiclesGroup,                         0, CMDT_ROUTE_MANAGEMENT      ), // CMD_REMOVE_ALL_VEHICLES_GROUP
	DEF_CMD(CmdSetGroupFlag,                                   0, CMDT_ROUTE_MANAGEMENT      ), // CMD_SET_GROUP_FLAG
	DEF_CMD(CmdSetGroupLivery,                                 0, CMDT_ROUTE_MANAGEMENT      ), // CMD_SET_GROUP_LIVERY
	DEF_CMD(CmdMoveOrder,                                      0, CMDT_ROUTE_MANAGEMENT      ), // CMD_MOVE_ORDER
	DEF_CMD(CmdChangeTimetable,                                0, CMDT_ROUTE_MANAGEMENT      ), // CMD_CHANGE_TIMETABLE
	DEF_CMD(CmdSetVehicleOnTime,                               0, CMDT_ROUTE_MANAGEMENT      ), // CMD_SET_VEHICLE_ON_TIME
	DEF_CMD(CmdAutofillTimetable,                              0, CMDT_ROUTE_MANAGEMENT      ), // CMD_AUTOFILL_TIMETABLE
	DEF_CMD(CmdSetTimetableStart,                              0, CMDT_ROUTE_MANAGEMENT      ), // CMD_SET_TIMETABLE_START

	DEF_CMD(CmdOpenCloseAirport,                               0, CMDT_ROUTE_MANAGEMENT      ), // CMD_OPEN_CLOSE_AIRPORT
};

/*!
 * This function range-checks a cmd, and checks if the cmd is not nullptr
 *
 * @param cmd The integer value of a command
 * @return true if the command is valid (and got a CommandProc function)
 */
bool IsValidCommand(uint32 cmd)
{
	cmd &= CMD_ID_MASK;

	return cmd < lengthof(_command_proc_table) && _command_proc_table[cmd].proc != nullptr;
}

/*!
 * This function mask the parameter with CMD_ID_MASK and returns
 * the flags which belongs to the given command.
 *
 * @param cmd The integer value of the command
 * @return The flags for this command
 */
CommandFlags GetCommandFlags(uint32 cmd)
{
	assert(IsValidCommand(cmd));

	return _command_proc_table[cmd & CMD_ID_MASK].flags;
}

/*!
 * This function mask the parameter with CMD_ID_MASK and returns
 * the name which belongs to the given command.
 *
 * @param cmd The integer value of the command
 * @return The name for this command
 */
const char *GetCommandName(uint32 cmd)
{
	assert(IsValidCommand(cmd));

	return _command_proc_table[cmd & CMD_ID_MASK].name;
}

/**
 * Returns whether the command is allowed while the game is paused.
 * @param cmd The command to check.
 * @return True if the command is allowed while paused, false otherwise.
 */
bool IsCommandAllowedWhilePaused(uint32 cmd)
{
	/* Lookup table for the command types that are allowed for a given pause level setting. */
	static const int command_type_lookup[] = {
		CMDPL_ALL_ACTIONS,     ///< CMDT_LANDSCAPE_CONSTRUCTION
		CMDPL_NO_LANDSCAPING,  ///< CMDT_VEHICLE_CONSTRUCTION
		CMDPL_NO_LANDSCAPING,  ///< CMDT_MONEY_MANAGEMENT
		CMDPL_NO_CONSTRUCTION, ///< CMDT_VEHICLE_MANAGEMENT
		CMDPL_NO_CONSTRUCTION, ///< CMDT_ROUTE_MANAGEMENT
		CMDPL_NO_CONSTRUCTION, ///< CMDT_OTHER_MANAGEMENT
		CMDPL_NO_CONSTRUCTION, ///< CMDT_COMPANY_SETTING
		CMDPL_NO_ACTIONS,      ///< CMDT_SERVER_SETTING
		CMDPL_NO_ACTIONS,      ///< CMDT_CHEAT
	};
	static_assert(lengthof(command_type_lookup) == CMDT_END);

	assert(IsValidCommand(cmd));
	return _game_mode == GM_EDITOR || command_type_lookup[_command_proc_table[cmd & CMD_ID_MASK].type] <= _settings_game.construction.command_pause_level;
}


static int _docommand_recursive = 0;

/**
 * Shorthand for calling the long DoCommand with a container.
 *
 * @param container Container with (almost) all information
 * @param flags Flags for the command and how to execute the command
 * @see CommandProc
 * @return the cost
 */
CommandCost DoCommand(const CommandContainer *container, DoCommandFlag flags)
{
	return DoCommand(container->tile, container->p1, container->p2, flags, container->cmd & CMD_ID_MASK, container->text);
}

/*!
 * This function executes a given command with the parameters from the #CommandProc parameter list.
 * Depending on the flags parameter it execute or test a command.
 *
 * @param tile The tile to apply the command on (for the #CommandProc)
 * @param p1 Additional data for the command (for the #CommandProc)
 * @param p2 Additional data for the command (for the #CommandProc)
 * @param flags Flags for the command and how to execute the command
 * @param cmd The command-id to execute (a value of the CMD_* enums)
 * @param text The text to pass
 * @see CommandProc
 * @return the cost
 */
CommandCost DoCommand(TileIndex tile, uint32 p1, uint32 p2, DoCommandFlag flags, uint32 cmd, const char *text)
{
	CommandCost res;

	/* Do not even think about executing out-of-bounds tile-commands */
	if (tile != 0 && (tile >= MapSize() || (!IsValidTile(tile) && (flags & DC_ALL_TILES) == 0))) return CMD_ERROR;

	/* Chop of any CMD_MSG or other flags; we don't need those here */
	CommandProc *proc = _command_proc_table[cmd & CMD_ID_MASK].proc;

	_docommand_recursive++;

	/* only execute the test call if it's toplevel, or we're not execing. */
	if (_docommand_recursive == 1 || !(flags & DC_EXEC) ) {
		if (_docommand_recursive == 1) _cleared_object_areas.clear();
		SetTownRatingTestMode(true);
		res = proc(tile, flags & ~DC_EXEC, p1, p2, text);
		SetTownRatingTestMode(false);
		if (res.Failed()) {
			goto error;
		}

		if (_docommand_recursive == 1 &&
				!(flags & DC_QUERY_COST) &&
				!(flags & DC_BANKRUPT) &&
				!CheckCompanyHasMoney(res)) { // CheckCompanyHasMoney() modifies 'res' to an error if it fails.
			goto error;
		}

		if (!(flags & DC_EXEC)) {
			_docommand_recursive--;
			return res;
		}
	}

	/* Execute the command here. All cost-relevant functions set the expenses type
	 * themselves to the cost object at some point */
	if (_docommand_recursive == 1) _cleared_object_areas.clear();
	res = proc(tile, flags, p1, p2, text);
	if (res.Failed()) {
error:
		_docommand_recursive--;
		return res;
	}

	/* if toplevel, subtract the money. */
	if (--_docommand_recursive == 0 && !(flags & DC_BANKRUPT)) {
		SubtractMoneyFromCompany(res);
	}

	return res;
}

/*!
 * This functions returns the money which can be used to execute a command.
 * This is either the money of the current company or INT64_MAX if there
 * is no such a company "at the moment" like the server itself.
 *
 * @return The available money of a company or INT64_MAX
 */
Money GetAvailableMoneyForCommand()
{
	CompanyID company = _current_company;
	if (!Company::IsValidID(company)) return INT64_MAX;
	return Company::Get(company)->money;
}

/**
 * Shortcut for the long DoCommandP when having a container with the data.
 * @param container the container with information.
 * @param my_cmd indicator if the command is from a company or server (to display error messages for a user)
 * @return true if the command succeeded, else false
 */
bool DoCommandP(const CommandContainer *container, bool my_cmd)
{
	return DoCommandP(container->tile, container->p1, container->p2, container->cmd, container->callback, container->text, my_cmd);
}

/*!
 * Toplevel network safe docommand function for the current company. Must not be called recursively.
 * The callback is called when the command succeeded or failed. The parameters
 * \a tile, \a p1, and \a p2 are from the #CommandProc function. The parameter \a cmd is the command to execute.
 * The parameter \a my_cmd is used to indicate if the command is from a company or the server.
 *
 * @param tile The tile to perform a command on (see #CommandProc)
 * @param p1 Additional data for the command (see #CommandProc)
 * @param p2 Additional data for the command (see #CommandProc)
 * @param cmd The command to execute (a CMD_* value)
 * @param callback A callback function to call after the command is finished
 * @param text The text to pass
 * @param my_cmd indicator if the command is from a company or server (to display error messages for a user)
 * @return \c true if the command succeeded, else \c false.
 */
bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback, const char *text, bool my_cmd)
{
	/* Cost estimation is generally only done when the
	 * local user presses shift while doing something.
	 * However, in case of incoming network commands,
	 * map generation or the pause button we do want
	 * to execute. */
	bool estimate_only = _shift_pressed && IsLocalCompany() &&
			!_generating_world &&
			!(cmd & CMD_NETWORK_COMMAND) &&
			!(GetCommandFlags(cmd) & CMD_NO_EST);

	/* We're only sending the command, so don't do
	 * fancy things for 'success'. */
	bool only_sending = _networking && !(cmd & CMD_NETWORK_COMMAND);

	/* Where to show the message? */
	int x = TileX(tile) * TILE_SIZE;
	int y = TileY(tile) * TILE_SIZE;

	if (_pause_mode != PM_UNPAUSED && !IsCommandAllowedWhilePaused(cmd) && !estimate_only) {
		ShowErrorMessage(GB(cmd, 16, 16), STR_ERROR_NOT_ALLOWED_WHILE_PAUSED, WL_INFO, x, y);
		return false;
	}

	/* Only set p2 when the command does not come from the network. */
	if (!(cmd & CMD_NETWORK_COMMAND) && GetCommandFlags(cmd) & CMD_CLIENT_ID && p2 == 0) p2 = CLIENT_ID_SERVER;

	CommandCost res = DoCommandPInternal(tile, p1, p2, cmd, callback, text, my_cmd, estimate_only);
	if (res.Failed()) {
		/* Only show the error when it's for us. */
		StringID error_part1 = GB(cmd, 16, 16);
		if (estimate_only || (IsLocalCompany() && error_part1 != 0 && my_cmd)) {
			ShowErrorMessage(error_part1, res.GetErrorMessage(), WL_INFO, x, y, res.GetTextRefStackGRF(), res.GetTextRefStackSize(), res.GetTextRefStack());
		}
	} else if (estimate_only) {
		ShowEstimatedCostOrIncome(res.GetCost(), x, y);
	} else if (!only_sending && res.GetCost() != 0 && tile != 0 && IsLocalCompany() && _game_mode != GM_EDITOR) {
		/* Only show the cost animation when we did actually
		 * execute the command, i.e. we're not sending it to
		 * the server, when it has cost the local company
		 * something. Furthermore in the editor there is no
		 * concept of cost, so don't show it there either. */
		ShowCostOrIncomeAnimation(x, y, GetSlopePixelZ(x, y), res.GetCost());
	}

	if (!estimate_only && !only_sending && callback != nullptr) {
		callback(res, tile, p1, p2, cmd);
	}

	return res.Succeeded();
}


/**
 * Helper to deduplicate the code for returning.
 * @param cmd   the command cost to return.
 */
#define return_dcpi(cmd) { _docommand_recursive = 0; return cmd; }

/*!
 * Helper function for the toplevel network safe docommand function for the current company.
 *
 * @param tile The tile to perform a command on (see #CommandProc)
 * @param p1 Additional data for the command (see #CommandProc)
 * @param p2 Additional data for the command (see #CommandProc)
 * @param cmd The command to execute (a CMD_* value)
 * @param callback A callback function to call after the command is finished
 * @param text The text to pass
 * @param my_cmd indicator if the command is from a company or server (to display error messages for a user)
 * @param estimate_only whether to give only the estimate or also execute the command
 * @return the command cost of this function.
 */
CommandCost DoCommandPInternal(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback, const char *text, bool my_cmd, bool estimate_only)
{
	/* Prevent recursion; it gives a mess over the network */
	assert(_docommand_recursive == 0);
	_docommand_recursive = 1;

	/* Reset the state. */
	_additional_cash_required = 0;

	/* Get pointer to command handler */
	byte cmd_id = cmd & CMD_ID_MASK;
	assert(cmd_id < lengthof(_command_proc_table));

	CommandProc *proc = _command_proc_table[cmd_id].proc;
	/* Shouldn't happen, but you never know when someone adds
	 * NULLs to the _command_proc_table. */
	assert(proc != nullptr);

	/* Command flags are used internally */
	CommandFlags cmd_flags = GetCommandFlags(cmd);
	/* Flags get send to the DoCommand */
	DoCommandFlag flags = CommandFlagsToDCFlags(cmd_flags);

	/* Make sure p2 is properly set to a ClientID. */
	assert(!(cmd_flags & CMD_CLIENT_ID) || p2 != 0);

	/* Do not even think about executing out-of-bounds tile-commands */
	if (tile != 0 && (tile >= MapSize() || (!IsValidTile(tile) && (cmd_flags & CMD_ALL_TILES) == 0))) return_dcpi(CMD_ERROR);

	/* Always execute server and spectator commands as spectator */
	bool exec_as_spectator = (cmd_flags & (CMD_SPECTATOR | CMD_SERVER)) != 0;

	/* If the company isn't valid it may only do server command or start a new company!
	 * The server will ditch any server commands a client sends to it, so effectively
	 * this guards the server from executing functions for an invalid company. */
	if (_game_mode == GM_NORMAL && !exec_as_spectator && !Company::IsValidID(_current_company) && !(_current_company == OWNER_DEITY && (cmd_flags & CMD_DEITY) != 0)) {
		return_dcpi(CMD_ERROR);
	}

	Backup<CompanyID> cur_company(_current_company, FILE_LINE);
	if (exec_as_spectator) cur_company.Change(COMPANY_SPECTATOR);

	bool test_and_exec_can_differ = (cmd_flags & CMD_NO_TEST) != 0;

	/* Test the command. */
	_cleared_object_areas.clear();
	SetTownRatingTestMode(true);
	BasePersistentStorageArray::SwitchMode(PSM_ENTER_TESTMODE);
	CommandCost res = proc(tile, flags, p1, p2, text);
	BasePersistentStorageArray::SwitchMode(PSM_LEAVE_TESTMODE);
	SetTownRatingTestMode(false);

	/* Make sure we're not messing things up here. */
	assert(exec_as_spectator ? _current_company == COMPANY_SPECTATOR : cur_company.Verify());

	/* If the command fails, we're doing an estimate
	 * or the player does not have enough money
	 * (unless it's a command where the test and
	 * execution phase might return different costs)
	 * we bail out here. */
	if (res.Failed() || estimate_only ||
			(!test_and_exec_can_differ && !CheckCompanyHasMoney(res))) {
		if (!_networking || _generating_world || (cmd & CMD_NETWORK_COMMAND) != 0) {
			/* Log the failed command as well. Just to be able to be find
			 * causes of desyncs due to bad command test implementations. */
			DEBUG(desync, 1, "cmdf: %08x; %02x; %02x; %06x; %08x; %08x; %08x; \"%s\" (%s)", _date, _date_fract, (int)_current_company, tile, p1, p2, cmd & ~CMD_NETWORK_COMMAND, text, GetCommandName(cmd));
		}
		cur_company.Restore();
		return_dcpi(res);
	}

	/*
	 * If we are in network, and the command is not from the network
	 * send it to the command-queue and abort execution
	 */
	if (_networking && !_generating_world && !(cmd & CMD_NETWORK_COMMAND)) {
		NetworkSendCommand(tile, p1, p2, cmd & ~CMD_FLAGS_MASK, callback, text, _current_company);
		cur_company.Restore();

		/* Don't return anything special here; no error, no costs.
		 * This way it's not handled by DoCommand and only the
		 * actual execution of the command causes messages. Also
		 * reset the storages as we've not executed the command. */
		return_dcpi(CommandCost());
	}
	DEBUG(desync, 1, "cmd: %08x; %02x; %02x; %06x; %08x; %08x; %08x; \"%s\" (%s)", _date, _date_fract, (int)_current_company, tile, p1, p2, cmd & ~CMD_NETWORK_COMMAND, text, GetCommandName(cmd));

	/* Actually try and execute the command. If no cost-type is given
	 * use the construction one */
	_cleared_object_areas.clear();
	BasePersistentStorageArray::SwitchMode(PSM_ENTER_COMMAND);
	CommandCost res2 = proc(tile, flags | DC_EXEC, p1, p2, text);
	BasePersistentStorageArray::SwitchMode(PSM_LEAVE_COMMAND);

	if (cmd_id == CMD_COMPANY_CTRL) {
		cur_company.Trash();
		/* We are a new company                  -> Switch to new local company.
		 * We were closed down                   -> Switch to spectator
		 * Some other company opened/closed down -> The outside function will switch back */
		_current_company = _local_company;
	} else {
		/* Make sure nothing bad happened, like changing the current company. */
		assert(exec_as_spectator ? _current_company == COMPANY_SPECTATOR : cur_company.Verify());
		cur_company.Restore();
	}

	/* If the test and execution can differ we have to check the
	 * return of the command. Otherwise we can check whether the
	 * test and execution have yielded the same result,
	 * i.e. cost and error state are the same. */
	if (!test_and_exec_can_differ) {
		assert(res.GetCost() == res2.GetCost() && res.Failed() == res2.Failed()); // sanity check
	} else if (res2.Failed()) {
		return_dcpi(res2);
	}

	/* If we're needing more money and we haven't done
	 * anything yet, ask for the money! */
	if (_additional_cash_required != 0 && res2.GetCost() == 0) {
		/* It could happen we removed rail, thus gained money, and deleted something else.
		 * So make sure the signal buffer is empty even in this case */
		UpdateSignalsInBuffer();
		SetDParam(0, _additional_cash_required);
		return_dcpi(CommandCost(STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY));
	}

	/* update last build coordinate of company. */
	if (tile != 0) {
		Company *c = Company::GetIfValid(_current_company);
		if (c != nullptr) c->last_build_coordinate = tile;
	}

	SubtractMoneyFromCompany(res2);

	/* update signals if needed */
	UpdateSignalsInBuffer();

	return_dcpi(res2);
}
#undef return_dcpi


/**
 * Adds the cost of the given command return value to this cost.
 * Also takes a possible error message when it is set.
 * @param ret The command to add the cost of.
 */
void CommandCost::AddCost(const CommandCost &ret)
{
	this->AddCost(ret.cost);
	if (this->success && !ret.success) {
		this->message = ret.message;
		this->success = false;
	}
}

/**
 * Values to put on the #TextRefStack for the error message.
 * There is only one static instance of the array, just like there is only one
 * instance of normal DParams.
 */
uint32 CommandCost::textref_stack[16];

/**
 * Activate usage of the NewGRF #TextRefStack for the error message.
 * @param grffile NewGRF that provides the #TextRefStack
 * @param num_registers number of entries to copy from the temporary NewGRF registers
 */
void CommandCost::UseTextRefStack(const GRFFile *grffile, uint num_registers)
{
	extern TemporaryStorageArray<int32, 0x110> _temp_store;

	assert(num_registers < lengthof(textref_stack));
	this->textref_stack_grffile = grffile;
	this->textref_stack_size = num_registers;
	for (uint i = 0; i < num_registers; i++) {
		textref_stack[i] = _temp_store.GetValue(0x100 + i);
	}
}