mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2026-09-14 12:29:39 +00:00
Compare commits
797
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c91b5dffd4 | ||
|
|
75a0cba171 | ||
|
|
e1807eff3d | ||
|
|
59951051a0 | ||
|
|
0ca14df566 | ||
|
|
3ce8d2ce70 | ||
|
|
345c3203d7 | ||
|
|
bc84f30fc1 | ||
|
|
21b43b63f5 | ||
|
|
647ee0de64 | ||
|
|
147d5264e3 | ||
|
|
fb58c42aa0 | ||
|
|
245e32a10e | ||
|
|
c41027fbae | ||
|
|
0d331c8d8e | ||
|
|
cf570106a6 | ||
|
|
caae927872 | ||
|
|
01566d6816 | ||
|
|
c75962e04c | ||
|
|
8eb1cb4ebb | ||
|
|
0ef3ce8c08 | ||
|
|
403e19d36f | ||
|
|
ff465245fa | ||
|
|
e428952110 | ||
|
|
5e7f979375 | ||
|
|
510fe5f196 | ||
|
|
f54e74a512 | ||
|
|
8015359894 | ||
|
|
1371ea73f8 | ||
|
|
263976b53b | ||
|
|
d7e9c8efed | ||
|
|
7ec5395832 | ||
|
|
144ea2b958 | ||
|
|
d8e5a2acb4 | ||
|
|
a887571d4c | ||
|
|
d9b0ef78c1 | ||
|
|
5cf28ec3b1 | ||
|
|
a155a51a18 | ||
|
|
f93602aec9 | ||
|
|
51fca5eec7 | ||
|
|
5c358c4173 | ||
|
|
0e4b212c45 | ||
|
|
2bb54f09d8 | ||
|
|
8872ed12ff | ||
|
|
870eab53d2 | ||
|
|
04a24969ea | ||
|
|
fccf0ac84d | ||
|
|
edd9c0553a | ||
|
|
1c71fbe0f0 | ||
|
|
7091f6640b | ||
|
|
b533523258 | ||
|
|
18a5ba4ad7 | ||
|
|
dbcc8138d1 | ||
|
|
ef4ead5c9f | ||
|
|
8726b745e6 | ||
|
|
392cfb3c6c | ||
|
|
d8fb8e6cfc | ||
|
|
d41f8bfb9d | ||
|
|
74ad6012ca | ||
|
|
6bb43a6561 | ||
|
|
ff6880f9dd | ||
|
|
d1ab0f03bc | ||
|
|
812ae4140a | ||
|
|
e43bf5dabd | ||
|
|
22dc45738d | ||
|
|
a499435351 | ||
|
|
5b2da98ca3 | ||
|
|
b3bd33adfb | ||
|
|
72b2f3fc2f | ||
|
|
2caa80f751 | ||
|
|
02f39ab1ee | ||
|
|
5d74b679e6 | ||
|
|
efd6e29b52 | ||
|
|
bcaccf8c58 | ||
|
|
f735705403 | ||
|
|
732e073261 | ||
|
|
01d023ad3b | ||
|
|
5dfd5e58ee | ||
|
|
bfba90f864 | ||
|
|
155a9d784c | ||
|
|
4c0671f65a | ||
|
|
4e8f3f7a99 | ||
|
|
507de921c2 | ||
|
|
b884195400 | ||
|
|
9aeeb5acb9 | ||
|
|
b5674ea9fa | ||
|
|
dd927f0c47 | ||
|
|
a2b07adf43 | ||
|
|
fb892f4b20 | ||
|
|
e67c717c2f | ||
|
|
1791551391 | ||
|
|
3f7148c313 | ||
|
|
6d2a516224 | ||
|
|
c172f453fc | ||
|
|
dc400eff35 | ||
|
|
a15b4d6525 | ||
|
|
7e06aaa84b | ||
|
|
3a40a0f1e8 | ||
|
|
fe1079cfc6 | ||
|
|
10d81247f8 | ||
|
|
6e695ff838 | ||
|
|
06054d7a9d | ||
|
|
d5a798033a | ||
|
|
5e8238c75c | ||
|
|
545b6de900 | ||
|
|
aed11012d4 | ||
|
|
1b3e8a8af6 | ||
|
|
c8c040d057 | ||
|
|
c283a41248 | ||
|
|
f5d8ba5d7f | ||
|
|
dcfb2af871 | ||
|
|
6e6d94a2d1 | ||
|
|
6653ac6b36 | ||
|
|
f6d4200f86 | ||
|
|
0ea2152355 | ||
|
|
f2221e8b89 | ||
|
|
fc2b12acca | ||
|
|
2c22fe98dd | ||
|
|
c4d7c8dd42 | ||
|
|
7699a7dc06 | ||
|
|
fd55399167 | ||
|
|
67f92f16ed | ||
|
|
6d1fe626f5 | ||
|
|
336fcbc50e | ||
|
|
1071d51508 | ||
|
|
137adb3496 | ||
|
|
2614ed18f9 | ||
|
|
17025fa6ea | ||
|
|
8cd77b6f6e | ||
|
|
4aa17c5109 | ||
|
|
eb56e60e94 | ||
|
|
b518f1342c | ||
|
|
752382ecd8 | ||
|
|
883f9bec9b | ||
|
|
ce87b8fc63 | ||
|
|
4471f6bca8 | ||
|
|
96540079e7 | ||
|
|
f3be01c26f | ||
|
|
0a4fe02a47 | ||
|
|
160aa435da | ||
|
|
e888f9da9f | ||
|
|
f575f2c694 | ||
|
|
9f43908d08 | ||
|
|
0566b29ab7 | ||
|
|
03c94ae6a3 | ||
|
|
f7fdcc00e5 | ||
|
|
56e63338ed | ||
|
|
a2980378ff | ||
|
|
e6459a91dd | ||
|
|
941f51f0e5 | ||
|
|
75e20fd02b | ||
|
|
03736af2ae | ||
|
|
cd55253865 | ||
|
|
2e368bfb9f | ||
|
|
b998cbdff1 | ||
|
|
cfccaff645 | ||
|
|
b65ece1ea9 | ||
|
|
55cff8407f | ||
|
|
33ff55a8f1 | ||
|
|
4c9bea2a71 | ||
|
|
69e07c3e00 | ||
|
|
e087503fd6 | ||
|
|
f7352871fa | ||
|
|
348ef7f12c | ||
|
|
c83db1395b | ||
|
|
37605108e1 | ||
|
|
82e6001451 | ||
|
|
c417efc962 | ||
|
|
a9b8b22daf | ||
|
|
d7b62da87b | ||
|
|
0885a2370a | ||
|
|
35cee8315a | ||
|
|
b985c4c0f8 | ||
|
|
438495b433 | ||
|
|
fa3d470a05 | ||
|
|
97ff26c3da | ||
|
|
2c171f2f29 | ||
|
|
a443375d44 | ||
|
|
1efd1ffa82 | ||
|
|
dc930b6689 | ||
|
|
69a62452be | ||
|
|
79a1e6450b | ||
|
|
c27a026d17 | ||
|
|
3e367cd087 | ||
|
|
28c98de6d9 | ||
|
|
c312f04364 | ||
|
|
40c3cd46f1 | ||
|
|
3252d41dcc | ||
|
|
d1c17394ec | ||
|
|
9044138097 | ||
|
|
1f9fbf5287 | ||
|
|
3439769fef | ||
|
|
cfc366847e | ||
|
|
d365156633 | ||
|
|
f883454db2 | ||
|
|
8e37534093 | ||
|
|
bfe8dd7faa | ||
|
|
73858a75b3 | ||
|
|
c094371963 | ||
|
|
c4fa82adba | ||
|
|
23054a3ab5 | ||
|
|
c6cf894017 | ||
|
|
6247bdbdb4 | ||
|
|
9db98f3b14 | ||
|
|
f64d50ec26 | ||
|
|
65cbf72e0f | ||
|
|
d33439721c | ||
|
|
2d550a7579 | ||
|
|
716014c410 | ||
|
|
f020e87a79 | ||
|
|
cb01e4b496 | ||
|
|
1f764f51f0 | ||
|
|
355790435e | ||
|
|
9b5ff794c7 | ||
|
|
6094275312 | ||
|
|
8a42aa78bd | ||
|
|
0826994821 | ||
|
|
59847550dc | ||
|
|
b37eedc29f | ||
|
|
50806b5b3c | ||
|
|
f2e94237fc | ||
|
|
b446780f01 | ||
|
|
4075b006a0 | ||
|
|
75866f38d9 | ||
|
|
efb2ddf62a | ||
|
|
232ef441eb | ||
|
|
e4416d6a0c | ||
|
|
1ba5d9ca6e | ||
|
|
c5b41287ed | ||
|
|
295c0b71ef | ||
|
|
66ee580206 | ||
|
|
a9dbfe98f9 | ||
|
|
1ffa7d4488 | ||
|
|
7e9aa98898 | ||
|
|
2f042ea198 | ||
|
|
b5a485825b | ||
|
|
7f80642aa7 | ||
|
|
72fc771039 | ||
|
|
2abe4ac280 | ||
|
|
9d877e888a | ||
|
|
962a7c3630 | ||
|
|
41e1e8a175 | ||
|
|
39252c6bd1 | ||
|
|
dee2f39f99 | ||
|
|
dda3709c7e | ||
|
|
e0529d4861 | ||
|
|
60335b7b79 | ||
|
|
de770d7563 | ||
|
|
a9af5f3c76 | ||
|
|
0b03516049 | ||
|
|
78eb17637b | ||
|
|
738fca37bf | ||
|
|
d39a50e76e | ||
|
|
4f40acded0 | ||
|
|
a023c9ae68 | ||
|
|
d49bd2997b | ||
|
|
0856668f44 | ||
|
|
aa3f776483 | ||
|
|
8259649381 | ||
|
|
d9b709ba45 | ||
|
|
6018a0190e | ||
|
|
adf1929f0a | ||
|
|
0ba2ed7676 | ||
|
|
7122602026 | ||
|
|
d07676e03f | ||
|
|
9047d86fa8 | ||
|
|
b5dad69c16 | ||
|
|
4d1fcb34d1 | ||
|
|
f10c54633b | ||
|
|
7e1c033c3f | ||
|
|
8d84e9382e | ||
|
|
378a622f00 | ||
|
|
f622d534b8 | ||
|
|
eff4bbeb53 | ||
|
|
13666b1520 | ||
|
|
d219fdb875 | ||
|
|
934c56cb42 | ||
|
|
d00dfaff4c | ||
|
|
adae8b161e | ||
|
|
224babe8c4 | ||
|
|
4b59344b0d | ||
|
|
030564cd97 | ||
|
|
98ff454cad | ||
|
|
139c3470f8 | ||
|
|
77347682db | ||
|
|
46605e554e | ||
|
|
b490d5ceab | ||
|
|
5add39d560 | ||
|
|
6853df46c7 | ||
|
|
d70ecf609c | ||
|
|
f3f4c562ff | ||
|
|
2e1936b11c | ||
|
|
0849fb8d36 | ||
|
|
89988c6163 | ||
|
|
a4f22a2de1 | ||
|
|
7251fbb514 | ||
|
|
461fc1e268 | ||
|
|
72639deb84 | ||
|
|
6e56b3abf8 | ||
|
|
38f265c083 | ||
|
|
e37e2d92a6 | ||
|
|
ce9019639d | ||
|
|
d9fc57ce92 | ||
|
|
1f75f81a41 | ||
|
|
bd17361817 | ||
|
|
c7a536a6d8 | ||
|
|
bcf1cb1f9c | ||
|
|
0656a8d40b | ||
|
|
bacad1478a | ||
|
|
ae28432e62 | ||
|
|
0e9dbe6bb6 | ||
|
|
16760cff8b | ||
|
|
2ec6136113 | ||
|
|
8c8207dcc8 | ||
|
|
bcac3d16b6 | ||
|
|
8aa27f09fe | ||
|
|
8f08b79323 | ||
|
|
8e4c70c919 | ||
|
|
b65c34cdb8 | ||
|
|
e84cf93c98 | ||
|
|
4512a4f225 | ||
|
|
6bc5d57fdd | ||
|
|
468d232ef4 | ||
|
|
d2b93c96e7 | ||
|
|
55dccee02f | ||
|
|
771511c60e | ||
|
|
3e532d9b07 | ||
|
|
403cf9246e | ||
|
|
43194537d4 | ||
|
|
a8d1ee4fcc | ||
|
|
be150d3ad0 | ||
|
|
c9bcc42aa6 | ||
|
|
1fc375d0f6 | ||
|
|
59753be4ca | ||
|
|
0c42bc863b | ||
|
|
9f9cad1ac9 | ||
|
|
4563c50c91 | ||
|
|
7284d716bc | ||
|
|
a97387011d | ||
|
|
053770d4a6 | ||
|
|
fe31aa28c4 | ||
|
|
2a89d0d13d | ||
|
|
e83cab150b | ||
|
|
d3ec3e34b8 | ||
|
|
6dc5ee80ae | ||
|
|
b11b0bb0e2 | ||
|
|
d17ec934f5 | ||
|
|
0f0f027379 | ||
|
|
9215192d34 | ||
|
|
d5f0a383f6 | ||
|
|
b5a8022364 | ||
|
|
08ac76fa26 | ||
|
|
b560807a5d | ||
|
|
485bf7bede | ||
|
|
ae5cd67bea | ||
|
|
e4b8d41e76 | ||
|
|
245baf820e | ||
|
|
54aa43c81b | ||
|
|
5192155253 | ||
|
|
483d878d5f | ||
|
|
93a135bc6a | ||
|
|
ddd316d2a0 | ||
|
|
38b47b89c1 | ||
|
|
dd326ec4bc | ||
|
|
dfb1a80129 | ||
|
|
d6aef6491b | ||
|
|
e6e6d4b564 | ||
|
|
693b31b1bf | ||
|
|
bfbf74fe7d | ||
|
|
3181544729 | ||
|
|
8c01dc3045 | ||
|
|
1b581eeff3 | ||
|
|
e07e246532 | ||
|
|
f9819c6645 | ||
|
|
9f6ab0541e | ||
|
|
9527bad3a7 | ||
|
|
fcbe53d204 | ||
|
|
5ce1971588 | ||
|
|
48e0d9901f | ||
|
|
4c9f65800b | ||
|
|
77b5e72541 | ||
|
|
0c904336c9 | ||
|
|
59a3bbcbe6 | ||
|
|
13bfb09cbb | ||
|
|
4d53128f0c | ||
|
|
99f99b04b6 | ||
|
|
a898afb1bd | ||
|
|
dd99390039 | ||
|
|
9a8ee66f84 | ||
|
|
cf773911b0 | ||
|
|
4dfe9379a0 | ||
|
|
cdb61828d3 | ||
|
|
990c9f8a7f | ||
|
|
3202b09b12 | ||
|
|
cc364d23a4 | ||
|
|
472855140d | ||
|
|
36181b3fb2 | ||
|
|
1792c186c7 | ||
|
|
902e2e4f66 | ||
|
|
ab2ce64b6b | ||
|
|
25203976f0 | ||
|
|
f645c15586 | ||
|
|
cd867eb573 | ||
|
|
8361625ad6 | ||
|
|
1ebff8df41 | ||
|
|
e85a56dd21 | ||
|
|
1cbc1b2be3 | ||
|
|
eb56e5c0b1 | ||
|
|
05aaf18d38 | ||
|
|
1d11291071 | ||
|
|
6821f5cd22 | ||
|
|
c8cb096533 | ||
|
|
03b6ad9383 | ||
|
|
17dcc7a899 | ||
|
|
c6a73ed0d5 | ||
|
|
667a45f5c7 | ||
|
|
a5d771fd3b | ||
|
|
bd4d5c26d8 | ||
|
|
2ab7c82b31 | ||
|
|
ad48f766f7 | ||
|
|
503c436cb2 | ||
|
|
a9b1a36656 | ||
|
|
6c2e201133 | ||
|
|
0ead281439 | ||
|
|
6aa2b757aa | ||
|
|
73706925d1 | ||
|
|
8e170df609 | ||
|
|
91d1e9a5bb | ||
|
|
ec946be639 | ||
|
|
08a8c3a773 | ||
|
|
8d004f3c63 | ||
|
|
22632d5e9a | ||
|
|
e0cf1e3e94 | ||
|
|
c1dd0107c7 | ||
|
|
3d3ab26ee6 | ||
|
|
4843bad1ac | ||
|
|
95b2f4ba95 | ||
|
|
ffbc72ceef | ||
|
|
89b2af71b4 | ||
|
|
6baa5a8633 | ||
|
|
2ef319d0fe | ||
|
|
61b3378895 | ||
|
|
6f88071942 | ||
|
|
2e1ad8fd06 | ||
|
|
d56b5783d1 | ||
|
|
62670b48b9 | ||
|
|
b0d21d2fad | ||
|
|
a6244ed0dc | ||
|
|
66d14c50f1 | ||
|
|
854b3921a4 | ||
|
|
681fd36d60 | ||
|
|
dd01503e91 | ||
|
|
37d41d4448 | ||
|
|
ee25344a6d | ||
|
|
06686c237c | ||
|
|
ad5a009cb4 | ||
|
|
7405c9c417 | ||
|
|
d496845820 | ||
|
|
0fd41221c3 | ||
|
|
ca10522e8d | ||
|
|
ef394916c9 | ||
|
|
9208059e3e | ||
|
|
90b539818f | ||
|
|
526c4e8af0 | ||
|
|
b3115c4b98 | ||
|
|
abdeb78726 | ||
|
|
7295ba4bae | ||
|
|
149672fedb | ||
|
|
27c319c34b | ||
|
|
0c332103a1 | ||
|
|
207c0c815c | ||
|
|
bca5ba1d26 | ||
|
|
36766befb2 | ||
|
|
5353a3cab5 | ||
|
|
8d8067d381 | ||
|
|
0cf4b70d50 | ||
|
|
03046f614f | ||
|
|
db709aff32 | ||
|
|
7e57e8692a | ||
|
|
f6b3e0d199 | ||
|
|
ccff38a0f9 | ||
|
|
ed3c734d0a | ||
|
|
4c79a06567 | ||
|
|
86b013f872 | ||
|
|
573a63bfc4 | ||
|
|
2eb9795a98 | ||
|
|
c0e209162a | ||
|
|
4bd09effe3 | ||
|
|
6eb6ac941e | ||
|
|
d58eee1e79 | ||
|
|
31eb896143 | ||
|
|
5e8a32e279 | ||
|
|
8ec00c4cc9 | ||
|
|
0e9422c43a | ||
|
|
4186f5f98a | ||
|
|
c3ca57c42b | ||
|
|
be0b94400d | ||
|
|
f7c9620271 | ||
|
|
625ec041b9 | ||
|
|
fde15bf393 | ||
|
|
65f51240cd | ||
|
|
e240f660f0 | ||
|
|
b71b4015a2 | ||
|
|
056f779334 | ||
|
|
198de5397e | ||
|
|
88fff21b93 | ||
|
|
6207a6017f | ||
|
|
b921c17ffb | ||
|
|
3246412f77 | ||
|
|
543540def8 | ||
|
|
e9ac7a40df | ||
|
|
877c7f3a99 | ||
|
|
1f3227eb69 | ||
|
|
f9df5f65c7 | ||
|
|
09bdd4c773 | ||
|
|
41c8df35db | ||
|
|
5eca828aa4 | ||
|
|
d45bd299d5 | ||
|
|
87d5f47050 | ||
|
|
228e26f930 | ||
|
|
95d3d6fdef | ||
|
|
8dc553a039 | ||
|
|
66a37e28a6 | ||
|
|
9ad9d72c4a | ||
|
|
ec91dc5ffc | ||
|
|
5187c2b721 | ||
|
|
01100053ff | ||
|
|
a8c88f43b6 | ||
|
|
a0be398da9 | ||
|
|
00b3ff80bb | ||
|
|
c796801c4d | ||
|
|
806e5f33d4 | ||
|
|
8bce6453d3 | ||
|
|
5e8151e245 | ||
|
|
522e5ec86b | ||
|
|
b8f6b300d6 | ||
|
|
e1617a3d10 | ||
|
|
de3b05388d | ||
|
|
5a34b744b1 | ||
|
|
9522dbb1a9 | ||
|
|
d3a7a5fce0 | ||
|
|
f57fbe02c8 | ||
|
|
a34c41efbb | ||
|
|
0332c7e6b3 | ||
|
|
f8f14c2dde | ||
|
|
d8594af92b | ||
|
|
d50e2e80a2 | ||
|
|
c685ab6ee8 | ||
|
|
e8529ae35f | ||
|
|
6701d06235 | ||
|
|
847505c19f | ||
|
|
db09f67674 | ||
|
|
c94a2d5289 | ||
|
|
66496c47a3 | ||
|
|
b0ae9fdbcb | ||
|
|
d351f3dae5 | ||
|
|
48a6e31f36 | ||
|
|
c6ed8c01b3 | ||
|
|
1ba36d07cf | ||
|
|
fd6f92a4e8 | ||
|
|
c11d80148f | ||
|
|
ce5c936b07 | ||
|
|
58d474797e | ||
|
|
5457f9562f | ||
|
|
be024e5c3e | ||
|
|
c9733ad3b8 | ||
|
|
b5daddbeb6 | ||
|
|
c1d2e3c1d0 | ||
|
|
749041427b | ||
|
|
bb12a493db | ||
|
|
0db235aa1d | ||
|
|
2dd71035d0 | ||
|
|
fc213a6dae | ||
|
|
1d58838a97 | ||
|
|
34a11d4b8d | ||
|
|
d20a28cfb5 | ||
|
|
c8400c5fd9 | ||
|
|
6922aec022 | ||
|
|
a961276b6f | ||
|
|
640ff642ae | ||
|
|
5bfed864a0 | ||
|
|
334c0e897c | ||
|
|
b2f568f0a6 | ||
|
|
e4872254ad | ||
|
|
74895f603f | ||
|
|
6334e13d12 | ||
|
|
22707c26f5 | ||
|
|
3c617848ac | ||
|
|
73f9bf3968 | ||
|
|
88224d001d | ||
|
|
8c585e5ad6 | ||
|
|
b5981bca90 | ||
|
|
9b5655f7ea | ||
|
|
11f21917d6 | ||
|
|
477a09d13e | ||
|
|
3e7642abe5 | ||
|
|
16e913505e | ||
|
|
bd4f090730 | ||
|
|
a9165d3f32 | ||
|
|
fb63991851 | ||
|
|
cf0aeaf2c7 | ||
|
|
eac39752de | ||
|
|
120b56cbe1 | ||
|
|
87f86d3d2c | ||
|
|
84a8f62834 | ||
|
|
e1fda49027 | ||
|
|
599f89e641 | ||
|
|
ec73ad1145 | ||
|
|
fdd05988b7 | ||
|
|
d84e94025f | ||
|
|
353fd97de6 | ||
|
|
39912b7bde | ||
|
|
b1fd2913d2 | ||
|
|
16b310d8ce | ||
|
|
789c95d4b8 | ||
|
|
e2ad59fbe1 | ||
|
|
cc1e4ca5ad | ||
|
|
0d03c1ff85 | ||
|
|
dbcc6bdcb4 | ||
|
|
b926277caf | ||
|
|
41e5c839e0 | ||
|
|
cd50c86294 | ||
|
|
fa51dee557 | ||
|
|
5e59c5cd7f | ||
|
|
6baef585cf | ||
|
|
aa0ce945c4 | ||
|
|
e0f0eb2681 | ||
|
|
f0559db37c | ||
|
|
971b3b5fa5 | ||
|
|
00af887048 | ||
|
|
34969178db | ||
|
|
6d9a0ff723 | ||
|
|
c841a78f69 | ||
|
|
0f0e7e43cf | ||
|
|
cb43494488 | ||
|
|
48c44a8d21 | ||
|
|
b3c84fcbbd | ||
|
|
6f4d2160c2 | ||
|
|
73d926c8d4 | ||
|
|
27ffb03383 | ||
|
|
1b0d3e3034 | ||
|
|
c8ec47130d | ||
|
|
7dd0254b8e | ||
|
|
3c6f458ecf | ||
|
|
27d9808f45 | ||
|
|
ac284757d8 | ||
|
|
a355e123fc | ||
|
|
8d56856791 | ||
|
|
eeb781b429 | ||
|
|
90e64ebdf2 | ||
|
|
09d14a5733 | ||
|
|
6d5f864e25 | ||
|
|
25edf6edb8 | ||
|
|
3f267db3a6 | ||
|
|
6c8a16f36e | ||
|
|
f6d0bf6109 | ||
|
|
a34dabce9c | ||
|
|
a4b02d0a5d | ||
|
|
a2b2bc3620 | ||
|
|
8b65e041eb | ||
|
|
37e321044a | ||
|
|
0daf350922 | ||
|
|
e44a923a71 | ||
|
|
6a70abbd99 | ||
|
|
ed56585388 | ||
|
|
f3e295b4ec | ||
|
|
181de38ae3 | ||
|
|
6f9668330e | ||
|
|
32ab630bda | ||
|
|
f1c59a3159 | ||
|
|
708d5b6712 | ||
|
|
ef8ee48044 | ||
|
|
aa47d6c7f2 | ||
|
|
af6a33bd1c | ||
|
|
4e5da5760a | ||
|
|
bb8506032e | ||
|
|
d3c6130f3f | ||
|
|
9311f13a2f | ||
|
|
25987e2e8b | ||
|
|
a777fe1b3c | ||
|
|
6e9241e486 | ||
|
|
cb1aff2a33 | ||
|
|
b6fcfc375a | ||
|
|
02718e5252 | ||
|
|
54e36c4ff8 | ||
|
|
bf86748300 | ||
|
|
afdaddd392 | ||
|
|
d7d89bc806 | ||
|
|
c425368a17 | ||
|
|
585563e620 | ||
|
|
0d74c074dd | ||
|
|
2911732841 | ||
|
|
a01948dbf3 | ||
|
|
c876d18320 | ||
|
|
f607538882 | ||
|
|
1e817ae241 | ||
|
|
b57bef91a1 | ||
|
|
fd2900f863 | ||
|
|
e86a13818e | ||
|
|
25809a49b9 | ||
|
|
454421ef54 | ||
|
|
946749fb01 | ||
|
|
1e8e911577 | ||
|
|
af96d2733f | ||
|
|
70ad670125 | ||
|
|
e51018cbf3 | ||
|
|
b9828a8b59 | ||
|
|
c0efbed55a | ||
|
|
de4b459413 | ||
|
|
7e438d27f1 | ||
|
|
4bbea6ee63 | ||
|
|
ff8cad9316 | ||
|
|
e6292c55cf | ||
|
|
f8b62a3c7a | ||
|
|
1adb9a5c85 | ||
|
|
f2f939906e | ||
|
|
113746b3a6 | ||
|
|
180e4e4c66 | ||
|
|
6db0753a46 | ||
|
|
927734e6ce | ||
|
|
c8ce0faca4 | ||
|
|
02d9ecde6d | ||
|
|
357843378f | ||
|
|
1cf1d330f4 | ||
|
|
8254b5a7e6 | ||
|
|
8d423137fd | ||
|
|
77ff4c9155 | ||
|
|
a0b258ef12 | ||
|
|
c08d0a022f | ||
|
|
e40ad1c996 | ||
|
|
fc414bdb63 | ||
|
|
bf3505ca1b | ||
|
|
0643a69764 | ||
|
|
2007f7affd | ||
|
|
ee03cda858 | ||
|
|
ad9d1ca639 | ||
|
|
a40873334f | ||
|
|
64d1fb3502 | ||
|
|
a1f2ad880d | ||
|
|
1a11a99a24 | ||
|
|
49fdf6dd26 | ||
|
|
161b6c348b | ||
|
|
2c956cac80 | ||
|
|
4e3b95067b | ||
|
|
a39bed9ae6 | ||
|
|
620a96f77f | ||
|
|
4725f8c0a2 | ||
|
|
1f0593e7ca | ||
|
|
c7ae0b4db6 | ||
|
|
ac2a58e252 | ||
|
|
2d5e90a307 | ||
|
|
5f1347c0d4 | ||
|
|
c9ad61651b | ||
|
|
bf6434abaf | ||
|
|
19923e81f9 | ||
|
|
b65c2def5c | ||
|
|
102f2d548f | ||
|
|
df01eec035 | ||
|
|
136c24660c | ||
|
|
8ec9574819 | ||
|
|
0254433a41 | ||
|
|
3e34b0b1c1 | ||
|
|
f2549ca92e | ||
|
|
22637f139f | ||
|
|
e6a828def1 | ||
|
|
26df0fb593 | ||
|
|
f25144bdc0 | ||
|
|
b93594cfe1 | ||
|
|
04cccbb094 | ||
|
|
1c117c9e29 | ||
|
|
81d930dcfb | ||
|
|
778c903c81 | ||
|
|
89daed858b | ||
|
|
0559f65825 | ||
|
|
7893ef7b1c | ||
|
|
974a08bf60 | ||
|
|
031f6ee611 | ||
|
|
b4e1361302 | ||
|
|
058017e178 | ||
|
|
dac51654fe | ||
|
|
df54f25efe | ||
|
|
3d381403a8 | ||
|
|
e3c665a3cb | ||
|
|
d7cae0ab96 | ||
|
|
27cf8de733 | ||
|
|
7aeb89c984 | ||
|
|
46b08db917 | ||
|
|
74785478ec | ||
|
|
2015e32361 | ||
|
|
4db85fcc4d | ||
|
|
37a4acc7e0 | ||
|
|
0aecd1fa7b | ||
|
|
525dbac22f | ||
|
|
d3f5e453ca | ||
|
|
5aeae7ca49 | ||
|
|
36d7f10911 | ||
|
|
a5cb454e94 |
+1
-6
@@ -10,13 +10,9 @@
|
||||
#
|
||||
|
||||
# The revision is needed for the bundle name and creating an OSX application bundle.
|
||||
ifdef REVISION
|
||||
REV := $(REVISION)
|
||||
else
|
||||
# Detect the revision
|
||||
VERSIONS := $(shell AWK="$(AWK)" "$(ROOT_DIR)/findversion.sh")
|
||||
REV := $(shell echo "$(VERSIONS)" | cut -f 1 -d' ')
|
||||
endif
|
||||
|
||||
# Make sure we have something in REV
|
||||
ifeq ($(REV),)
|
||||
@@ -73,7 +69,6 @@ endif
|
||||
$(Q)cp "$(ROOT_DIR)/COPYING" "$(BUNDLE_DIR)/"
|
||||
$(Q)cp "$(ROOT_DIR)/known-bugs.txt" "$(BUNDLE_DIR)/"
|
||||
$(Q)cp "$(ROOT_DIR)/docs/multiplayer.txt" "$(BUNDLE_DIR)/docs/"
|
||||
$(Q)cp "$(ROOT_DIR)/docs/32bpp.txt" "$(BUNDLE_DIR)/docs/"
|
||||
$(Q)cp "$(ROOT_DIR)/changelog.txt" "$(BUNDLE_DIR)/"
|
||||
ifdef MAN_DIR
|
||||
$(Q)mkdir -p "$(BUNDLE_DIR)/man/"
|
||||
@@ -85,7 +80,7 @@ endif
|
||||
$(Q)cp "$(BIN_DIR)/scripts/"* "$(BUNDLE_DIR)/scripts/"
|
||||
ifdef MENU_DIR
|
||||
$(Q)cp "$(ROOT_DIR)/media/openttd.desktop" "$(BUNDLE_DIR)/media/"
|
||||
$(Q)$(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.translation.awk" "$(SRC_DIR)/lang/"*.txt | $(SORT) >> "$(BUNDLE_DIR)/media/openttd.desktop"
|
||||
$(Q)$(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.translation.awk" "$(SRC_DIR)/lang/"*.txt | $(SORT) | $(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.filter.awk" >> "$(BUNDLE_DIR)/media/openttd.desktop"
|
||||
$(Q)sed s/=openttd/=$(BINARY_NAME)/g "$(BUNDLE_DIR)/media/openttd.desktop" > "$(ROOT_DIR)/media/openttd.desktop.install"
|
||||
endif
|
||||
ifeq ($(TTD), openttd.exe)
|
||||
|
||||
@@ -41,7 +41,6 @@ TTDS = $(SRC_DIRS:%=%/$(TTD))
|
||||
OS = !!OS!!
|
||||
OSXAPP = !!OSXAPP!!
|
||||
LIPO = !!LIPO!!
|
||||
REVISION = !!REVISION!!
|
||||
AWK = !!AWK!!
|
||||
SORT = !!SORT!!
|
||||
DISTCC = !!DISTCC!!
|
||||
|
||||
+8
-7
@@ -14,6 +14,7 @@ LANGS_SRC = $(shell ls $(LANG_DIR)/*.txt)
|
||||
LANGS = $(LANGS_SRC:$(LANG_DIR)/%.txt=%.lng)
|
||||
CXX_BUILD = !!CXX_BUILD!!
|
||||
CFLAGS_BUILD = !!CFLAGS_BUILD!!
|
||||
CXXFLAGS_BUILD= !!CXXFLAGS_BUILD!!
|
||||
LDFLAGS_BUILD = !!LDFLAGS_BUILD!!
|
||||
STRGEN_FLAGS = !!STRGEN_FLAGS!!
|
||||
STAGE = !!STAGE!!
|
||||
@@ -44,23 +45,23 @@ all: table/strings.h $(LANGS)
|
||||
|
||||
strgen_base.o: $(SRC_DIR)/strgen/strgen_base.cpp $(SRC_DIR)/strgen/strgen.h endian_host.h $(SRC_DIR)/table/control_codes.h $(SRC_DIR)/table/strgen_tables.h
|
||||
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $<
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $<
|
||||
|
||||
strgen.o: $(SRC_DIR)/strgen/strgen.cpp $(SRC_DIR)/strgen/strgen.h endian_host.h $(SRC_DIR)/table/control_codes.h $(SRC_DIR)/table/strgen_tables.h
|
||||
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $<
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $<
|
||||
|
||||
string.o: $(SRC_DIR)/string.cpp endian_host.h
|
||||
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $<
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $<
|
||||
|
||||
alloc_func.o: $(SRC_DIR)/core/alloc_func.cpp endian_host.h
|
||||
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $<
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $<
|
||||
|
||||
getoptdata.o: $(SRC_DIR)/misc/getoptdata.cpp $(SRC_DIR)/misc/getoptdata.h
|
||||
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/misc/%.cpp=%.cpp)'
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $<
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $<
|
||||
|
||||
lang/english.txt: $(LANG_DIR)/english.txt
|
||||
$(Q)mkdir -p lang
|
||||
@@ -68,7 +69,7 @@ lang/english.txt: $(LANG_DIR)/english.txt
|
||||
|
||||
$(STRGEN): alloc_func.o string.o strgen_base.o strgen.o getoptdata.o
|
||||
$(E) '$(STAGE) Compiling and Linking $@'
|
||||
$(Q)$(CXX_BUILD) $(LDFLAGS_BUILD) $^ -o $@
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) $^ -o $@
|
||||
|
||||
table/strings.h: lang/english.txt $(STRGEN)
|
||||
$(E) '$(STAGE) Generating $@'
|
||||
@@ -87,7 +88,7 @@ endian_host.h: $(ENDIAN_CHECK)
|
||||
|
||||
$(ENDIAN_CHECK): $(SRC_DIR)/endian_check.cpp
|
||||
$(E) '$(STAGE) Compiling and Linking $@'
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $< -o $@
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) $< -o $@
|
||||
|
||||
depend:
|
||||
|
||||
|
||||
+8
-7
@@ -10,6 +10,7 @@ ENDIAN_CHECK = !!ENDIAN_CHECK!!
|
||||
SRC_DIR = !!SRC_DIR!!
|
||||
CXX_BUILD = !!CXX_BUILD!!
|
||||
CFLAGS_BUILD = !!CFLAGS_BUILD!!
|
||||
CXXFLAGS_BUILD = !!CXXFLAGS_BUILD!!
|
||||
LDFLAGS_BUILD = !!LDFLAGS_BUILD!!
|
||||
STAGE = !!STAGE!!
|
||||
SETTING_OBJS_DIR = !!SETTING_OBJS_DIR!!
|
||||
@@ -29,27 +30,27 @@ all: table/settings.h
|
||||
|
||||
settingsgen.o: $(SRC_DIR)/settingsgen/settingsgen.cpp $(SRC_DIR)/string_func.h $(SRC_DIR)/strings_type.h $(SRC_DIR)/misc/getoptdata.h $(SRC_DIR)/ini_type.h $(SRC_DIR)/core/smallvec_type.hpp
|
||||
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
|
||||
|
||||
alloc_func.o: $(SRC_DIR)/core/alloc_func.cpp endian_host.h
|
||||
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
|
||||
|
||||
getoptdata.o: $(SRC_DIR)/misc/getoptdata.cpp $(SRC_DIR)/misc/getoptdata.h
|
||||
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/misc/%.cpp=%.cpp)'
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
|
||||
|
||||
string.o: $(SRC_DIR)/string.cpp endian_host.h
|
||||
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
|
||||
|
||||
ini_load.o: $(SRC_DIR)/ini_load.cpp $(SRC_DIR)/core/alloc_func.hpp $(SRC_DIR)/core/mem_func.hpp $(SRC_DIR)/ini_type.h $(SRC_DIR)/string_func.h
|
||||
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
|
||||
|
||||
$(SETTINGSGEN): alloc_func.o string.o ini_load.o settingsgen.o getoptdata.o
|
||||
$(E) '$(STAGE) Compiling and Linking $@'
|
||||
$(Q)$(CXX_BUILD) $(LDFLAGS_BUILD) $^ -o $@
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) $^ -o $@
|
||||
|
||||
table/settings.h: $(SETTINGSGEN) $(SRC_DIR)/table/settings.h.preamble $(SRC_DIR)/table/settings.h.postamble $(SRC_DIR)/table/*.ini
|
||||
$(E) '$(STAGE) Generating $@'
|
||||
@@ -64,7 +65,7 @@ endian_host.h: $(ENDIAN_CHECK)
|
||||
|
||||
$(ENDIAN_CHECK): $(SRC_DIR)/endian_check.cpp
|
||||
$(E) '$(STAGE) Compiling and Linking $@'
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $< -o $@
|
||||
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) $< -o $@
|
||||
|
||||
depend:
|
||||
|
||||
|
||||
@@ -6,3 +6,5 @@
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
AILog.Info("1.2 API compatability in effect.");
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
/* $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/>.
|
||||
*/
|
||||
+143
-146
@@ -88,9 +88,9 @@
|
||||
abs( 21): 21
|
||||
|
||||
--AIBase--
|
||||
Rand(): 1259692483
|
||||
Rand(): -1289244298
|
||||
Rand(): -1572996668
|
||||
Rand(): -54346916
|
||||
Rand(): -937374575
|
||||
Rand(): 823953997
|
||||
RandRange(0): 0
|
||||
RandRange(0): 0
|
||||
RandRange(0): 0
|
||||
@@ -98,12 +98,12 @@
|
||||
RandRange(1): 0
|
||||
RandRange(1): 0
|
||||
RandRange(2): 1
|
||||
RandRange(2): 0
|
||||
RandRange(2): 1
|
||||
RandRange(1000000): 36500
|
||||
RandRange(1000000): 300101
|
||||
RandRange(1000000): 418369
|
||||
Chance(1, 2): true
|
||||
RandRange(2): 1
|
||||
RandRange(1000000): 966676
|
||||
RandRange(1000000): 289525
|
||||
RandRange(1000000): 170283
|
||||
Chance(1, 2): false
|
||||
Chance(1, 2): true
|
||||
Chance(1, 2): false
|
||||
|
||||
@@ -420,144 +420,144 @@
|
||||
1098 => 46116
|
||||
1099 => 46158
|
||||
Randomize ListDump:
|
||||
1 => 966621566
|
||||
2 => -606766557
|
||||
1000 => -1138727825
|
||||
1001 => -749544262
|
||||
1002 => 2004771271
|
||||
1003 => 686734186
|
||||
1004 => 923274744
|
||||
1005 => -1672035149
|
||||
1006 => -1642064950
|
||||
1007 => 1363389551
|
||||
1008 => -559500928
|
||||
1009 => 1656196991
|
||||
1010 => 1655354425
|
||||
1011 => -1027156689
|
||||
1012 => 1952644328
|
||||
1013 => 1217870217
|
||||
1014 => 242274100
|
||||
1015 => 201816080
|
||||
1016 => 2127464758
|
||||
1017 => 446043650
|
||||
1018 => -319728455
|
||||
1019 => 204701002
|
||||
1020 => -571265398
|
||||
1021 => -1422217131
|
||||
1022 => -391208397
|
||||
1023 => -1822628371
|
||||
1024 => -1499755350
|
||||
1025 => -1422137641
|
||||
1026 => 1621693134
|
||||
1027 => -1428728134
|
||||
1028 => -147587573
|
||||
1029 => 681719500
|
||||
1030 => 1172011190
|
||||
1031 => -1834344882
|
||||
1032 => 1157634586
|
||||
1033 => 1902133676
|
||||
1034 => -1967780161
|
||||
1035 => -1618025531
|
||||
1036 => -810220453
|
||||
1037 => 1582854921
|
||||
1038 => -410004643
|
||||
1039 => 1159917159
|
||||
1040 => -1377804984
|
||||
1041 => -738843914
|
||||
1042 => -1578756103
|
||||
1043 => -464090986
|
||||
1044 => 1711504679
|
||||
1045 => 545330655
|
||||
1046 => 379462570
|
||||
1047 => 514511099
|
||||
1048 => -1813251176
|
||||
1049 => 1424958266
|
||||
1051 => -825255131
|
||||
1052 => 539054595
|
||||
1053 => -1764192010
|
||||
1054 => -1243277769
|
||||
1055 => 2017874281
|
||||
1056 => -1972353607
|
||||
1057 => 1879761467
|
||||
1058 => 1638986560
|
||||
1059 => -1832287507
|
||||
1060 => -492411882
|
||||
1061 => 658940812
|
||||
1062 => -1044199400
|
||||
1063 => 1586504918
|
||||
1064 => -125492611
|
||||
1065 => -1562883174
|
||||
1066 => -1013778441
|
||||
1067 => 1560228607
|
||||
1068 => -550265689
|
||||
1069 => 524767105
|
||||
1070 => -713387661
|
||||
1071 => 1425927738
|
||||
1072 => 942653932
|
||||
1073 => 1233220698
|
||||
1074 => 1313602368
|
||||
1075 => -140318584
|
||||
1076 => 1199179892
|
||||
1077 => 91450916
|
||||
1078 => -1471626821
|
||||
1079 => -552692855
|
||||
1080 => -801295697
|
||||
1081 => 1307607393
|
||||
1082 => -2111765574
|
||||
1083 => 1773729008
|
||||
1084 => -81987003
|
||||
1085 => -1090790034
|
||||
1086 => -843700327
|
||||
1087 => -1306436740
|
||||
1088 => 735656985
|
||||
1089 => -1933491876
|
||||
1090 => 642759863
|
||||
1091 => 255293949
|
||||
1092 => -1052469001
|
||||
1093 => -1043605053
|
||||
1094 => -2080328201
|
||||
1095 => -1825196581
|
||||
1096 => -1789181164
|
||||
1097 => -1636072563
|
||||
1098 => -111321262
|
||||
1099 => 1979741000
|
||||
1 => -200078348
|
||||
2 => -29799264
|
||||
1000 => 1630721656
|
||||
1001 => 959306175
|
||||
1002 => 1527421791
|
||||
1003 => 1259692483
|
||||
1004 => -1289244298
|
||||
1005 => -1572996668
|
||||
1006 => -2069479746
|
||||
1007 => -1819131606
|
||||
1008 => -1007163964
|
||||
1009 => -1185394870
|
||||
1010 => -1471365065
|
||||
1011 => 364354366
|
||||
1012 => -1478084253
|
||||
1013 => 405281367
|
||||
1014 => -11170062
|
||||
1015 => 156767750
|
||||
1016 => 1288924796
|
||||
1017 => 1796884876
|
||||
1018 => -1947073702
|
||||
1019 => -1999614238
|
||||
1020 => -231292809
|
||||
1021 => 966621566
|
||||
1022 => -606766557
|
||||
1023 => -1138727825
|
||||
1024 => -749544262
|
||||
1025 => 2004771271
|
||||
1026 => 686734186
|
||||
1027 => 923274744
|
||||
1028 => -1672035149
|
||||
1029 => -1642064950
|
||||
1030 => 1363389551
|
||||
1031 => -559500928
|
||||
1032 => 1656196991
|
||||
1033 => 1655354425
|
||||
1034 => -1027156689
|
||||
1035 => 1952644328
|
||||
1036 => 1217870217
|
||||
1037 => 242274100
|
||||
1038 => 201816080
|
||||
1039 => 2127464758
|
||||
1040 => 446043650
|
||||
1041 => -319728455
|
||||
1042 => 204701002
|
||||
1043 => -571265398
|
||||
1044 => -1422217131
|
||||
1045 => -391208397
|
||||
1046 => -1822628371
|
||||
1047 => -1499755350
|
||||
1048 => -1422137641
|
||||
1049 => 1621693134
|
||||
1051 => -1428728134
|
||||
1052 => -147587573
|
||||
1053 => 681719500
|
||||
1054 => 1172011190
|
||||
1055 => -1834344882
|
||||
1056 => 1157634586
|
||||
1057 => 1902133676
|
||||
1058 => -1967780161
|
||||
1059 => -1618025531
|
||||
1060 => -810220453
|
||||
1061 => 1582854921
|
||||
1062 => -410004643
|
||||
1063 => 1159917159
|
||||
1064 => -1377804984
|
||||
1065 => -738843914
|
||||
1066 => -1578756103
|
||||
1067 => -464090986
|
||||
1068 => 1711504679
|
||||
1069 => 545330655
|
||||
1070 => 379462570
|
||||
1071 => 514511099
|
||||
1072 => -1813251176
|
||||
1073 => 1424958266
|
||||
1074 => -825255131
|
||||
1075 => 539054595
|
||||
1076 => -1764192010
|
||||
1077 => -1243277769
|
||||
1078 => 2017874281
|
||||
1079 => -1972353607
|
||||
1080 => 1879761467
|
||||
1081 => 1638986560
|
||||
1082 => -1832287507
|
||||
1083 => -492411882
|
||||
1084 => 658940812
|
||||
1085 => -1044199400
|
||||
1086 => 1586504918
|
||||
1087 => -125492611
|
||||
1088 => -1562883174
|
||||
1089 => -1013778441
|
||||
1090 => 1560228607
|
||||
1091 => -550265689
|
||||
1092 => 524767105
|
||||
1093 => -713387661
|
||||
1094 => 1425927738
|
||||
1095 => 942653932
|
||||
1096 => 1233220698
|
||||
1097 => 1313602368
|
||||
1098 => -140318584
|
||||
1099 => 1199179892
|
||||
KeepTop(10):
|
||||
1 => 966621566
|
||||
2 => -606766557
|
||||
1000 => -1138727825
|
||||
1001 => -749544262
|
||||
1002 => 2004771271
|
||||
1003 => 686734186
|
||||
1004 => 923274744
|
||||
1005 => -1672035149
|
||||
1006 => -1642064950
|
||||
1007 => 1363389551
|
||||
1 => -200078348
|
||||
2 => -29799264
|
||||
1000 => 1630721656
|
||||
1001 => 959306175
|
||||
1002 => 1527421791
|
||||
1003 => 1259692483
|
||||
1004 => -1289244298
|
||||
1005 => -1572996668
|
||||
1006 => -2069479746
|
||||
1007 => -1819131606
|
||||
KeepBottom(8):
|
||||
1000 => -1138727825
|
||||
1001 => -749544262
|
||||
1002 => 2004771271
|
||||
1003 => 686734186
|
||||
1004 => 923274744
|
||||
1005 => -1672035149
|
||||
1006 => -1642064950
|
||||
1007 => 1363389551
|
||||
1000 => 1630721656
|
||||
1001 => 959306175
|
||||
1002 => 1527421791
|
||||
1003 => 1259692483
|
||||
1004 => -1289244298
|
||||
1005 => -1572996668
|
||||
1006 => -2069479746
|
||||
1007 => -1819131606
|
||||
RemoveBottom(2):
|
||||
1000 => -1138727825
|
||||
1001 => -749544262
|
||||
1002 => 2004771271
|
||||
1003 => 686734186
|
||||
1004 => 923274744
|
||||
1005 => -1672035149
|
||||
1000 => 1630721656
|
||||
1001 => 959306175
|
||||
1002 => 1527421791
|
||||
1003 => 1259692483
|
||||
1004 => -1289244298
|
||||
1005 => -1572996668
|
||||
RemoveTop(2):
|
||||
1002 => 2004771271
|
||||
1003 => 686734186
|
||||
1004 => 923274744
|
||||
1005 => -1672035149
|
||||
1002 => 1527421791
|
||||
1003 => 1259692483
|
||||
1004 => -1289244298
|
||||
1005 => -1572996668
|
||||
RemoveList({1003, 1004}):
|
||||
1002 => 2004771271
|
||||
1005 => -1672035149
|
||||
1002 => 1527421791
|
||||
1005 => -1572996668
|
||||
KeepList({1003, 1004, 1005}):
|
||||
1005 => -1672035149
|
||||
1005 => -1572996668
|
||||
AddList({1005, 4000, 4001, 4002}):
|
||||
1005 => 1005
|
||||
4000 => 8000
|
||||
@@ -588,7 +588,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
|
||||
SetName(): false
|
||||
GetLastErrorString(): ERR_NAME_IS_NOT_UNIQUE
|
||||
GetName(): Regression
|
||||
GetPresidentName(): I. McAlpine
|
||||
GetPresidentName(): P. Sharkey
|
||||
SetPresidentName(): true
|
||||
GetPresidentName(): Regression AI
|
||||
GetBankBalance(): 100000
|
||||
@@ -7384,7 +7384,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
|
||||
HasRoadType(Road): true
|
||||
HasRoadType(Tram): false
|
||||
GetNeighbourRoadCount(): 2
|
||||
RemoveRoad(): true
|
||||
RemoveRoad(): false
|
||||
RemoveRoad(): true
|
||||
RemoveRoad(): false
|
||||
RemoveRoad(): true
|
||||
@@ -8951,7 +8951,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
|
||||
GetWagonEngineType(): 27
|
||||
GetWagonAge(): 1
|
||||
GetWagonEngineType(): 27
|
||||
GetWagonAge(): 1
|
||||
GetWagonAge(): 0
|
||||
GetWagonEngineType(): 65535
|
||||
GetWagonAge(): -1
|
||||
--Errors--
|
||||
@@ -9148,9 +9148,6 @@ ERROR: IsEnd() is invalid as Begin() is never called
|
||||
GetDestinationType(): 1
|
||||
GetDestinationIndex(): 7
|
||||
GetCargoType(): 0
|
||||
GetNextEvent: instance
|
||||
GetEventType: 6
|
||||
Unknown Event
|
||||
IsEventWaiting: false
|
||||
|
||||
--Math--
|
||||
|
||||
@@ -6,7 +6,7 @@ class Regression extends AIInfo {
|
||||
function GetShortName() { return "REGR"; }
|
||||
function GetDescription() { return "This runs regression-tests on all commands. On the same map the result should always be the same."; }
|
||||
function GetVersion() { return 1; }
|
||||
function GetAPIVersion() { return "1.2"; }
|
||||
function GetAPIVersion() { return "1.3"; }
|
||||
function GetDate() { return "2007-03-18"; }
|
||||
function CreateInstance() { return "Regression"; }
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -55,7 +55,7 @@ TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
|
||||
TRGC.GRF = ed446637e034104c5559b32c18afe78d
|
||||
TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
|
||||
TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6
|
||||
OPENTTD.GRF = 51f9d2b8a29a079e83486db13509336c
|
||||
OPENTTD.GRF = 891f2dc7c81346d8fd5fbf4cf42dc5bd
|
||||
|
||||
[origin]
|
||||
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
|
||||
|
||||
@@ -55,7 +55,7 @@ TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
|
||||
TRGC.GRF = ed446637e034104c5559b32c18afe78d
|
||||
TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
|
||||
TRGT.GRF = fcde1d7e8a74197d72a62695884b909e
|
||||
OPENTTD.GRF = 51f9d2b8a29a079e83486db13509336c
|
||||
OPENTTD.GRF = 891f2dc7c81346d8fd5fbf4cf42dc5bd
|
||||
|
||||
[origin]
|
||||
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
|
||||
|
||||
@@ -55,7 +55,7 @@ TRGIR.GRF = 0c2484ff6be49fc63a83be6ab5c38f32
|
||||
TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b
|
||||
TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1
|
||||
TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8
|
||||
OPENTTD.GRF = 51f9d2b8a29a079e83486db13509336c
|
||||
OPENTTD.GRF = 891f2dc7c81346d8fd5fbf4cf42dc5bd
|
||||
|
||||
[origin]
|
||||
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
/* $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/>.
|
||||
*/
|
||||
|
||||
GSLog.Info("1.2 API compatability in effect.");
|
||||
@@ -0,0 +1,8 @@
|
||||
/* $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/>.
|
||||
*/
|
||||
+280
@@ -1,3 +1,283 @@
|
||||
1.3.0-beta1 (2012-12-24)
|
||||
------------------------------------------------------------------------
|
||||
- Feature: Advanced settings to disable certain sound effects (r24846)
|
||||
- Feature: [NewGRF] Support oversized purchase list sprites [FS#5271] (r24839)
|
||||
- Feature: Improve pylon placement around station tiles that display neither pylons nor catenary (r24836)
|
||||
- Feature: When using a non-release version of OpenTTD and the basegraphics are missing some sprites, also suggest to use a non-release version of the basegraphics (r24821)
|
||||
- Feature: Consider engine preview windows always sticky, so non-shift mass-closure does not affect them [FS#2632] (r24809)
|
||||
- Feature: When share-cloning vehicles do not open the vehicle window of the new vehicle [FS#4458] (r24808)
|
||||
- Feature: Enable usage of 'companies' console command also in singleplayer [FS#2820] (r24807)
|
||||
- Feature: Ask for confirmation before creating giant screenshots [FS#3148] (r24806)
|
||||
- Feature: Separate subdirectory for screenshots (r24804)
|
||||
- Feature: Unify the difficulty settings window with the advanced settings window (r24791, r24792)
|
||||
- Feature: Various methods to open the OSK (r24785)
|
||||
- Feature: Add a string filter to the server list [FS#3852] (r24769)
|
||||
- Feature: Add industry type and cargo dropdown selection for easier navigating in the industry chain window (r24763)
|
||||
- Feature: Introduce GUI icons for deleting to the left/right (r24749)
|
||||
- Feature: Add clear button to all editboxes (r24748)
|
||||
- Feature: Reset the vehicle engine pool when starting a scenario (r24716)
|
||||
- Feature: Add basic/advanced/expert filters to the advanced settings GUI [FS#5355] (r24671)
|
||||
- Feature: Draw cargo labels in the station list black or white depending on the background colour [FS#5311] (r24668)
|
||||
- Feature: Do not display the preview window for disabled vehicle types (r24660)
|
||||
- Feature: Add new filter option to the advanced settings window to show only changed settings (r24647)
|
||||
- Feature: Add text filtering to advanced settings (r24632)
|
||||
- Feature: Add buttons to expand/collapse all to advanced settings GUI (r24631)
|
||||
- Feature: [GS] Allow GameScripts to construct and prospect industries without having a sponsor (r24623)
|
||||
- Feature: Pay interest also on a negative cash value (r24618)
|
||||
- Feature: Sort cargo filter by cargo name/label at the company stations window [FS#5311] (r24615)
|
||||
- Feature: More options for the auto-scroll setting (r24590)
|
||||
- Feature: Allow AI/GS script developers to break the execution of their scripts and pause the game using ScriptController::Break() (r24542, r24575)
|
||||
- Feature: Scripts can be suspended even if the game is still progressing, thus break-on-log now works also for Game Scripts (r24537)
|
||||
- Feature: Highlight industries on the smallmap when the mouse is over an entry in the legend (r24534)
|
||||
- Feature: [NewGRF] Allow resolving var 5F via vehicle var 61 (r24527)
|
||||
- Feature: [OSX] Additional high-resolution icons for the app bundle [FS#4539] (r24525)
|
||||
- Feature: Ctrl+Backspace/Delete to remove characters up to next word beginning in text edit boxes [FS#5203] (r24521)
|
||||
- Feature: Ctrl+Arrow keys to move entire words in text edit boxes [FS#5203] (r24520)
|
||||
- Feature: When using autorefit only load/refit vehicles if other wagons cannot already take all cargo without refitting [FS#5106] (r24497)
|
||||
- Feature: [GS] Useful behaviour for GSEngine::IsValidEngine and GSEngine::IsBuildable when outside GSCompanyMode scope (r24492)
|
||||
- Feature: Display GS dead state in AI debug window [FS#5230] (r24489)
|
||||
- Feature: Add buttons to view textfiles from the online content window [FS#5236] (r24488)
|
||||
- Feature: Make the pathfinder decide whether ships shall leave depots towards north or south [FS#5127] (r24481)
|
||||
- Feature: [GS] API compatibility scripts for Goal Scripts [FS#5219] (r24468)
|
||||
- Feature: Display in the advanced settings description a setting type which explains the scope of changes to a particular setting [FS#5244] (r24411)
|
||||
- Feature: [GS] Allow game scripts to monitor cargo pickups and deliveries done by companies (r24406)
|
||||
- Feature: [NewGRF] Allow vehicle variable 61 for callback 2D (recolour) and re-randomisation (r24371)
|
||||
- Feature: [NewGRF] Customisable signals for rail types (r24367)
|
||||
- Feature: Allow filtering for multiple words (separated by whitespace resp. quoted) in script breakpoints, the sign list, content and NewGRF-GUIs (r24337, r24342)
|
||||
- Feature: Add dropdowns to NewGRF configurations, if all values have labels (r24318)
|
||||
- Feature: Add dropdowns to AI configurations, if all values have labels (r24317)
|
||||
- Feature: Allow to select advanced settings with limited range with a dropdown list (r24316)
|
||||
- Feature: Display default values for advanced settings in the settings description (r24298)
|
||||
- Feature: News item for exclusive transport rights [FS#2688] (r24287)
|
||||
- Feature: [GS] Additional GSNews::NewsItem::NewsTypes (r24286)
|
||||
- Feature: [NewGRF] Variable with the current max speed for vehicles [FS#5052] (r24246)
|
||||
- Feature: Descriptions explaining the meaning of advanced settings (r24237)
|
||||
- Feature: Split the renew-months setting text in two string values (one before life time and one after) (r24210)
|
||||
- Feature: Show a hint in the supplies tab of station windows, if the station is affected by exclusive transport rights [FS#5178] (r24205)
|
||||
- Feature: [NewGRF] Callback to set industry production level on construction (r24186)
|
||||
- Feature: South Korean and South African currencies [FS#4907] (r24148)
|
||||
- Feature: Randomise count of passengers killed in a crash [FS#3576] (r24142)
|
||||
- Feature: Display rating in the town directory window (r24141)
|
||||
- Feature: Show group name in the replace vehicle window caption [FS#1117] (r24140)
|
||||
- Feature: Allow to create a new vehicle group by drag and drop (r24139)
|
||||
- Feature: Ctrl+Drag to add all vehicles with a shared order list to a group (r24138)
|
||||
- Feature: Draw indicator icon in the replace vehicle window for vehicles which have a replacement set (r24137)
|
||||
- Feature: Autoreplace vehicles only when they get old [FS#4465] (r24136)
|
||||
- Feature: Add configurable limits for tree planting, and remove tree drag size limit (r24134, r24135)
|
||||
- Feature: Lithuanian currency [FS#4984] (r24133)
|
||||
- Feature: Ctrl+Clicking to change colour of all colour schemes at once [FS#1952] (r24131)
|
||||
- Feature: Deselect 'remove' button when changing signal types in the GUI [FS#2314] (r24130)
|
||||
- Feature: Option to minimise signal distance when dragging over obstacles [FS#3660] (r24129)
|
||||
- Feature: Allow closing airports for incoming aircraft [FS#1497] (r24127)
|
||||
- Feature: Drag and drop support for the NewGRF list window [FS#3854] (r24126)
|
||||
- Feature: Drag destination highlighting to the group GUI [FS#3705] (r24125)
|
||||
- Feature: [NewGRF] Misc engine flag to disable breakdown smoke [FS#4658] (r24124)
|
||||
- Feature: Be more careful with the population of a small town while placing a statue (r24105)
|
||||
- Feature: Debug option for showing the redrawn dirty blocks/rectangles [FS#5101] (r24065)
|
||||
- Change: News display options are now shown in the advanced settings window (r24842, r24843, r24844, r24845)
|
||||
- Change: Drop 'signal density' from the advanced settings GUI. It is more suited to be only changed via the signal GUI (r24670)
|
||||
- Change: Check for bankruptcy on a monthly basis (r24619)
|
||||
- Change: Only bankrupt, if you have negative money considering you took max loan (r24617)
|
||||
- Change: When building long roads or tramways, only build the roadbits at the beginning and the end if they can connect to something [FS#5228] (r24503)
|
||||
- Change: Disallow original and better road layouts to build roads under bridges along the bridge direction [FS#5229] (r24391)
|
||||
- Change: Allow cloning of orders which are unreachable for the destination vehicle if they were already unreachable for the source vehicle [FS#5213] (r24390)
|
||||
- Change: Allow building/modifying/removing signals even if a train is on the belonging track (r24356)
|
||||
- Change: [NewGRF] Make bounding boxes of road vehicles change according to the vehicle length to make alignment easier [FS#5204] (r24331)
|
||||
- Fix: [NewGRF] Consider regearing-like cargos as no-cargo in cargo filters [FS#5386] (r24848)
|
||||
- Fix: [NewGRF] Draw NewGRF railtypes in NewGRF station previews (r24840)
|
||||
- Fix: Don't consider blocked rail station tiles that display wires as non-reachable for masking out unnecessary catenary wires (r24837)
|
||||
- Fix: The autorefit dropdown in the order GUI wasn't always updated when modifying vehicle consists [FS#5396] (r24834)
|
||||
- Fix: [NewGRF] Incorrect values are better than a crash when a NewGRF queries vehicle variable 4C before vehicle initialisation is completed [FS#5398] (r24831)
|
||||
- Fix: determineversion.vbs could hang in a git checkout (r24826)
|
||||
- Fix: Close pending preview windows when the engine is introduced to everyone (r24812)
|
||||
- Fix: Close engine preview window when another client accepts it (r24811)
|
||||
- Fix: Make engine preview offers more robust with regard to changes in the company ranking (r24810)
|
||||
- Fix: When displaying the previous news message, do not consider news which are turned off [FS#4224] (r24802)
|
||||
- Fix: Glitch in timetable GUI [FS#5327] (r24800)
|
||||
- Fix: Unify checks for editability of settings (r24787)
|
||||
- Fix: Invert the focus handling of the OSK. Keep the focus at the OSK and close it on losing focus (r24774)
|
||||
- Fix: Shift in the OSK behaved like capslock (r24773)
|
||||
- Fix: [Win32] Do not crash when switching to an unsupported fullscreen display mode (like 8bpp modes in Windows 8) [FS#5359] (r24762)
|
||||
- Fix: Crash on corrupted savegame [FS#5367] (r24754)
|
||||
- Fix: Some editboxes had a different colour than the rest of the window (r24747)
|
||||
- Fix: In various windows the OSK looked shiny but using it had no effect whatsoever (r24727)
|
||||
- Fix: AI debug GUI crashed when using disabled buttons via hotkeys (r24723)
|
||||
- Fix: When starting a scenario apply the local company settings to the new company [FS#5139] (r24717)
|
||||
- Fix: [NewGRF] Allow stations to draw snow/desert aware ground sprites with railtype overlays [FS#5335] (r24715)
|
||||
- Fix: [NewGRF] Draw default foundations if resolving of custom station foundation sprites fails [FS#5337] (r24714)
|
||||
- Fix: [NewGRF] Tolerate old NewGRFs returning invalid values via CB 11 [FS#5262] (r24713)
|
||||
- Fix: [NewGRF] Station variables 61 and 62 returned incorrect values, if no vehicle ever tried loading [FS#5303] (r24712)
|
||||
- Fix: Check whether to not display a ^ loading indicator at drop stations only worked if there was no other vehicle unloading for 255 ticks (r24711)
|
||||
- Fix: [NewGRF] Station var 48 should report acceptance, not supply (r24706)
|
||||
- Fix: Station rating might consider very old vehicles very young (r24705)
|
||||
- Fix: Disallow closing oilrig airports in the scenario editor (r24703)
|
||||
- Fix: Workaround for an overoptimisation done by GCC 4.5 [FS#5246] (r24701)
|
||||
- Fix: Get packing right on MinGW GCC 4.7 (r24573)
|
||||
- Fix: Make sure all template functions are instantiated by at least one compilation unit [FS#5276] (r24496)
|
||||
- Fix: Do not load order backups when loading a server-saved game in single player (r24445)
|
||||
- Fix: Allow overbuilding bridges with the same type when adding a roadtype [FS#5221] (r24413)
|
||||
- Fix: Cargo lists cannot have genders (mostly because it is very unclear what gender it would have) (r24374)
|
||||
- Fix: Off by one errors with regard to clicking on setting buttons (r24313)
|
||||
- Fix: STRING1 probably means STRING1 (r24295)
|
||||
- Fix: squirrel_export should match key words like 'virtual', 'static' and 'const' only as whole words (r24288)
|
||||
- Fix: Hide object specs/classes from the GUI, if they will never be available to the user [FS#4967, FS#5120] (r24171)
|
||||
- Fix: Unify the spacing in 'AI/Game Script' and never just say 'Game' when 'Game Script' is meant [FS#4898] (r24020)
|
||||
|
||||
|
||||
1.2.3 (2012-11-01)
|
||||
------------------------------------------------------------------------
|
||||
(None)
|
||||
|
||||
|
||||
1.2.3-RC1 (2012-10-17)
|
||||
------------------------------------------------------------------------
|
||||
- Change: [NewGRF] Set the reference brightness of 32bpp mask recolouring to 128 (r24610)
|
||||
- Fix: Configure script did not properly handle _BUILD flags during reconfigure (r24601)
|
||||
- Fix: Configure script failed to detect libfontconfig 2.10 as newer than 2.3 (r24598)
|
||||
- Fix: When fontconfig is not available, the bootstrap download crashed [FS#5336] (r24597)
|
||||
- Fix: Crash when a gamescript provided too many parameters to a GSText object [FS#5333] (r24593)
|
||||
- Fix: [Script] API documentation mistakes/omissions (r24584)
|
||||
- Fix: Do not add duplicates to the ban list [FS#5308] (r24580)
|
||||
- Fix: Draw the window resize sprite bottom-aligned [FS#5324] (r24577)
|
||||
- Fix: Vehicle list at buoys did no longer work [FS#5319] (r24576)
|
||||
- Fix: [Windows] Do not cast away const in OS specific code (r24572, r24571)
|
||||
- Fix: Naming of bundles was somewhat broken (r24569)
|
||||
- Fix: Non-train vehicle lists were not resorted when vehicles were renamed [FS#5261] (r24567)
|
||||
- Fix: Stop both price and payment inflation if either of them has reached MAX_INFLATION (r24565)
|
||||
- Fix: Limiting the inflation did not quite work [FS#5312] (r24564)
|
||||
- Fix: Do not show profit from refits as cost in the refit window [FS#5297] (r24544)
|
||||
- Fix: Do not limit to reading one UDP packet per game loop (r24532)
|
||||
- Fix: Max script chance was too big (r24531)
|
||||
- Fix: [NewGRF] RandomAction 84 should interpret register 100 as signed (r24528)
|
||||
- Fix: [OSX] Some compile problems in mac-only code [FS#5296] (r24524)
|
||||
- Fix: The gender of an industry name is defined by the industry-type part of the name, not by the town-name part, even if it comes first (r24523, r24522)
|
||||
- Fix: GStexts were compiled incompletely when containing certain string codes (r24516, r24515)
|
||||
- Fix: The mousewheel did not work in the build waypoint window [FS#5285] (r24507)
|
||||
- Fix: [NewGRF] Airport variables 60 to 65 and 69 used the wrong cargo translation table for translations (r24506)
|
||||
- Fix: Do not show the global goals as company goals for spectators (r24500)
|
||||
- Fix: Clarify description of command line option -n (r24485)
|
||||
- Fix: Do not call RebuildSubsidisedSourceAndDestinationCache() before subsidy savegame conversion is finished [FS#5232] (r24482)
|
||||
- Fix: Trains were unable to reverse in stations when using NPF (r24479)
|
||||
- Fix: The --xxx yyy format (instead of --xxx=yyy) for configure did not work (r24471)
|
||||
- Fix: --prefix was not accepted by configure (r24470)
|
||||
- Fix: Changing auto-refit for a 'goto station' order was inadvertently modifying the full load state [FS#5264] (r24457)
|
||||
|
||||
|
||||
1.2.2 (2012-08-16)
|
||||
------------------------------------------------------------------------
|
||||
(None)
|
||||
|
||||
|
||||
1.2.2-RC1 (2012-08-01)
|
||||
------------------------------------------------------------------------
|
||||
- Fix: In some cases ships could be covered with land [CVE-2012-3436] [FS#5254] (r24449, r24439)
|
||||
- Fix: Copy constructor and assignment operator cannot be implicit template specialisations [FS#5255] (r24448)
|
||||
- Fix: Make (non-refittable) vehicles with invalid default cargo unavailable [FS#5256] (r24438)
|
||||
- Fix: CFLAGS/CXXFLAGS ignored for helper binaries (r24432, r24429, r24427, r24365)
|
||||
- Fix: [Windows] Unbreak NewGRF MD5 sum calculation. Macros and side effects do not mix, especially if there is some obscure '#define min' in a windows header that nobody thinks of [FS#5231] (r24416)
|
||||
- Fix: Disallow removing roadtypes from bridges when not dragging in bridge direction [FS#5221] (r24414)
|
||||
- Fix: Draw wires under low bridges if the bridge is transparent, not if the wire is transparent (r24403)
|
||||
- Fix: Station properties 11 and 14 were combined incorrectly [FS#5243] (r24402)
|
||||
- Fix: [Windows] Changing resolution did not resize the window (r24394)
|
||||
- Fix: Use the 'all vehicles' group for the autoreplace window from the vehicle list [FS#5239] (r24392)
|
||||
- Fix: Do not consider not finding a particular base set critical; just load a different one and display an in-game error later on [FS#5233] (r24388)
|
||||
- Fix: Make IsInDepot() functions behave consistent across vehicle types and add IsChainInDepot instead, if that is what shall be checked [FS#5188] (r24384)
|
||||
- Fix: Call Vehicle::IsStoppedInDepot only for the first vehicle in a chain (i.e. primary vehicle or free wagon) (r24382)
|
||||
- Fix: Do not resize the object GUI when selecting objects. Rather clip the object name (r24379)
|
||||
- Fix: ReInit could crash for windows with NWidgetMatrix widgets [FS#5218] (r24378)
|
||||
- Fix: [NewGRF] Extended action A1 did not work correctly [FS#5227] (r24369, r24361)
|
||||
- Fix: [NewGRF] Ship-specific 80+x variables were missing for unknown reason [FS#5224] (r24360)
|
||||
- Fix: When airport construction was denied due to noise, the error message named the wrong town (r24354)
|
||||
- Fix: [NoAI] A TileIndex is not a station id, so do not use it as one [FS#5215] (r24353)
|
||||
- Fix: When highlighting the drop position for vehicles in depots, make space for all articulated parts (r24352)
|
||||
- Fix: Short vehicles were not properly positioned at the cursor when dragging for RTL languages (r24351)
|
||||
- Fix: EQUALSIZE widget containers within EQUALSIZE containers were initialised with wrong sizes (r24346)
|
||||
- Fix: The cursor in the company password window was not blinking due to wrong magic constants (r24335)
|
||||
- Fix: [NewGRF] Change the length of 8/8 roadvehicles in vehicle lists to 32 pixels; this is in fact the correct length as can be seen in corners for short articulated parts following each other [FS#2553] (r24332)
|
||||
- Fix: [NewGRF] Group vehicles in the purchase list properly by source GRF, but also consider engine GRFID overrides [FS#4254] (r24330, r24321)
|
||||
- Fix: Make the AI settings window behave more like the other settings window by closing the query window whenever selecting a different row (r24315)
|
||||
- Fix: Editing NewGRF parameters using the query window showed wrong values, if there was no direct relation between parameter index and parameter register (r24314)
|
||||
- Fix: Center object previews in 1- and 2-view selectors based on the 4-view selector layout [FS#5057] (r24299)
|
||||
- Fix: Increase the left and right margins of the text in the yes/no query window (r24293)
|
||||
- Fix: [NewGRF] GetReverseCargoTranslation() was unnecessary complicated and also returned the wrong thing for cargos not present in the translation table (r24273)
|
||||
- Fix: [NewGRF] Load cargo- and railtype-translation during both reservation and activation stage. That way they can be selected using Action7 depending on present cargo- or railtypes (r24272)
|
||||
- Fix: Use the same colour scheme for the script selection window as in other comparable windows (r24268)
|
||||
- Fix: Make the oilrig-vehicle list accessible to spectators and colour its caption neutrally grey [FS#5126] (r24260)
|
||||
|
||||
|
||||
1.2.1 (2012-06-01)
|
||||
------------------------------------------------------------------------
|
||||
- Fix: [Script] ScriptTown::GetGrowthRate() returned wrong values after usage of SetGrowthRate() (r24302)
|
||||
|
||||
|
||||
1.2.1-RC1 (2012-05-16)
|
||||
------------------------------------------------------------------------
|
||||
- Fix: Change the unit of the sprite-cache size setting from megabytes to megapixels, so it depends on the blitter being used. Also increase it from 64 to 128, and change the name in the cfg file, so everyone gets the new default [FS#5162] (r24252)
|
||||
- Fix: Do not immediately display error messages from parsing the cfg file, but schedule them for displaying after the GUI is prepared for it [FS#5154] (r24250, r24249, r24248, r24247)
|
||||
- Fix: Dereferencing uninitialised pointer causing a crash [FS#5159] (r24224)
|
||||
- Fix: Lag counters were not properly reset when switching states making it possible to get disconnected for lagging when you were not lagging [FS#5166] (r24221)
|
||||
- Fix: Adopt ICU version detection to also deal with the new versioning scheme since ICU 49 [FS#5182] (r24220)
|
||||
- Fix: Immediately do the cargo payment on vehicle crashes instead of when they are cleared [FS#5152] (r24219)
|
||||
- Fix: The confirmation window to abort world generation was hidden during world generation, so actually you could not abort it [FS#5159] (r24214)
|
||||
- Fix: If a company is taken over or bankrupts, transfer exclusive transport rights to the new owner respectively cancel them (r24204)
|
||||
- Fix: Make the engine name not overdraw the engine count in the autoreplace GUI (r24203)
|
||||
- Fix: Make the size of the details in the autoreplace GUI match more the size of the details in the purchase list (r24202)
|
||||
- Fix: Mark group list dirty when setting/clearing autoreplace for an engine type [FS#5170] (r24201)
|
||||
- Fix: Invalidate build vehicle windows every month, in case they need resorting due to changed reliabilities [FS#5149] (r24200)
|
||||
- Fix: If you consider a settings to potentially cause desyncs via NewGRFs and thus disallow changing it in network games, you should probably also sync it to clients (r24193, r24191)
|
||||
- Fix: Use default value when reading an invalid setting value [FS#5153] (r24192, r24146)
|
||||
- Fix: [Windows] When going to fullscreen and back, restore to the resolution you were, not to the fullscreen resolution (r24189)
|
||||
- Fix: [Windows] When changing the basics of a window (fullscreen, 8bpp/32bpp), and a window already exists, it was forced out of maximize mode, and its resolution/position was reset, often causing unwanted side-effects [FS#5151] (r24188)
|
||||
- Fix: Town radii were not updated immediatelly after construction/destruction of houses, resulting in desyncs [FS#5169] (r24183)
|
||||
- Fix: The population of a town was computed incorrectly for overridden houses when loading a game (r24182, r24181, r24179)
|
||||
- Fix: The object name from property A was not displayed in the object GUI [FS#5110] (r24178)
|
||||
- Fix: The arctic 'shops and offices' used the 'church' sprite in one of its four views [FS#5148] (r24177)
|
||||
- Fix: The object GUI did not draw objects when all objects of a class are disabled (r24176)
|
||||
- Fix: If you spent hard work on finding an available object ID, you should probably also use it instead of always 0 (r24159)
|
||||
- Fix: Town producing no cargo at all could spawn passenger subsidies (r24158)
|
||||
- Fix: The music volume was set too early during startup causing it to be not set correctly (r24155)
|
||||
- Fix: [Squirrel] Crash when trying to create an array with negative size [FS#5160] (r24153)
|
||||
- Fix: [NoAI] Do not return the last 'cached' speed of vehicles when they are stopped/crashed [FS#5157] (r24152)
|
||||
- Fix: [Script] Typo in script documentation (r24151)
|
||||
- Fix: Glass-sprite of bubble-generator was not drawn anymore for completely constructed tiles [FS#5143] (r24107)
|
||||
- Fix: Conflicting strategies for resizing the main toolbar and statusbar after resizing the main window [FS#5136] (r24089)
|
||||
- Fix: Significantly reduce the area that is redrawn for text effects [FS#5103] (r24068)
|
||||
- Fix: Do not redraw up to 25% of the map when making a new vehicle visible for the first time (r24067)
|
||||
- Fix: Do not redraw the text effect when nothing changed (r24066)
|
||||
|
||||
|
||||
1.2.0 (2012-04-15)
|
||||
------------------------------------------------------------------------
|
||||
- Fix: When starting GS or AI, always use the settings of the game, not the new-game settings [FS#5142] (r24108)
|
||||
- Fix: Provide translated comments in the desktop file without language name postfix (r24100)
|
||||
- Fix: Cloning orders of aircraft with limited range failed [FS#5131] (r24086)
|
||||
|
||||
|
||||
1.2.0-RC4 (2012-04-01)
|
||||
------------------------------------------------------------------------
|
||||
- Fix: Reversing trains while they were entering or leaving a depot could lead to stuck trains [FS#5093] (r24078, r24071)
|
||||
- Fix: The 'last joined' server was not properly selected anymore [FS#5098] (r24070)
|
||||
- Fix: Immediately start querying the last joined server instead of waiting for the requery loop [FS#5097] (r24069, r24062)
|
||||
- Fix: Make the full snowedness level of houses the same as roads and rails [FS#5121] (r24064)
|
||||
- Fix: With certain versions of GCC and compiler flags the compiler could reorder some code badly causing the 32bpp depot flag not working [FS#5125] (r24063)
|
||||
- Fix: Do not freeze aircraft mid-flight when skipping to an out-of-range destination [FS#5123] (r24060)
|
||||
- Fix: Wrong numbering of string parameters causing wrong capacities to be shown [FS#5124] (r24058)
|
||||
- Fix: Crash when timetabling a maximum travel speed of 0 [FS#5111] (r24053)
|
||||
- Fix: [NewGRF] Imported GRF sounds were inserted into the wrong slots [FS#5107] (r24052)
|
||||
- Fix: [NewGRF] Realsprites inside the action 11 block were not skipped correctly (r24050)
|
||||
- Fix: Improve error messages for the placement restrictions of banks, water towers and toy shops [FS#5095] (r24040)
|
||||
|
||||
|
||||
1.2.0-RC3 (2012-03-18)
|
||||
------------------------------------------------------------------------
|
||||
- Feature: Allow display of baseset textfiles (r24037)
|
||||
- Feature: Increase the station class limit from 32 to 256 (r24031)
|
||||
- Fix: After opening a text window with the monospaced font, all other text started glitching (r24038)
|
||||
- Fix: [NoAI] Reset 'is random' status of temporary variable during saveload as it is not always written to when loading an AI which means it wouldd be taking the 'is random' setting of another AI (r24033)
|
||||
- Fix: [NoAI] Make AIEngine::IsArticulated return true if the articulated callback flag is set, do not try to run the callback (r24029)
|
||||
- Fix: Pass cases down into the list of cargos [FS#5090] (r24024, r24023, r24022)
|
||||
|
||||
|
||||
1.2.0-RC2 (2012-03-04)
|
||||
------------------------------------------------------------------------
|
||||
- Fix: [Script] AI used in names in API for GSOrder [FS#5088] (r24006)
|
||||
|
||||
+90
-41
@@ -164,7 +164,7 @@ set_default() {
|
||||
with_ccache
|
||||
with_grfcodec
|
||||
with_nforenum
|
||||
CC CXX CFLAGS CXXFLAGS LDFLAGS"
|
||||
CC CXX CFLAGS CXXFLAGS LDFLAGS CFLAGS_BUILD CXXFLAGS_BUILD LDFLAGS_BUILD"
|
||||
}
|
||||
|
||||
detect_params() {
|
||||
@@ -197,21 +197,21 @@ detect_params() {
|
||||
--cpu-type) prev_p="cpu_type";;
|
||||
--cpu-type=*) cpu_type="$optarg";;
|
||||
|
||||
--cc-build) prevp_p="cc_build";;
|
||||
--cc-build) prev_p="cc_build";;
|
||||
--cc-build=*) cc_build="$optarg";;
|
||||
--cc-host) prevp_p="cc_host";;
|
||||
--cc-host) prev_p="cc_host";;
|
||||
--cc-host=*) cc_host="$optarg";;
|
||||
--cxx-build) prevp_p="cxx_build";;
|
||||
--cxx-build) prev_p="cxx_build";;
|
||||
--cxx-build=*) cxx_build="$optarg";;
|
||||
--cxx-host) prevp_p="cxx_host";;
|
||||
--cxx-host) prev_p="cxx_host";;
|
||||
--cxx-host=*) cxx_host="$optarg";;
|
||||
--windres) prevp_p="windres";;
|
||||
--windres) prev_p="windres";;
|
||||
--windres=*) windres="$optarg";;
|
||||
--awk) prevp_p="awk";;
|
||||
--awk) prev_p="awk";;
|
||||
--awk=*) awk="$optarg";;
|
||||
--strip) prevp_p="strip";;
|
||||
--strip) prev_p="strip";;
|
||||
--strip=*) strip="$optarg";;
|
||||
--lipo) prevp_p="lipo";;
|
||||
--lipo) prev_p="lipo";;
|
||||
--lipo=*) lipo="$optarg";;
|
||||
|
||||
--endian) prev_p="endian";;
|
||||
@@ -219,52 +219,53 @@ detect_params() {
|
||||
|
||||
|
||||
|
||||
--prefix-dir) prevp_p="prefix-dir";;
|
||||
--prefix-dir=*) prefix_dir="$optarg";;
|
||||
# Alias --prefix with --prefix-dir, for compatibility with GNU autotools
|
||||
--prefix-dir | --prefix) prev_p="prefix_dir";;
|
||||
--prefix-dir=* | --prefix=*) prefix_dir="$optarg";;
|
||||
|
||||
--binary-dir) prevp_p="binary-dir";;
|
||||
--binary-dir) prev_p="binary_dir";;
|
||||
--binary-dir=*) binary_dir="$optarg";;
|
||||
|
||||
--data-dir) prevp_p="data-dir";;
|
||||
--data-dir) prev_p="data_dir";;
|
||||
--data-dir=*) data_dir="$optarg";;
|
||||
|
||||
--doc-dir) prevp_p="doc-dir";;
|
||||
--doc-dir) prev_p="doc_dir";;
|
||||
--doc-dir=*) doc_dir="$optarg";;
|
||||
|
||||
--icon-dir) prevp_p="icon-dir";;
|
||||
--icon-dir) prev_p="icon_dir";;
|
||||
--icon-dir=*) icon_dir="$optarg";;
|
||||
|
||||
--icon-theme-dir) prevp_p="icon-theme-dir";;
|
||||
--icon-theme-dir) prev_p="icon_theme_dir";;
|
||||
--icon-theme-dir=*) icon_theme_dir="$optarg";;
|
||||
--without-icon-theme) icon_theme_dir="";;
|
||||
|
||||
--menu-dir) prevp_p="menu_dir";;
|
||||
--menu-dir) prev_p="menu_dir";;
|
||||
--menu-dir=*) menu_dir="$optarg";;
|
||||
--without-menu-entry) menu_dir="";;
|
||||
|
||||
--menu-name) prevp_p="menu_name";;
|
||||
--menu-name) prev_p="menu_name";;
|
||||
--menu-name=*) menu_name="$optarg";;
|
||||
|
||||
--binary-name) prevp_p="binary_name";;
|
||||
--binary-name) prev_p="binary_name";;
|
||||
--binary-name=*) binary_name="$optarg";;
|
||||
|
||||
--man-dir) prevp_p="man_dir";;
|
||||
--man-dir) prev_p="man_dir";;
|
||||
--man-dir=*) man_dir="$optarg";;
|
||||
|
||||
--personal-dir) prevp_p="personal-dir";;
|
||||
--personal-dir) prev_p="personal_dir";;
|
||||
--personal-dir=*) personal_dir="$optarg";;
|
||||
--without-personal-dir) personal_dir="";;
|
||||
|
||||
--shared-dir) prevp_p="shared-dir";;
|
||||
--shared-dir) prev_p="shared_dir";;
|
||||
--shared-dir=*) shared_dir="$optarg";;
|
||||
--without-shared-dir) shared_dir="";;
|
||||
|
||||
--install-dir) prevp_p="install-dir";;
|
||||
--install-dir) prev_p="install_dir";;
|
||||
--install-dir=*) install_dir="$optarg";;
|
||||
|
||||
|
||||
|
||||
--menu-group) prevp_p="menu_group";;
|
||||
--menu-group) prev_p="menu_group";;
|
||||
--menu-group=*) menu_group="$optarg";;
|
||||
|
||||
|
||||
@@ -442,6 +443,9 @@ detect_params() {
|
||||
CFLAGS=* | --CFLAGS=*) CFLAGS="$optarg";;
|
||||
CXXFLAGS=* | --CXXFLAGS=*) CXXFLAGS="$optarg";;
|
||||
LDFLAGS=* | --LDFLAGS=*) LDFLAGS="$optarg";;
|
||||
CFLAGS_BUILD=* | --CFLAGS_BUILD=* | --CFLAGS-BUILD=*) CFLAGS_BUILD="$optarg";;
|
||||
CXXFLAGS_BUILD=* | --CXXFLAGS_BUILD=* | --CXXFLAGS-BUILD=*) CXXFLAGS_BUILD="$optarg";;
|
||||
LDFLAGS_BUILD=* | --LDFLAGS_BUILD=* | --LDFLAGS-BUILD=*) LDFLAGS_BUILD="$optarg";;
|
||||
|
||||
--ignore-extra-parameters) ignore_extra_parameters="1";;
|
||||
|
||||
@@ -1299,8 +1303,8 @@ make_compiler_cflags() {
|
||||
|
||||
flags="$flags -Wall -Wno-multichar -Wsign-compare -Wundef"
|
||||
flags="$flags -Wwrite-strings -Wpointer-arith"
|
||||
flags="$flags -W -Wno-unused-parameter -Wformat=2"
|
||||
flags="$flags -Wredundant-decls"
|
||||
flags="$flags -W -Wno-unused-parameter -Wredundant-decls"
|
||||
flags="$flags -Wformat=2 -Wformat-security"
|
||||
|
||||
if [ $enable_assert -eq 0 ]; then
|
||||
# Do not warn about unused variables when building without asserts
|
||||
@@ -1346,6 +1350,12 @@ make_compiler_cflags() {
|
||||
cxxflags="$cxxflags -std=gnu++0x"
|
||||
fi
|
||||
|
||||
if [ $cc_version -eq 45 ]; then
|
||||
# Prevent optimisation supposing enums are in a range specified by the standard
|
||||
# For details, see http://gcc.gnu.org/PR43680
|
||||
flags="$flags -fno-tree-vrp"
|
||||
fi
|
||||
|
||||
if [ $cc_version -ge 47 ]; then
|
||||
# Disable -Wnarrowing which gives many warnings, such as:
|
||||
# warning: narrowing conversion of '...' from 'unsigned int' to 'int' inside { } [-Wnarrowing]
|
||||
@@ -1386,11 +1396,11 @@ make_compiler_cflags() {
|
||||
|
||||
make_cflags_and_ldflags() {
|
||||
# General CFlags for BUILD
|
||||
CFLAGS_BUILD=""
|
||||
CFLAGS_BUILD="$CFLAGS_BUILD"
|
||||
# Special CXXFlags for BUILD
|
||||
CXXFLAGS_BUILD=""
|
||||
CXXFLAGS_BUILD="$CXXFLAGS_BUILD"
|
||||
# LDFLAGS for BUILD
|
||||
LDFLAGS_BUILD=""
|
||||
LDFLAGS_BUILD="$LDFLAGS_BUILD"
|
||||
# FEATURES for BUILD (lto)
|
||||
FEATURES_BUILD=""
|
||||
# General CFlags for HOST
|
||||
@@ -1424,12 +1434,6 @@ make_cflags_and_ldflags() {
|
||||
# Each debug level reduces the optimization by a bit
|
||||
if [ $enable_debug -ge 1 ]; then
|
||||
CFLAGS="$CFLAGS -g -D_DEBUG"
|
||||
if basename "$cc_host" | grep "gcc" &>/dev/null; then
|
||||
# Define only when compiling with GCC, some
|
||||
# GLIBC versions use GNU extensions in a way
|
||||
# that breaks build with at least ICC
|
||||
CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
|
||||
fi
|
||||
if [ "$os" = "PSP" ]; then
|
||||
CFLAGS="$CFLAGS -G0"
|
||||
fi
|
||||
@@ -1444,6 +1448,18 @@ make_cflags_and_ldflags() {
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $enable_debug -le 2 ]; then
|
||||
if basename "$cc_host" | grep "gcc" &>/dev/null; then
|
||||
# Define only when compiling with GCC. Some GLIBC versions use GNU
|
||||
# extensions in a way that breaks build with at least ICC.
|
||||
# This requires -O1 or more, so debug level 3 (-O0) is excluded.
|
||||
CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
|
||||
|
||||
# Just add -O1 to the tools needed for building.
|
||||
CFLAGS_BUILD="$CFLAGS_BUILD -D_FORTIFY_SOURCE=2 -O1"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$os" = "OSX" ] && [ $cc_version -eq 40 ]; then
|
||||
# Apple's GCC 4.0 has a compiler bug for x86_64 with (higher) optimization,
|
||||
# wrongly optimizing ^= in loops. This disables the failing optimisation.
|
||||
@@ -1478,6 +1494,9 @@ make_cflags_and_ldflags() {
|
||||
if [ $cc_version -ge 44 ]; then
|
||||
LDFLAGS_BUILD="$LDFLAGS_BUILD -static-libgcc -static-libstdc++"
|
||||
fi
|
||||
if [ $cc_version -ge 47 ]; then
|
||||
CFLAGS="$CFLAGS -mno-ms-bitfields"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -1771,6 +1790,7 @@ make_cflags_and_ldflags() {
|
||||
|
||||
if [ "$enable_assert" = "0" ]; then
|
||||
CFLAGS="$CFLAGS -DNDEBUG"
|
||||
CFLAGS_BUILD="$CFLAGS_BUILD -DNDEBUG"
|
||||
fi
|
||||
|
||||
if [ "$enable_desync_debug" != "0" ]; then
|
||||
@@ -1806,6 +1826,9 @@ make_cflags_and_ldflags() {
|
||||
fi
|
||||
fi
|
||||
|
||||
log 1 "using CFLAGS_BUILD... $CFLAGS_BUILD"
|
||||
log 1 "using CXXFLAGS_BUILD... $CXXFLAGS_BUILD"
|
||||
log 1 "using LDFLAGS_BUILD... $LDFLAGS_BUILD"
|
||||
log 1 "using CFLAGS... $CFLAGS"
|
||||
log 1 "using CXXFLAGS... $CXXFLAGS"
|
||||
log 1 "using LDFLAGS... $LIBS $LDFLAGS"
|
||||
@@ -2130,6 +2153,30 @@ check_makedepend() {
|
||||
log 1 "checking makedepend... $makedepend"
|
||||
}
|
||||
|
||||
check_version() {
|
||||
# $1 - requested version (major.minor)
|
||||
# $2 - version we got (major.minor)
|
||||
|
||||
if [ -z "$2" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
req_major=`echo $1 | cut -d. -f1`
|
||||
got_major=`echo $2 | cut -d. -f1`
|
||||
if [ $got_major -lt $req_major ]; then
|
||||
return 0
|
||||
elif [ $got_major -gt $req_major ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
req_minor=`echo $1 | cut -d. -f2`
|
||||
got_minor=`echo $2 | cut -d. -f2`
|
||||
if [ $got_minor -lt $req_minor ]; then
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
detect_awk() {
|
||||
# Not all awks allow gsub(), so we test for that here! It is in fact all we need...
|
||||
|
||||
@@ -2815,13 +2862,14 @@ detect_fontconfig() {
|
||||
|
||||
version=`$fontconfig_config --modversion 2>/dev/null`
|
||||
ret=$?
|
||||
shortversion=`echo $version | cut -c 1,3`
|
||||
check_version '2.3' "$version"
|
||||
version_ok=$?
|
||||
log 2 "executing $fontconfig_config --modversion"
|
||||
log 2 " returned $version"
|
||||
log 2 " exit code $ret"
|
||||
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$shortversion" -le "22" ]; then
|
||||
if [ -n "$shortversion" ] && [ "$shortversion" -le "22" ]; then
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version_ok" != "1" ]; then
|
||||
if [ -n "$version" ] && [ "$version_ok" != "1" ]; then
|
||||
log 1 "checking libfontconfig... needs at least version 2.3.0, fontconfig NOT enabled"
|
||||
else
|
||||
log 1 "checking libfontconfig... not found"
|
||||
@@ -2864,13 +2912,14 @@ detect_icu() {
|
||||
|
||||
version=`$icu_config --version 2>/dev/null`
|
||||
ret=$?
|
||||
shortversion=`echo $version | cut -c 1,3`
|
||||
check_version '3.6' "$version"
|
||||
version_ok=$?
|
||||
log 2 "executing $icu_config --version"
|
||||
log 2 " returned $version"
|
||||
log 2 " exit code $ret"
|
||||
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$shortversion" -lt "36" ]; then
|
||||
if [ -n "$shortversion" ] && [ "$shortversion" -lt "36" ]; then
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version_ok" != "1" ]; then
|
||||
if [ -n "$version" ] && [ "$version_ok" != "1" ]; then
|
||||
log 1 "checking libicu... needs at least version 3.6.0, icu NOT enabled"
|
||||
else
|
||||
log 1 "checking libicu... not found"
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
32bpp and OpenTTD
|
||||
Last updated: 2007-06-13
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
||||
Table of contents
|
||||
-----------------
|
||||
1.0) About
|
||||
2.0) The format
|
||||
|
||||
|
||||
1.0) About
|
||||
---- -----
|
||||
OpenTTD has 32bpp support. This means: OpenTTD still is 8bpp, but it has the
|
||||
posibility to override the graphics with 32bpp. This means that it isn't a
|
||||
replacement of grf or newgrf, but simply an addition. If you want to use 32bpp
|
||||
graphics of a newgrf, you do need the newgrf itself too (with 8bpp graphics).
|
||||
|
||||
|
||||
2.0) The format
|
||||
---- ----------
|
||||
32bpp images are stored in PNG. They should go in:
|
||||
data/sprites/<grfname>/<SpriteID>.png
|
||||
|
||||
For example, a grfname would be 'openttd' (without .grf, lowercase), and the
|
||||
SpriteID 3, to override the 3rd sprite in openttd.grf with a 32bpp version.
|
||||
|
||||
The format of this PNG can be almost anything, but we advise to use RGBA
|
||||
format. Alpha-channel is fully supported.
|
||||
|
||||
As the core of OpenTTD is 8bpp, and because you of course want company colours
|
||||
in your images, you will need to add a mask for every sprite that needs colour
|
||||
remapping. The name is simular as above, only you have to put a 'm' behind the
|
||||
SpriteID. This image should be a 8bpp palette image, where the palette is the
|
||||
OpenTTD palette. Upon load of the PNG, the mask is loaded too, and overrides
|
||||
the RGB (not the Alpha) of the original PNG image, and replacing it with a
|
||||
8bpp color remapped and converted to 32bpp.
|
||||
|
||||
Another thing that OpenTTD needs in your png, is 2 tEXt chunks: x_offs and
|
||||
y_offs. This to define the x- and y-offset, of course. Use the tool we supply
|
||||
to add this information. Sadly enough most graphical editors trashes those
|
||||
chunks upon save, so you have to readd it every time you save your image.
|
||||
|
||||
Your images should be the same as the grf, in size.
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
OpenTTD's known bugs
|
||||
Last updated: 2012-03-04
|
||||
Release version: 1.2.0-RC2
|
||||
Last updated: 2012-06-01
|
||||
Release version: 1.2.1
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
// 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/>.
|
||||
//
|
||||
-1 * 0 0C "OpenTTD GUI graphics"
|
||||
-1 * 3 05 15 A2
|
||||
-1 * 3 05 15 A8
|
||||
-1 sprites/openttdgui.png 8bpp 66 8 64 31 -31 7 normal
|
||||
-1 sprites/openttdgui.png 8bpp 146 8 64 31 -31 7 normal
|
||||
-1 sprites/openttdgui.png 8bpp 226 8 64 31 -31 7 normal
|
||||
@@ -170,3 +170,9 @@
|
||||
-1 sprites/openttdgui.png 8bpp 194 440 13 10 0 -2 normal
|
||||
-1 sprites/openttdgui.png 8bpp 215 440 9 10 0 0 normal
|
||||
-1 sprites/openttdgui.png 8bpp 232 440 8 10 0 0 normal
|
||||
-1 sprites/openttdgui.png 8bpp 248 440 8 8 0 0 normal
|
||||
-1 sprites/openttdgui.png 8bpp 264 440 8 8 0 0 normal
|
||||
-1 sprites/openttdgui.png 8bpp 280 440 8 8 0 0 normal
|
||||
-1 sprites/openttdgui.png 8bpp 296 440 8 8 0 0 normal
|
||||
-1 sprites/openttdgui.png 8bpp 312 440 14 10 0 0 normal
|
||||
-1 sprites/openttdgui.png 8bpp 328 440 14 10 0 0 normal
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 25 KiB |
@@ -0,0 +1,13 @@
|
||||
# $Id: openttd.desktop.translation.awk 19884 2010-05-22 19:59:37Z rubidium $
|
||||
|
||||
# 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/>.
|
||||
|
||||
#
|
||||
# Awk script to automatically remove duplicate Comment[i]= lines
|
||||
#
|
||||
|
||||
BEGIN { FS = "="; last = "" }
|
||||
{ if (last != $1) { print $0 }; last = $1 }
|
||||
@@ -6,10 +6,10 @@
|
||||
# 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/>.
|
||||
|
||||
#
|
||||
# Awk script to automatically generate a single comment line
|
||||
# for a translated desktop shortcut. If it does not exist there
|
||||
# Awk script to automatically generate a comment lines for
|
||||
# a translated desktop shortcut. If it does not exist there
|
||||
# is no output.
|
||||
#
|
||||
|
||||
/##isocode/ { lang = $2; next }
|
||||
/STR_DESKTOP_SHORTCUT_COMMENT/ { sub("^[^:]*:", "", $0); print "Comment[" lang "]=" $0; next}
|
||||
/STR_DESKTOP_SHORTCUT_COMMENT/ { sub("^[^:]*:", "", $0); print "Comment[" lang "]=" $0; sub("_.*", "", lang); print "Comment[" lang "]=" $0; next}
|
||||
|
||||
@@ -1,3 +1,63 @@
|
||||
openttd (1.3.0-beta1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.3.0-beta1
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Mon, 24 Dec 2012 00:00:00 +0100
|
||||
|
||||
openttd (1.2.3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.3
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Thu, 01 Nov 2012 00:00:00 +0200
|
||||
|
||||
openttd (1.2.3~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.3-RC1
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 17 Oct 2012 00:00:00 +0200
|
||||
|
||||
openttd (1.2.2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.2
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Thu, 16 Aug 2012 20:00:00 +0200
|
||||
|
||||
openttd (1.2.2~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.2-RC1
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 01 Aug 2012 00:00:00 +0200
|
||||
|
||||
openttd (1.2.1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.1
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 01 Jun 2012 00:00:00 +0200
|
||||
|
||||
openttd (1.2.1~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.1-RC1
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 16 Apr 2012 22:00:00 +0200
|
||||
|
||||
openttd (1.2.0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 15 Apr 2012 14:00:00 +0200
|
||||
|
||||
openttd (1.2.0~RC4) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-RC4
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 01 Apr 2012 00:00:00 +0200
|
||||
|
||||
openttd (1.2.0~RC3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-RC3
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 18 Mar 2012 18:00:00 +0100
|
||||
|
||||
openttd (1.2.0~RC2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-RC2
|
||||
|
||||
Binary file not shown.
@@ -1,6 +1,6 @@
|
||||
@echo off
|
||||
|
||||
set OPENTTD_VERSION=1.2.0-RC2
|
||||
set OPENTTD_VERSION=1.3.0-beta1
|
||||
set OPENSFX_VERSION=0.8.0
|
||||
set NOSOUND_VERSION=0.8.0
|
||||
set OPENGFX_VERSION=1.2.0
|
||||
|
||||
+2
-2
@@ -17,9 +17,9 @@
|
||||
#
|
||||
|
||||
Name: openttd
|
||||
Version: 1.2.beta4
|
||||
Version: 1.3.beta1
|
||||
Release: 0
|
||||
%define srcver 1.2.0-beta4
|
||||
%define srcver 1.3.0-beta1
|
||||
Summary: An open source reimplementation of Chris Sawyer's Transport Tycoon Deluxe
|
||||
License: GPL-2.0
|
||||
Group: Amusements/Games/Strategy/Other
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
# Version numbers to update
|
||||
!define APPV_MAJOR 1
|
||||
!define APPV_MINOR 2
|
||||
!define APPV_MINOR 3
|
||||
!define APPV_MAINT 0
|
||||
!define APPV_BUILD 5
|
||||
!define APPV_EXTRA "-RC2"
|
||||
!define APPV_BUILD 0
|
||||
!define APPV_EXTRA "-beta1"
|
||||
|
||||
!define APPNAME "OpenTTD" ; Define application name
|
||||
!define APPVERSION "${APPV_MAJOR}.${APPV_MINOR}.${APPV_MAINT}${APPV_EXTRA}" ; Define application version
|
||||
@@ -143,9 +143,6 @@ Section "!OpenTTD" Section1
|
||||
File ${PATH_ROOT}docs\multiplayer.txt
|
||||
Push "$INSTDIR\docs\multiplayer.txt"
|
||||
Call unix2dos
|
||||
File ${PATH_ROOT}docs\32bpp.txt
|
||||
Push "$INSTDIR\docs\32bpp.txt"
|
||||
Call unix2dos
|
||||
|
||||
; Copy the rest of the stuff
|
||||
SetOutPath "$INSTDIR\"
|
||||
@@ -217,7 +214,6 @@ Section "!OpenTTD" Section1
|
||||
CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Known-bugs.lnk" "$INSTDIR\known-bugs.txt"
|
||||
CreateDirectory "$SMPROGRAMS\$SHORTCUTS\Docs"
|
||||
CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Docs\Multiplayer.lnk" "$INSTDIR\docs\multiplayer.txt"
|
||||
CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Docs\32bpp.lnk" "$INSTDIR\docs\32bpp.txt"
|
||||
CreateDirectory "$SMPROGRAMS\$SHORTCUTS\Scripts"
|
||||
CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Scripts\Readme.lnk" "$INSTDIR\scripts\readme.txt"
|
||||
!insertmacro MUI_STARTMENU_WRITE_END
|
||||
|
||||
@@ -177,6 +177,9 @@ Function DetermineSVNVersion()
|
||||
' Make sure index is in sync with disk
|
||||
Set oExec = WshShell.Exec("git update-index --refresh")
|
||||
If Err.Number = 0 Then
|
||||
' StdOut and StdErr share a 4kB buffer so prevent it from filling up as we don't care about the output
|
||||
oExec.StdOut.Close
|
||||
oExec.StdErr.Close
|
||||
' Wait till the application is finished ...
|
||||
Do While oExec.Status = 0
|
||||
WScript.Sleep 10
|
||||
|
||||
@@ -296,6 +296,7 @@
|
||||
<ClCompile Include="..\src\articulated_vehicles.cpp" />
|
||||
<ClCompile Include="..\src\autoreplace.cpp" />
|
||||
<ClCompile Include="..\src\bmp.cpp" />
|
||||
<ClCompile Include="..\src\cargomonitor.cpp" />
|
||||
<ClCompile Include="..\src\cargopacket.cpp" />
|
||||
<ClCompile Include="..\src\cargotype.cpp" />
|
||||
<ClCompile Include="..\src\cheat.cpp" />
|
||||
@@ -316,6 +317,7 @@
|
||||
<ClCompile Include="..\src\fileio.cpp" />
|
||||
<ClCompile Include="..\src\fios.cpp" />
|
||||
<ClCompile Include="..\src\fontcache.cpp" />
|
||||
<ClCompile Include="..\src\base_consist.cpp" />
|
||||
<ClCompile Include="..\src\gamelog.cpp" />
|
||||
<ClCompile Include="..\src\genworld.cpp" />
|
||||
<ClCompile Include="..\src\gfx.cpp" />
|
||||
@@ -360,8 +362,10 @@
|
||||
<ClCompile Include="..\src\station.cpp" />
|
||||
<ClCompile Include="..\src\strgen\strgen_base.cpp" />
|
||||
<ClCompile Include="..\src\string.cpp" />
|
||||
<ClCompile Include="..\src\stringfilter.cpp" />
|
||||
<ClCompile Include="..\src\strings.cpp" />
|
||||
<ClCompile Include="..\src\subsidy.cpp" />
|
||||
<ClCompile Include="..\src\textbuf.cpp" />
|
||||
<ClCompile Include="..\src\texteff.cpp" />
|
||||
<ClCompile Include="..\src\tgp.cpp" />
|
||||
<ClCompile Include="..\src\tile_map.cpp" />
|
||||
@@ -388,6 +392,7 @@
|
||||
<ClInclude Include="..\src\bmp.h" />
|
||||
<ClInclude Include="..\src\bridge.h" />
|
||||
<ClInclude Include="..\src\cargo_type.h" />
|
||||
<ClInclude Include="..\src\cargomonitor.h" />
|
||||
<ClInclude Include="..\src\cargopacket.h" />
|
||||
<ClInclude Include="..\src\cargotype.h" />
|
||||
<ClInclude Include="..\src\cheat_func.h" />
|
||||
@@ -435,6 +440,7 @@
|
||||
<ClInclude Include="..\src\fileio_type.h" />
|
||||
<ClInclude Include="..\src\fios.h" />
|
||||
<ClInclude Include="..\src\fontcache.h" />
|
||||
<ClInclude Include="..\src\base_consist.h" />
|
||||
<ClInclude Include="..\src\gamelog.h" />
|
||||
<ClInclude Include="..\src\gamelog_internal.h" />
|
||||
<ClInclude Include="..\src\genworld.h" />
|
||||
@@ -539,6 +545,7 @@
|
||||
<ClInclude Include="..\src\sound\sdl_s.h" />
|
||||
<ClInclude Include="..\src\video\sdl_v.h" />
|
||||
<ClInclude Include="..\src\settings_func.h" />
|
||||
<ClInclude Include="..\src\settings_gui.h" />
|
||||
<ClInclude Include="..\src\settings_internal.h" />
|
||||
<ClInclude Include="..\src\settings_type.h" />
|
||||
<ClInclude Include="..\src\ship.h" />
|
||||
@@ -564,6 +571,7 @@
|
||||
<ClInclude Include="..\src\strgen\strgen.h" />
|
||||
<ClInclude Include="..\src\string_func.h" />
|
||||
<ClInclude Include="..\src\string_type.h" />
|
||||
<ClInclude Include="..\src\stringfilter_type.h" />
|
||||
<ClInclude Include="..\src\strings_func.h" />
|
||||
<ClInclude Include="..\src\strings_type.h" />
|
||||
<ClInclude Include="..\src\subsidy_base.h" />
|
||||
@@ -572,6 +580,7 @@
|
||||
<ClInclude Include="..\src\tar_type.h" />
|
||||
<ClInclude Include="..\src\terraform_gui.h" />
|
||||
<ClInclude Include="..\src\textbuf_gui.h" />
|
||||
<ClInclude Include="..\src\textbuf_type.h" />
|
||||
<ClInclude Include="..\src\texteff.hpp" />
|
||||
<ClInclude Include="..\src\textfile_gui.h" />
|
||||
<ClInclude Include="..\src\textfile_type.h" />
|
||||
@@ -783,6 +792,7 @@
|
||||
<ClCompile Include="..\src\saveload\airport_sl.cpp" />
|
||||
<ClCompile Include="..\src\saveload\animated_tile_sl.cpp" />
|
||||
<ClCompile Include="..\src\saveload\autoreplace_sl.cpp" />
|
||||
<ClCompile Include="..\src\saveload\cargomonitor_sl.cpp" />
|
||||
<ClCompile Include="..\src\saveload\cargopacket_sl.cpp" />
|
||||
<ClCompile Include="..\src\saveload\cheat_sl.cpp" />
|
||||
<ClCompile Include="..\src\saveload\company_sl.cpp" />
|
||||
@@ -947,6 +957,7 @@
|
||||
<ClInclude Include="..\src\script\api\script_bridgelist.hpp" />
|
||||
<ClInclude Include="..\src\script\api\script_cargo.hpp" />
|
||||
<ClInclude Include="..\src\script\api\script_cargolist.hpp" />
|
||||
<ClInclude Include="..\src\script\api\script_cargomonitor.hpp" />
|
||||
<ClInclude Include="..\src\script\api\script_company.hpp" />
|
||||
<ClInclude Include="..\src\script\api\script_companymode.hpp" />
|
||||
<ClInclude Include="..\src\script\api\script_controller.hpp" />
|
||||
@@ -1008,6 +1019,7 @@
|
||||
<ClCompile Include="..\src\script\api\script_bridgelist.cpp" />
|
||||
<ClCompile Include="..\src\script\api\script_cargo.cpp" />
|
||||
<ClCompile Include="..\src\script\api\script_cargolist.cpp" />
|
||||
<ClCompile Include="..\src\script\api\script_cargomonitor.cpp" />
|
||||
<ClCompile Include="..\src\script\api\script_company.cpp" />
|
||||
<ClCompile Include="..\src\script\api\script_companymode.cpp" />
|
||||
<ClCompile Include="..\src\script\api\script_controller.cpp" />
|
||||
|
||||
@@ -117,6 +117,9 @@
|
||||
<ClCompile Include="..\src\bmp.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\cargomonitor.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\cargopacket.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
@@ -177,6 +180,9 @@
|
||||
<ClCompile Include="..\src\fontcache.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\base_consist.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\gamelog.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
@@ -309,12 +315,18 @@
|
||||
<ClCompile Include="..\src\string.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\stringfilter.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\strings.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\subsidy.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\textbuf.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\texteff.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
@@ -393,6 +405,9 @@
|
||||
<ClInclude Include="..\src\cargo_type.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\cargomonitor.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\cargopacket.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
@@ -534,6 +549,9 @@
|
||||
<ClInclude Include="..\src\fontcache.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\base_consist.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\gamelog.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
@@ -846,6 +864,9 @@
|
||||
<ClInclude Include="..\src\settings_func.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\settings_gui.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\settings_internal.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
@@ -921,6 +942,9 @@
|
||||
<ClInclude Include="..\src\string_type.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\stringfilter_type.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\strings_func.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
@@ -945,6 +969,9 @@
|
||||
<ClInclude Include="..\src\textbuf_gui.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\textbuf_type.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\texteff.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
@@ -1578,6 +1605,9 @@
|
||||
<ClCompile Include="..\src\saveload\autoreplace_sl.cpp">
|
||||
<Filter>Save/Load handlers</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\saveload\cargomonitor_sl.cpp">
|
||||
<Filter>Save/Load handlers</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\saveload\cargopacket_sl.cpp">
|
||||
<Filter>Save/Load handlers</Filter>
|
||||
</ClCompile>
|
||||
@@ -2070,6 +2100,9 @@
|
||||
<ClInclude Include="..\src\script\api\script_cargolist.hpp">
|
||||
<Filter>Script API</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\script\api\script_cargomonitor.hpp">
|
||||
<Filter>Script API</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\script\api\script_company.hpp">
|
||||
<Filter>Script API</Filter>
|
||||
</ClInclude>
|
||||
@@ -2253,6 +2286,9 @@
|
||||
<ClCompile Include="..\src\script\api\script_cargolist.cpp">
|
||||
<Filter>Script API Implementation</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\script\api\script_cargomonitor.cpp">
|
||||
<Filter>Script API Implementation</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\script\api\script_company.cpp">
|
||||
<Filter>Script API Implementation</Filter>
|
||||
</ClCompile>
|
||||
|
||||
@@ -454,6 +454,10 @@
|
||||
RelativePath=".\..\src\bmp.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargomonitor.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargopacket.cpp"
|
||||
>
|
||||
@@ -534,6 +538,10 @@
|
||||
RelativePath=".\..\src\fontcache.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\base_consist.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\gamelog.cpp"
|
||||
>
|
||||
@@ -710,6 +718,10 @@
|
||||
RelativePath=".\..\src\string.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\stringfilter.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\strings.cpp"
|
||||
>
|
||||
@@ -718,6 +730,10 @@
|
||||
RelativePath=".\..\src\subsidy.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\textbuf.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\texteff.cpp"
|
||||
>
|
||||
@@ -826,6 +842,10 @@
|
||||
RelativePath=".\..\src\cargo_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargomonitor.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargopacket.h"
|
||||
>
|
||||
@@ -1014,6 +1034,10 @@
|
||||
RelativePath=".\..\src\fontcache.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\base_consist.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\gamelog.h"
|
||||
>
|
||||
@@ -1430,6 +1454,10 @@
|
||||
RelativePath=".\..\src\settings_func.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\settings_gui.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\settings_internal.h"
|
||||
>
|
||||
@@ -1530,6 +1558,10 @@
|
||||
RelativePath=".\..\src\string_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\stringfilter_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\strings_func.h"
|
||||
>
|
||||
@@ -1562,6 +1594,10 @@
|
||||
RelativePath=".\..\src\textbuf_gui.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\textbuf_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\texteff.hpp"
|
||||
>
|
||||
@@ -2426,6 +2462,10 @@
|
||||
RelativePath=".\..\src\saveload\autoreplace_sl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\saveload\cargomonitor_sl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\saveload\cargopacket_sl.cpp"
|
||||
>
|
||||
@@ -3122,6 +3162,10 @@
|
||||
RelativePath=".\..\src\script\api\script_cargolist.hpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_cargomonitor.hpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_company.hpp"
|
||||
>
|
||||
@@ -3370,6 +3414,10 @@
|
||||
RelativePath=".\..\src\script\api\script_cargolist.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_cargomonitor.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_company.cpp"
|
||||
>
|
||||
|
||||
@@ -451,6 +451,10 @@
|
||||
RelativePath=".\..\src\bmp.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargomonitor.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargopacket.cpp"
|
||||
>
|
||||
@@ -531,6 +535,10 @@
|
||||
RelativePath=".\..\src\fontcache.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\base_consist.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\gamelog.cpp"
|
||||
>
|
||||
@@ -707,6 +715,10 @@
|
||||
RelativePath=".\..\src\string.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\stringfilter.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\strings.cpp"
|
||||
>
|
||||
@@ -715,6 +727,10 @@
|
||||
RelativePath=".\..\src\subsidy.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\textbuf.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\texteff.cpp"
|
||||
>
|
||||
@@ -823,6 +839,10 @@
|
||||
RelativePath=".\..\src\cargo_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargomonitor.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargopacket.h"
|
||||
>
|
||||
@@ -1011,6 +1031,10 @@
|
||||
RelativePath=".\..\src\fontcache.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\base_consist.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\gamelog.h"
|
||||
>
|
||||
@@ -1427,6 +1451,10 @@
|
||||
RelativePath=".\..\src\settings_func.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\settings_gui.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\settings_internal.h"
|
||||
>
|
||||
@@ -1527,6 +1555,10 @@
|
||||
RelativePath=".\..\src\string_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\stringfilter_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\strings_func.h"
|
||||
>
|
||||
@@ -1559,6 +1591,10 @@
|
||||
RelativePath=".\..\src\textbuf_gui.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\textbuf_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\texteff.hpp"
|
||||
>
|
||||
@@ -2423,6 +2459,10 @@
|
||||
RelativePath=".\..\src\saveload\autoreplace_sl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\saveload\cargomonitor_sl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\saveload\cargopacket_sl.cpp"
|
||||
>
|
||||
@@ -3119,6 +3159,10 @@
|
||||
RelativePath=".\..\src\script\api\script_cargolist.hpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_cargomonitor.hpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_company.hpp"
|
||||
>
|
||||
@@ -3367,6 +3411,10 @@
|
||||
RelativePath=".\..\src\script\api\script_cargolist.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_cargomonitor.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_company.cpp"
|
||||
>
|
||||
|
||||
+77
-59
@@ -1,6 +1,6 @@
|
||||
OpenTTD readme
|
||||
Last updated: 2012-03-04
|
||||
Release version: 1.2.0-RC2
|
||||
Last updated: 2012-12-24
|
||||
Release version: 1.3.0-beta1
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -80,8 +80,10 @@ After you have done all that you can report the bug. Please include the
|
||||
following information in your bug report:
|
||||
* OpenTTD version (PLEASE test the latest SVN/nightly build)
|
||||
* Bug details, including instructions how to reproduce it
|
||||
* Platform (Win32, Linux, FreeBSD, ...) and compiler (including version) if
|
||||
* Platform (Windows, Linux, FreeBSD, ...) and compiler (including version) if
|
||||
you compiled OpenTTD yourself.
|
||||
* The processor architecture of your OS (32 bits Windows, 64 bits Windows,
|
||||
Linux on an ARM, Mac OS X on a PowerPC, ...)
|
||||
* Attach a saved game *and* a screenshot if possible
|
||||
* If this bug only occurred recently please note the last version without
|
||||
the bug and the first version including the bug. That way we can fix it
|
||||
@@ -145,9 +147,9 @@ will not be able to reproduce the desync and thus will be unable to fix it.
|
||||
|
||||
3.0) Supported platforms
|
||||
---- -------------------
|
||||
OpenTTD has been ported to several platforms and operating systems. It shouldn't
|
||||
be very difficult to port it to a new platform. The currently working platforms
|
||||
are:
|
||||
OpenTTD has been ported to several platforms and operating systems. It should
|
||||
not be very difficult to port it to a new platform. The currently working
|
||||
platforms are:
|
||||
|
||||
BeOS - SDL or Allegro
|
||||
DOS - Allegro
|
||||
@@ -168,7 +170,7 @@ be installed, or you have downloaded an installer, which will automatically
|
||||
extract OpenTTD in the given directory.
|
||||
|
||||
OpenTTD looks in multiple locations to find the required data files (described
|
||||
in section 4.2). Installing any 3rd party files into a "shared" location has
|
||||
in section 4.2). Installing any 3rd party files into a 'shared' location has
|
||||
the advantage that you only need to do this step once, rather than copying the
|
||||
data files into all OpenTTD versions you have.
|
||||
Savegames, screenshots, etc are saved relative to the config file (openttd.cfg)
|
||||
@@ -177,15 +179,16 @@ shared directories, savegames will reside in the save/ directory next to the
|
||||
openttd.cfg file there.
|
||||
If you want savegames and screenshots in the directory where the OpenTTD binary
|
||||
resides, simply have your config file in that location. But if you remove this
|
||||
config file, savegames will still be in this directory (see notes in section 4.2)
|
||||
config file, savegames will still be in this directory (see notes in
|
||||
section 4.2 'OpenTTD directories')
|
||||
|
||||
OpenTTD comes without AIs, so if you want to play with AIs you have to download
|
||||
them. The easiest way is via the "Check Online Content" button in the main menu.
|
||||
them. The easiest way is via the 'Check Online Content' button in the main menu.
|
||||
You can select some AIs that you think are compatible with your playing style.
|
||||
Another way is manually downloading the AIs from the forum although then you
|
||||
need to make sure that you install all the required AI libraries too; they get
|
||||
automatically selected (and downloaded) if you get the AIs via the "Check
|
||||
Online Content". If you do not have an AI but have configured OpenTTD to start
|
||||
automatically selected (and downloaded) if you get the AIs via the 'Check
|
||||
Online Content'. If you do not have an AI but have configured OpenTTD to start
|
||||
an AI a message will be shown that the 'dummy' AI has been started.
|
||||
|
||||
4.1) (Required) 3rd party files
|
||||
@@ -198,7 +201,7 @@ For OpenTTD you need to acquire some third party data files. For this you have
|
||||
the choice of using the original Transport Tycoon Deluxe data files or a set
|
||||
of free data files.
|
||||
|
||||
Do NOT copy files included with OpenTTD into "shared" directories (explained in
|
||||
Do NOT copy files included with OpenTTD into 'shared' directories (explained in
|
||||
the following sections) as sooner or later you will run into graphical glitches
|
||||
when using other versions of the game.
|
||||
|
||||
@@ -239,7 +242,7 @@ not work.
|
||||
If you want AIs use the in-game content downloader. If for some reason that is
|
||||
not possible or you want to use an AI that has not been uploaded to the content
|
||||
download system download the tar file and place it in the ai/ directory. If the
|
||||
AI needs libraries you'll have to download those too and put them in the
|
||||
AI needs libraries you will have to download those too and put them in the
|
||||
ai/library/ directory. All AIs and AI Libraries that have been uploaded to
|
||||
the content download system can be found at http://noai.openttd.org/downloads/
|
||||
The AIs and libraries can be found their in the form of .tar.gz packages.
|
||||
@@ -247,20 +250,32 @@ OpenTTD can read inside tar files but it does not extract .tar.gz files by
|
||||
itself.
|
||||
To figure out which libraries you need for an AI you have to start the AI and
|
||||
wait for an error message to pop up. The error message will tell you
|
||||
"couldn't find library 'lib-name'". Download that library and try again.
|
||||
'could not find library "lib-name"'. Download that library and try again.
|
||||
|
||||
4.1.5) Game scripts
|
||||
------ ------------
|
||||
If you want an extra challenge in OpenTTD you can download so-called game
|
||||
scripts via the in-game content downloader. These game scripts have varying
|
||||
functionality, though they can generally influence town growth, subsidies, add
|
||||
goals to reach or provide a different ranking system.
|
||||
If you download a game script manually you have to follow the same rules as for
|
||||
AIs, except that game scripts are placed in the game/ directory instead of the
|
||||
ai/ directory.
|
||||
|
||||
|
||||
4.2) OpenTTD directories
|
||||
---- -------------------
|
||||
OpenTTD uses its own directory to store its required 3rd party base set files (see section
|
||||
4.1 "Required 3rd party files") and non-compulsory extension and configuration files. See
|
||||
below for their proper place within this OpenTTD main data directory.
|
||||
OpenTTD uses its own directory to store its required 3rd party base set files
|
||||
(see section 4.1 'Required 3rd party files') and non-compulsory extension and
|
||||
configuration files. See below for their proper place within this OpenTTD main
|
||||
data directory.
|
||||
|
||||
The main OpenTTD directories can be found in various locations, depending on your operating
|
||||
system:
|
||||
The main OpenTTD directories can be found in various locations, depending on
|
||||
your operating system:
|
||||
1. The current working directory (from where you started OpenTTD)
|
||||
For non-Windows operating systems OpenTTD will not scan for files in this
|
||||
directory if it is your personal directory, i.e. "~/", or when it is the
|
||||
root directory, i.e. "/".
|
||||
directory if it is your personal directory, i.e. '~/', or when it is the
|
||||
root directory, i.e. '/'.
|
||||
2. Your personal directory
|
||||
Windows: C:\My Documents\OpenTTD (95, 98, ME)
|
||||
C:\Documents and Settings\<username>\My Documents\OpenTTD (2000, XP)
|
||||
@@ -278,13 +293,13 @@ system:
|
||||
5. The installation directory (Linux only)
|
||||
Linux: /usr/share/games/openttd
|
||||
6. The application bundle (Mac OSX only)
|
||||
It includes the OpenTTD files (grf+lng) and it will work as long as they aren't
|
||||
touched
|
||||
It includes the OpenTTD files (grf+lng) and it will work as long as they
|
||||
are not touched
|
||||
|
||||
Different types of data or extensions go into different subdirectories of the chosen main
|
||||
OpenTTD directory:
|
||||
Different types of data or extensions go into different subdirectories of the
|
||||
chosen main OpenTTD directory:
|
||||
Config File: (no subdirectory)
|
||||
Screenshots: (no subdirectory)
|
||||
Screenshots: screenshot
|
||||
Base Graphics: baseset (or a subdirectory thereof)
|
||||
Sound Sets: baseset (or a subdirectory thereof)
|
||||
NewGRFs: newgrf (or a subdirectory thereof)
|
||||
@@ -298,21 +313,24 @@ OpenTTD directory:
|
||||
Automatic Savegames: save/autosave
|
||||
Scenarios: scenario
|
||||
|
||||
The (automatically created) directory content_download is for OpenTTD's internal use and
|
||||
no files should be added to it or its subdirectories manually.
|
||||
The (automatically created) directory content_download is for OpenTTD's internal
|
||||
use and no files should be added to it or its subdirectories manually.
|
||||
|
||||
Notes:
|
||||
- Linux in the previous list means .deb, but most paths should be similar for others.
|
||||
- Linux in the previous list means .deb, but most paths should be similar for
|
||||
others.
|
||||
- The previous search order is also used for NewGRFs and openttd.cfg.
|
||||
- If openttd.cfg is not found, then it will be created using the 2, 4, 1, 3, 5 order.
|
||||
- If openttd.cfg is not found, then it will be created using the 2, 4, 1, 3,
|
||||
5 order.
|
||||
- Savegames will be relative to the config file only if there is no save/
|
||||
directory in paths with higher priority than the config file path, but
|
||||
autosaves and screenshots will always be relative to the config file.
|
||||
|
||||
The preferred setup:
|
||||
Place 3rd party files in shared directory (or in personal directory if you don't
|
||||
have write access on shared directory) and have your openttd.cfg config file in
|
||||
personal directory (where the game will then also place savegames and screenshots).
|
||||
Place 3rd party files in shared directory (or in personal directory if you do
|
||||
not have write access on shared directory) and have your openttd.cfg config
|
||||
file in personal directory (where the game will then also place savegames and
|
||||
screenshots).
|
||||
|
||||
4.3) Portable installations (portable media)
|
||||
---- ---------------------------------------
|
||||
@@ -334,12 +352,10 @@ makes it easy to bundle files belonging to the same script, NewGRF or base
|
||||
set. Music sets are the only exception as they cannot be stored in a tar
|
||||
file due to being played by external applications.
|
||||
|
||||
OpenTTD sees each tar archive as the 'root' of its search path. This means
|
||||
that having a file with the same path in two different tar files means that
|
||||
one cannot be opened, after all only one file will be found first. This is
|
||||
done to make it possible to have the large 32bpp zoomed graphics in a separate
|
||||
file to the (relatively small) unzoomed 8bpp NewGRF. As such it is advisable
|
||||
to put an uniquely named folder in the root of the tar and put all the
|
||||
OpenTTD sees each tar archive as the 'root' of its search path. This means that
|
||||
having a file with the same path in two different tar files means that one
|
||||
cannot be opened, after all only one file will be found first. As such it is
|
||||
advisable to put an uniquely named folder in the root of the tar and put all the
|
||||
content in that folder. For example, all downloaded content has a path that
|
||||
concatenates the name of the content and the version, which makes the path
|
||||
unique. For custom tar files it is advised to do this as well.
|
||||
@@ -405,7 +421,7 @@ OpenTTD in debug mode.
|
||||
6.0) Configuration file
|
||||
---- ------------------
|
||||
The configuration file for OpenTTD (openttd.cfg) is in a simple Windows-like
|
||||
.INI format. It's mostly undocumented. Almost all settings can be changed
|
||||
.INI format. It is mostly undocumented. Almost all settings can be changed
|
||||
ingame by using the 'Advanced Settings' window.
|
||||
When you cannot find openttd.cfg you should look in the directories as
|
||||
described in section 4.2. If you do not have an openttd.cfg OpenTTD will
|
||||
@@ -429,24 +445,24 @@ Windows:
|
||||
Please read the Makefile for more information.
|
||||
|
||||
Solaris, FreeBSD, OpenBSD:
|
||||
Use "gmake", but do a "./configure" before the first build.
|
||||
Use 'gmake', but do a './configure' before the first build.
|
||||
|
||||
Linux/Unix:
|
||||
OpenTTD can be built with GNU "make". On non-GNU systems it's called "gmake".
|
||||
However, for the first build one has to do a "./configure" first.
|
||||
OpenTTD can be built with GNU 'make'. On non-GNU systems it is called 'gmake'.
|
||||
However, for the first build one has to do a './configure' first.
|
||||
|
||||
MacOS X:
|
||||
Use "make" or Xcode (which will then call make for you)
|
||||
Use 'make' or Xcode (which will then call make for you)
|
||||
This will give you a binary for your CPU type (PPC/Intel)
|
||||
However, for the first build one has to do a "./configure" first.
|
||||
To make a universal binary type "./configure --enabled-universal"
|
||||
instead of "./configure".
|
||||
However, for the first build one has to do a './configure' first.
|
||||
To make a universal binary type './configure --enabled-universal'
|
||||
instead of './configure'.
|
||||
|
||||
BeOS:
|
||||
Use "make", but do a "./configure" before the first build.
|
||||
Use 'make', but do a './configure' before the first build.
|
||||
|
||||
MorphOS:
|
||||
Use "make". However, for the first build one has to do a "./configure" first.
|
||||
Use 'make'. However, for the first build one has to do a './configure' first.
|
||||
Note that you need the MorphOS SDK, latest libnix updates (else C++ parts of
|
||||
OpenTTD will not build) and the powersdl.library SDK. Optionally libz,
|
||||
libpng and freetype2 developer files.
|
||||
@@ -458,7 +474,7 @@ OS/2:
|
||||
DOS:
|
||||
A build environment with DJGPP is needed as well as libraries such as
|
||||
Allegro, zlib and libpng, which all can be downloaded from the DJGPP
|
||||
website. Compilation is straight forward: use make, but do a "./configure"
|
||||
website. Compilation is straight forward: use make, but do a './configure'
|
||||
before the first build. The build binary will need cwsdpmi.exe to be in
|
||||
the same directory as the openttd executable. cwsdpmi.exe can be found in
|
||||
the os/dos subdirectory. If you compile with stripping turned on a binary
|
||||
@@ -489,7 +505,7 @@ To recompile the extra graphics needed to play with the original Transport
|
||||
Tycoon Deluxe graphics you need GRFCodec (which includes NFORenum) as well.
|
||||
GRFCodec can be found at: http://www.openttd.org/download-grfcodec
|
||||
The compilation of these extra graphics does generally not happen, unless
|
||||
you remove the graphics file using "make maintainer-clean".
|
||||
you remove the graphics file using 'make maintainer-clean'.
|
||||
|
||||
7.2) Supported compilers
|
||||
---- -------------------
|
||||
@@ -537,7 +553,7 @@ someone else may have already started translating to the same language.
|
||||
|
||||
8.1) Translation
|
||||
---- -----------
|
||||
So, now that you've notified the development team about your intention to
|
||||
So, now that you have notified the development team about your intention to
|
||||
translate (You did, right? Of course you did.) you can pick up english.txt
|
||||
(found in the SVN repository under /src/lang) and translate.
|
||||
|
||||
@@ -571,17 +587,17 @@ Any missing strings are replaced with the English strings. Note that it looks
|
||||
for english.txt in the lang subdirectory, which is where your language file
|
||||
should also be.
|
||||
|
||||
That's all! You should now be able to select the language in the game options.
|
||||
That is all! You should now be able to select the language in the game options.
|
||||
|
||||
|
||||
9.0) Troubleshooting
|
||||
---- ---------------
|
||||
To see all startup options available to you, start OpenTTD with the
|
||||
"./openttd -h" option. This might help you tweak some of the settings.
|
||||
'./openttd -h' option. This might help you tweak some of the settings.
|
||||
|
||||
If the game is acting strange and you feel adventurous you can try the
|
||||
"-d [[<name>]=[<level>]" flag, where the higher levels will give you more
|
||||
debugging output. The "name" variable can help you to display only some type of
|
||||
'-d [[<name>=]<level>]' flag, where the higher levels will give you more
|
||||
debugging output. The 'name' variable can help you to display only some type of
|
||||
debugging messages. This is mostly undocumented so best is to look in the
|
||||
source code file debug.c for the various debugging types. For more information
|
||||
look at http://wiki.openttd.org/index.php/Command_line.
|
||||
@@ -604,17 +620,17 @@ and add a suitable font for the small, medium and / or large font, e.g.:
|
||||
small_font = "Tahoma"
|
||||
medium_font = "Tahoma"
|
||||
large_font = "Tahoma"
|
||||
You should use a font name like "Tahoma" or a path to the desired font.
|
||||
You should use a font name like 'Tahoma' or a path to the desired font.
|
||||
|
||||
Any NewGRF file used in a game is stored inside the savegame and will refuse
|
||||
to load if you don't have that NewGRF file available. A list of missing files
|
||||
to load if you do not have that NewGRF file available. A list of missing files
|
||||
can be viewed in the NewGRF window accessible from the file load dialogue window.
|
||||
|
||||
You can try to obtain the missing files from that NewGRF dialogue or - if they
|
||||
are not available online - you can search manually through our forum's graphics
|
||||
development section (http://www.tt-forums.net/viewforum.php?f=66) or GrfCrawler
|
||||
(http://grfcrawler.tt-forums.net/). Put the NewGRF files in OpenTTD's newgrf folder
|
||||
(see section 4.2 "OpenTTD directories") and rescan the list of available NewGRFs.
|
||||
(see section 4.2 'OpenTTD directories') and rescan the list of available NewGRFs.
|
||||
Once you have all missing files, you are set to go.
|
||||
|
||||
|
||||
@@ -634,6 +650,7 @@ The OpenTTD team (in alphabetical order):
|
||||
Zdeněk Sojka (SmatZ) - Bug finder and fixer
|
||||
José Soler (Terkhen) - General coding
|
||||
Thijs Marinussen (Yexo) - AI Framework
|
||||
Leif Linse (Zuu) - AI/Game Script
|
||||
|
||||
Inactive Developers:
|
||||
Bjarni Corfitzen (Bjarni) - MacOSX port, coder and vehicles
|
||||
@@ -667,6 +684,7 @@ Thanks to:
|
||||
George - Canal graphics
|
||||
Andrew Parkhouse (andythenorth) - River graphics
|
||||
David Dallaston (Pikka) - Tram tracks
|
||||
Marcin Grzegorczyk - Foundations for tracks on slopes,
|
||||
All Translators - For their support to make OpenTTD a truly international game
|
||||
Bug Reporters - Thanks for all bug reports
|
||||
Chris Sawyer - For an amazing game!
|
||||
|
||||
+12
@@ -4,6 +4,7 @@ animated_tile.cpp
|
||||
articulated_vehicles.cpp
|
||||
autoreplace.cpp
|
||||
bmp.cpp
|
||||
cargomonitor.cpp
|
||||
cargopacket.cpp
|
||||
cargotype.cpp
|
||||
cheat.cpp
|
||||
@@ -24,6 +25,7 @@ engine.cpp
|
||||
fileio.cpp
|
||||
fios.cpp
|
||||
fontcache.cpp
|
||||
base_consist.cpp
|
||||
gamelog.cpp
|
||||
genworld.cpp
|
||||
gfx.cpp
|
||||
@@ -70,8 +72,10 @@ spritecache.cpp
|
||||
station.cpp
|
||||
strgen/strgen_base.cpp
|
||||
string.cpp
|
||||
stringfilter.cpp
|
||||
strings.cpp
|
||||
subsidy.cpp
|
||||
textbuf.cpp
|
||||
texteff.cpp
|
||||
tgp.cpp
|
||||
tile_map.cpp
|
||||
@@ -121,6 +125,7 @@ base_station_base.h
|
||||
bmp.h
|
||||
bridge.h
|
||||
cargo_type.h
|
||||
cargomonitor.h
|
||||
cargopacket.h
|
||||
cargotype.h
|
||||
cheat_func.h
|
||||
@@ -168,6 +173,7 @@ fileio_func.h
|
||||
fileio_type.h
|
||||
fios.h
|
||||
fontcache.h
|
||||
base_consist.h
|
||||
gamelog.h
|
||||
gamelog_internal.h
|
||||
genworld.h
|
||||
@@ -272,6 +278,7 @@ sdl.h
|
||||
sound/sdl_s.h
|
||||
video/sdl_v.h
|
||||
settings_func.h
|
||||
settings_gui.h
|
||||
settings_internal.h
|
||||
settings_type.h
|
||||
ship.h
|
||||
@@ -297,6 +304,7 @@ stdafx.h
|
||||
strgen/strgen.h
|
||||
string_func.h
|
||||
string_type.h
|
||||
stringfilter_type.h
|
||||
strings_func.h
|
||||
strings_type.h
|
||||
subsidy_base.h
|
||||
@@ -305,6 +313,7 @@ subsidy_type.h
|
||||
tar_type.h
|
||||
terraform_gui.h
|
||||
textbuf_gui.h
|
||||
textbuf_type.h
|
||||
texteff.hpp
|
||||
textfile_gui.h
|
||||
textfile_type.h
|
||||
@@ -541,6 +550,7 @@ saveload/ai_sl.cpp
|
||||
saveload/airport_sl.cpp
|
||||
saveload/animated_tile_sl.cpp
|
||||
saveload/autoreplace_sl.cpp
|
||||
saveload/cargomonitor_sl.cpp
|
||||
saveload/cargopacket_sl.cpp
|
||||
saveload/cheat_sl.cpp
|
||||
saveload/company_sl.cpp
|
||||
@@ -725,6 +735,7 @@ script/api/script_bridge.hpp
|
||||
script/api/script_bridgelist.hpp
|
||||
script/api/script_cargo.hpp
|
||||
script/api/script_cargolist.hpp
|
||||
script/api/script_cargomonitor.hpp
|
||||
script/api/script_company.hpp
|
||||
script/api/script_companymode.hpp
|
||||
script/api/script_controller.hpp
|
||||
@@ -788,6 +799,7 @@ script/api/script_bridge.cpp
|
||||
script/api/script_bridgelist.cpp
|
||||
script/api/script_cargo.cpp
|
||||
script/api/script_cargolist.cpp
|
||||
script/api/script_cargomonitor.cpp
|
||||
script/api/script_company.cpp
|
||||
script/api/script_companymode.cpp
|
||||
script/api/script_controller.cpp
|
||||
|
||||
+10
-4
@@ -210,16 +210,22 @@ static SQInteger base_suspend(HSQUIRRELVM v)
|
||||
static SQInteger base_array(HSQUIRRELVM v)
|
||||
{
|
||||
SQArray *a;
|
||||
SQObject &size = stack_get(v,2);
|
||||
SQInteger nInitialSize = tointeger(stack_get(v,2));
|
||||
SQInteger ret = 1;
|
||||
if (nInitialSize < 0) {
|
||||
v->Raise_Error(_SC("can't create/resize array with/to size %d"), nInitialSize);
|
||||
nInitialSize = 0;
|
||||
ret = -1;
|
||||
}
|
||||
if(sq_gettop(v) > 2) {
|
||||
a = SQArray::Create(_ss(v),0);
|
||||
a->Resize(tointeger(size),stack_get(v,3));
|
||||
a->Resize(nInitialSize,stack_get(v,3));
|
||||
}
|
||||
else {
|
||||
a = SQArray::Create(_ss(v),tointeger(size));
|
||||
a = SQArray::Create(_ss(v),nInitialSize);
|
||||
}
|
||||
v->Push(a);
|
||||
return 1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static SQInteger base_type(HSQUIRRELVM v)
|
||||
|
||||
+29
-5
@@ -14,6 +14,7 @@
|
||||
|
||||
#include "../script/api/script_event_types.hpp"
|
||||
#include "../core/string_compare_type.hpp"
|
||||
#include "ai_scanner.hpp"
|
||||
#include <map>
|
||||
|
||||
/** A list that maps AI names to their AIInfo object. */
|
||||
@@ -67,13 +68,30 @@ public:
|
||||
static void Stop(CompanyID company);
|
||||
|
||||
/**
|
||||
* Suspend an AI for the reminder of the current tick. If the AI is
|
||||
* in a state when it cannot be suspended, it will continue to run
|
||||
* until it can be suspended.
|
||||
* @param company The company for which the AI should be suspended.
|
||||
* Suspend the AI and then pause execution of the script. The script
|
||||
* will not be resumed from its suspended state until the script has
|
||||
* been unpaused.
|
||||
* @param company The company for which the AI should be paused.
|
||||
* @pre Company::IsValidAiID(company)
|
||||
*/
|
||||
static void Suspend(CompanyID company);
|
||||
static void Pause(CompanyID company);
|
||||
|
||||
/**
|
||||
* Resume execution of the AI. This function will not actually execute
|
||||
* the script, but set a flag so that the script is executed my the usual
|
||||
* mechanism that executes the script.
|
||||
* @param company The company for which the AI should be unpaused.
|
||||
* @pre Company::IsValidAiID(company)
|
||||
*/
|
||||
static void Unpause(CompanyID company);
|
||||
|
||||
/**
|
||||
* Checks if the AI is paused.
|
||||
* @param company The company for which to check if the AI is paused.
|
||||
* @pre Company::IsValidAiID(company)
|
||||
* @return true if the AI is paused, otherwise false.
|
||||
*/
|
||||
static bool IsPaused(CompanyID company);
|
||||
|
||||
/**
|
||||
* Kill any and all AIs we manage.
|
||||
@@ -140,6 +158,12 @@ public:
|
||||
* found it is removed from the config.
|
||||
*/
|
||||
static void Rescan();
|
||||
|
||||
/** Gets the ScriptScanner instance that is used to find AIs */
|
||||
static AIScannerInfo *GetScannerInfo();
|
||||
/** Gets the ScriptScanner instance that is used to find AI Libraries */
|
||||
static AIScannerLibrary *GetScannerLibrary();
|
||||
|
||||
#if defined(ENABLE_NETWORK)
|
||||
/** Wrapper function for AIScanner::HasAI */
|
||||
static bool HasAI(const struct ContentInfo *ci, bool md5sum);
|
||||
|
||||
@@ -28,7 +28,8 @@ ScriptConfigItem _start_date_config = {
|
||||
AI::START_NEXT_DEVIATION,
|
||||
30,
|
||||
SCRIPTCONFIG_NONE,
|
||||
NULL
|
||||
NULL,
|
||||
false
|
||||
};
|
||||
|
||||
/* static */ AIConfig *AIConfig::GetConfig(CompanyID company, ScriptSettingSource source)
|
||||
@@ -79,13 +80,13 @@ int AIConfig::GetSetting(const char *name) const
|
||||
{
|
||||
if (this->info == NULL) {
|
||||
SettingValueList::const_iterator it = this->settings.find(name);
|
||||
if (it == this->settings.end() || GetGameSettings().difficulty.diff_level != 3) {
|
||||
if (it == this->settings.end()) {
|
||||
assert(strcmp("start_date", name) == 0);
|
||||
switch (GetGameSettings().difficulty.diff_level) {
|
||||
case 0: return AI::START_NEXT_EASY;
|
||||
case 1: return AI::START_NEXT_MEDIUM;
|
||||
case 2: return AI::START_NEXT_HARD;
|
||||
case 3: return AI::START_NEXT_MEDIUM;
|
||||
switch (GetGameSettings().script.settings_profile) {
|
||||
case SP_EASY: return AI::START_NEXT_EASY;
|
||||
case SP_MEDIUM: return AI::START_NEXT_MEDIUM;
|
||||
case SP_HARD: return AI::START_NEXT_HARD;
|
||||
case SP_CUSTOM: return AI::START_NEXT_MEDIUM;
|
||||
default: NOT_REACHED();
|
||||
}
|
||||
}
|
||||
|
||||
+37
-5
@@ -39,7 +39,7 @@
|
||||
/* Clients shouldn't start AIs */
|
||||
if (_networking && !_network_server) return;
|
||||
|
||||
AIConfig *config = AIConfig::GetConfig(company);
|
||||
AIConfig *config = AIConfig::GetConfig(company, AIConfig::SSS_FORCE_GAME);
|
||||
AIInfo *info = config->GetInfo();
|
||||
if (info == NULL || (rerandomise_ai && config->IsRandom())) {
|
||||
info = AI::scanner_info->SelectRandomAI();
|
||||
@@ -112,16 +112,37 @@
|
||||
DeleteWindowById(WC_AI_SETTINGS, company);
|
||||
}
|
||||
|
||||
/* static */ void AI::Suspend(CompanyID company)
|
||||
/* static */ void AI::Pause(CompanyID company)
|
||||
{
|
||||
if (_networking && !_network_server) return;
|
||||
/* The reason why dedicated servers are forbidden to execute this
|
||||
* command is not because it is unsafe, but because there is no way
|
||||
* for the server owner to unpause the script again. */
|
||||
if (_network_dedicated) return;
|
||||
|
||||
Backup<CompanyByte> cur_company(_current_company, company, FILE_LINE);
|
||||
Company::Get(company)->ai_instance->Suspend();
|
||||
Company::Get(company)->ai_instance->Pause();
|
||||
|
||||
cur_company.Restore();
|
||||
}
|
||||
|
||||
/* static */ void AI::Unpause(CompanyID company)
|
||||
{
|
||||
Backup<CompanyByte> cur_company(_current_company, company, FILE_LINE);
|
||||
Company::Get(company)->ai_instance->Unpause();
|
||||
|
||||
cur_company.Restore();
|
||||
}
|
||||
|
||||
/* static */ bool AI::IsPaused(CompanyID company)
|
||||
{
|
||||
Backup<CompanyByte> cur_company(_current_company, company, FILE_LINE);
|
||||
bool paused = Company::Get(company)->ai_instance->IsPaused();
|
||||
|
||||
cur_company.Restore();
|
||||
|
||||
return paused;
|
||||
}
|
||||
|
||||
/* static */ void AI::KillAll()
|
||||
{
|
||||
/* It might happen there are no companies .. than we have nothing to loop */
|
||||
@@ -283,7 +304,7 @@
|
||||
{
|
||||
/* Find the first company which doesn't exist yet */
|
||||
for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
|
||||
if (!Company::IsValidID(c)) return AIConfig::GetConfig(c)->GetSetting("start_date");
|
||||
if (!Company::IsValidID(c)) return AIConfig::GetConfig(c, AIConfig::SSS_FORCE_GAME)->GetSetting("start_date");
|
||||
}
|
||||
|
||||
/* Currently no AI can be started, check again in a year. */
|
||||
@@ -352,3 +373,14 @@
|
||||
}
|
||||
|
||||
#endif /* defined(ENABLE_NETWORK) */
|
||||
|
||||
/* static */ AIScannerInfo *AI::GetScannerInfo()
|
||||
{
|
||||
return AI::scanner_info;
|
||||
}
|
||||
|
||||
/* static */ AIScannerLibrary *AI::GetScannerLibrary()
|
||||
{
|
||||
return AI::scanner_library;
|
||||
}
|
||||
|
||||
|
||||
+275
-101
@@ -12,8 +12,9 @@
|
||||
#include "../stdafx.h"
|
||||
#include "../table/sprites.h"
|
||||
#include "../error.h"
|
||||
#include "../gui.h"
|
||||
#include "../settings_gui.h"
|
||||
#include "../querystring_gui.h"
|
||||
#include "../stringfilter_type.h"
|
||||
#include "../company_base.h"
|
||||
#include "../company_gui.h"
|
||||
#include "../strings_func.h"
|
||||
@@ -24,6 +25,9 @@
|
||||
#include "../settings_func.h"
|
||||
#include "../network/network_content.h"
|
||||
#include "../textfile_gui.h"
|
||||
#include "../widgets/dropdown_type.h"
|
||||
#include "../widgets/dropdown_func.h"
|
||||
#include "../hotkeys.h"
|
||||
|
||||
#include "ai.hpp"
|
||||
#include "../script/api/script_log.hpp"
|
||||
@@ -118,13 +122,13 @@ struct AIListWindow : public Window {
|
||||
int y = this->GetWidget<NWidgetBase>(WID_AIL_LIST)->pos_y;
|
||||
/* First AI in the list is hardcoded to random */
|
||||
if (this->vscroll->IsVisible(0)) {
|
||||
DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_LEFT, y + WD_MATRIX_TOP, this->slot == OWNER_DEITY ? STR_AI_CONFIG_NONE : STR_AI_CONFIG_RANDOM_AI, this->selected == -1 ? TC_WHITE : TC_BLACK);
|
||||
DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_LEFT, y + WD_MATRIX_TOP, this->slot == OWNER_DEITY ? STR_AI_CONFIG_NONE : STR_AI_CONFIG_RANDOM_AI, this->selected == -1 ? TC_WHITE : TC_ORANGE);
|
||||
y += this->line_height;
|
||||
}
|
||||
ScriptInfoList::const_iterator it = this->info_list->begin();
|
||||
for (int i = 1; it != this->info_list->end(); i++, it++) {
|
||||
if (this->vscroll->IsVisible(i)) {
|
||||
DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, (*it).second->GetName(), (this->selected == i - 1) ? TC_WHITE : TC_BLACK);
|
||||
DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, (*it).second->GetName(), (this->selected == i - 1) ? TC_WHITE : TC_ORANGE);
|
||||
y += this->line_height;
|
||||
}
|
||||
}
|
||||
@@ -151,7 +155,7 @@ struct AIListWindow : public Window {
|
||||
y += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL;
|
||||
}
|
||||
SetDParamStr(0, selected_info->GetDescription());
|
||||
DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, r.bottom - WD_FRAMERECT_BOTTOM, STR_JUST_RAW_STRING, TC_BLACK);
|
||||
DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, r.bottom - WD_FRAMERECT_BOTTOM, STR_JUST_RAW_STRING, TC_WHITE);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -256,7 +260,7 @@ static const NWidgetPart _nested_ai_list_widgets[] = {
|
||||
static const WindowDesc _ai_list_desc(
|
||||
WDP_CENTER, 200, 234,
|
||||
WC_AI_LIST, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
0,
|
||||
_nested_ai_list_widgets, lengthof(_nested_ai_list_widgets)
|
||||
);
|
||||
|
||||
@@ -278,6 +282,8 @@ struct AISettingsWindow : public Window {
|
||||
ScriptConfig *ai_config; ///< The configuration we're modifying.
|
||||
int clicked_button; ///< The button we clicked.
|
||||
bool clicked_increase; ///< Whether we clicked the increase or decrease button.
|
||||
bool clicked_dropdown; ///< Whether the dropdown is open.
|
||||
bool closing_dropdown; ///< True, if the dropdown list is currently closing.
|
||||
int timeout; ///< Timeout for unclicking the button.
|
||||
int clicked_row; ///< The clicked row of settings.
|
||||
int line_height; ///< Height of a row in the matrix widget.
|
||||
@@ -293,6 +299,8 @@ struct AISettingsWindow : public Window {
|
||||
AISettingsWindow(const WindowDesc *desc, CompanyID slot) : Window(),
|
||||
slot(slot),
|
||||
clicked_button(-1),
|
||||
clicked_dropdown(false),
|
||||
closing_dropdown(false),
|
||||
timeout(0)
|
||||
{
|
||||
this->ai_config = GetConfig(slot);
|
||||
@@ -355,12 +363,13 @@ struct AISettingsWindow : public Window {
|
||||
for (; !this->vscroll->IsVisible(i); i++) it++;
|
||||
|
||||
bool rtl = _current_text_dir == TD_RTL;
|
||||
uint buttons_left = rtl ? r.right - 23 : r.left + 4;
|
||||
uint text_left = r.left + (rtl ? WD_FRAMERECT_LEFT : 28);
|
||||
uint text_right = r.right - (rtl ? 28 : WD_FRAMERECT_RIGHT);
|
||||
uint buttons_left = rtl ? r.right - SETTING_BUTTON_WIDTH - 3 : r.left + 4;
|
||||
uint text_left = r.left + (rtl ? WD_FRAMERECT_LEFT : SETTING_BUTTON_WIDTH + 8);
|
||||
uint text_right = r.right - (rtl ? SETTING_BUTTON_WIDTH + 8 : WD_FRAMERECT_RIGHT);
|
||||
|
||||
|
||||
int y = r.top;
|
||||
int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
|
||||
for (; this->vscroll->IsVisible(i) && it != visible_settings.end(); i++, it++) {
|
||||
const ScriptConfigItem &config_item = **it;
|
||||
int current_value = config->GetSetting((config_item).name);
|
||||
@@ -385,10 +394,14 @@ struct AISettingsWindow : public Window {
|
||||
}
|
||||
|
||||
if ((config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0) {
|
||||
DrawBoolButton(buttons_left, y + 2, current_value != 0, editable);
|
||||
DrawBoolButton(buttons_left, y + button_y_offset, current_value != 0, editable);
|
||||
SetDParam(idx++, current_value == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON);
|
||||
} else {
|
||||
DrawArrowButtons(buttons_left, y + 2, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, editable && current_value > config_item.min_value, editable && current_value < config_item.max_value);
|
||||
if (config_item.complete_labels) {
|
||||
DrawDropDownButton(buttons_left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable);
|
||||
} else {
|
||||
DrawArrowButtons(buttons_left, y + button_y_offset, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, editable && current_value > config_item.min_value, editable && current_value < config_item.max_value);
|
||||
}
|
||||
if (config_item.labels != NULL && config_item.labels->Contains(current_value)) {
|
||||
SetDParam(idx++, STR_JUST_RAW_STRING);
|
||||
SetDParamStr(idx++, config_item.labels->Find(current_value)->second);
|
||||
@@ -403,19 +416,13 @@ struct AISettingsWindow : public Window {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether we modified the difficulty level or not.
|
||||
*/
|
||||
void CheckDifficultyLevel()
|
||||
virtual void OnPaint()
|
||||
{
|
||||
if (_game_mode == GM_MENU) {
|
||||
if (_settings_newgame.difficulty.diff_level != 3) {
|
||||
_settings_newgame.difficulty.diff_level = 3;
|
||||
ShowErrorMessage(STR_WARNING_DIFFICULTY_TO_CUSTOM, INVALID_STRING_ID, WL_WARNING);
|
||||
}
|
||||
} else if (_settings_game.difficulty.diff_level != 3) {
|
||||
IConsoleSetSetting("difficulty.diff_level", 3);
|
||||
if (this->closing_dropdown) {
|
||||
this->closing_dropdown = false;
|
||||
this->clicked_dropdown = false;
|
||||
}
|
||||
this->DrawWidgets();
|
||||
}
|
||||
|
||||
virtual void OnClick(Point pt, int widget, int click_count)
|
||||
@@ -431,18 +438,55 @@ struct AISettingsWindow : public Window {
|
||||
const ScriptConfigItem config_item = **it;
|
||||
if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return;
|
||||
|
||||
if (this->clicked_row != num) {
|
||||
DeleteChildWindows(WC_QUERY_STRING);
|
||||
HideDropDownMenu(this);
|
||||
this->clicked_row = num;
|
||||
this->clicked_dropdown = false;
|
||||
}
|
||||
|
||||
bool bool_item = (config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0;
|
||||
|
||||
int x = pt.x - wid->pos_x;
|
||||
if (_current_text_dir == TD_RTL) x = wid->current_x - x;
|
||||
if (_current_text_dir == TD_RTL) x = wid->current_x - 1 - x;
|
||||
x -= 4;
|
||||
|
||||
/* One of the arrows is clicked (or green/red rect in case of bool value) */
|
||||
if (IsInsideMM(x, 0, 21)) {
|
||||
int new_val = this->ai_config->GetSetting(config_item.name);
|
||||
int old_val = new_val;
|
||||
int old_val = this->ai_config->GetSetting(config_item.name);
|
||||
if (!bool_item && IsInsideMM(x, 0, SETTING_BUTTON_WIDTH) && config_item.complete_labels) {
|
||||
if (this->clicked_dropdown) {
|
||||
/* unclick the dropdown */
|
||||
HideDropDownMenu(this);
|
||||
this->clicked_dropdown = false;
|
||||
this->closing_dropdown = false;
|
||||
} else {
|
||||
const NWidgetBase *wid = this->GetWidget<NWidgetBase>(WID_AIS_BACKGROUND);
|
||||
int rel_y = (pt.y - (int)wid->pos_y) % this->line_height;
|
||||
|
||||
Rect wi_rect;
|
||||
wi_rect.left = pt.x - (_current_text_dir == TD_RTL ? SETTING_BUTTON_WIDTH - 1 - x : x);
|
||||
wi_rect.right = wi_rect.left + SETTING_BUTTON_WIDTH - 1;
|
||||
wi_rect.top = pt.y - rel_y + (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
|
||||
wi_rect.bottom = wi_rect.top + SETTING_BUTTON_HEIGHT - 1;
|
||||
|
||||
/* For dropdowns we also have to check the y position thoroughly, the mouse may not above the just opening dropdown */
|
||||
if (pt.y >= wi_rect.top && pt.y <= wi_rect.bottom) {
|
||||
this->clicked_dropdown = true;
|
||||
this->closing_dropdown = false;
|
||||
|
||||
DropDownList *list = new DropDownList();
|
||||
for (int i = config_item.min_value; i <= config_item.max_value; i++) {
|
||||
list->push_back(new DropDownListCharStringItem(config_item.labels->Find(i)->second, i, false));
|
||||
}
|
||||
|
||||
ShowDropDownListAt(this, list, old_val, -1, wi_rect, COLOUR_ORANGE, true);
|
||||
}
|
||||
}
|
||||
} else if (IsInsideMM(x, 0, SETTING_BUTTON_WIDTH)) {
|
||||
int new_val = old_val;
|
||||
if (bool_item) {
|
||||
new_val = !new_val;
|
||||
} else if (x >= 10) {
|
||||
} else if (x >= SETTING_BUTTON_WIDTH / 2) {
|
||||
/* Increase button clicked */
|
||||
new_val += config_item.step_size;
|
||||
if (new_val > config_item.max_value) new_val = config_item.max_value;
|
||||
@@ -458,13 +502,10 @@ struct AISettingsWindow : public Window {
|
||||
this->ai_config->SetSetting(config_item.name, new_val);
|
||||
this->clicked_button = num;
|
||||
this->timeout = 5;
|
||||
|
||||
this->CheckDifficultyLevel();
|
||||
}
|
||||
} else if (!bool_item) {
|
||||
} else if (!bool_item && !config_item.complete_labels) {
|
||||
/* Display a query box so users can enter a custom value. */
|
||||
this->clicked_row = num;
|
||||
SetDParam(0, this->ai_config->GetSetting(config_item.name));
|
||||
SetDParam(0, old_val);
|
||||
ShowQueryString(STR_JUST_INT, STR_CONFIG_SETTING_QUERY_CAPTION, 10, this, CS_NUMERAL, QSF_NONE);
|
||||
}
|
||||
this->SetDirty();
|
||||
@@ -492,7 +533,27 @@ struct AISettingsWindow : public Window {
|
||||
if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (it->flags & SCRIPTCONFIG_INGAME) == 0) return;
|
||||
int32 value = atoi(str);
|
||||
this->ai_config->SetSetting((*it).name, value);
|
||||
this->CheckDifficultyLevel();
|
||||
this->SetDirty();
|
||||
}
|
||||
|
||||
virtual void OnDropdownSelect(int widget, int index)
|
||||
{
|
||||
assert(this->clicked_dropdown);
|
||||
ScriptConfigItemList::const_iterator it = this->ai_config->GetConfigList()->begin();
|
||||
for (int i = 0; i < this->clicked_row; i++) it++;
|
||||
if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (it->flags & SCRIPTCONFIG_INGAME) == 0) return;
|
||||
this->ai_config->SetSetting((*it).name, index);
|
||||
this->SetDirty();
|
||||
}
|
||||
|
||||
virtual void OnDropdownClose(Point pt, int widget, int index, bool instant_close)
|
||||
{
|
||||
/* We cannot raise the dropdown button just yet. OnClick needs some hint, whether
|
||||
* the same dropdown button was clicked again, and then not open the dropdown again.
|
||||
* So, we only remember that it was closed, and process it on the next OnPaint, which is
|
||||
* after OnClick. */
|
||||
assert(this->clicked_dropdown);
|
||||
this->closing_dropdown = true;
|
||||
this->SetDirty();
|
||||
}
|
||||
|
||||
@@ -545,7 +606,7 @@ static const NWidgetPart _nested_ai_settings_widgets[] = {
|
||||
static const WindowDesc _ai_settings_desc(
|
||||
WDP_CENTER, 500, 208,
|
||||
WC_AI_SETTINGS, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
0,
|
||||
_nested_ai_settings_widgets, lengthof(_nested_ai_settings_widgets)
|
||||
);
|
||||
|
||||
@@ -567,8 +628,6 @@ struct ScriptTextfileWindow : public TextfileWindow {
|
||||
|
||||
ScriptTextfileWindow(TextfileType file_type, CompanyID slot) : TextfileWindow(file_type), slot(slot)
|
||||
{
|
||||
this->GetWidget<NWidgetCore>(WID_TF_CAPTION)->SetDataTip(STR_TEXTFILE_README_CAPTION + file_type, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS);
|
||||
|
||||
const char *textfile = GetConfig(slot)->GetTextfile(file_type, slot);
|
||||
this->LoadTextfile(textfile, (slot == OWNER_DEITY) ? GAME_DIR : AI_DIR);
|
||||
}
|
||||
@@ -641,7 +700,7 @@ static const NWidgetPart _nested_ai_config_widgets[] = {
|
||||
static const WindowDesc _ai_config_desc(
|
||||
WDP_CENTER, 0, 0,
|
||||
WC_GAME_OPTIONS, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
0,
|
||||
_nested_ai_config_widgets, lengthof(_nested_ai_config_widgets)
|
||||
);
|
||||
|
||||
@@ -879,10 +938,31 @@ void ShowAIConfigWindow()
|
||||
new AIConfigWindow();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the widget colour of a button based on the
|
||||
* state of the script. (dead or alive)
|
||||
* @param button the button to update.
|
||||
* @param dead true if the script is dead, otherwise false.
|
||||
* @param paused true if the script is paused, otherwise false.
|
||||
* @return true if the colour was changed and the window need to be marked as dirty.
|
||||
*/
|
||||
static bool SetScriptButtonColour(NWidgetCore &button, bool dead, bool paused)
|
||||
{
|
||||
/* Dead scripts are indicated with red background and
|
||||
* paused scripts are indicated with yellow background. */
|
||||
Colours colour = dead ? COLOUR_RED :
|
||||
(paused ? COLOUR_YELLOW : COLOUR_GREY);
|
||||
if (button.colour != colour) {
|
||||
button.colour = colour;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Window with everything an AI prints via ScriptLog.
|
||||
*/
|
||||
struct AIDebugWindow : public QueryStringBaseWindow {
|
||||
struct AIDebugWindow : public Window {
|
||||
static const int top_offset; ///< Offset of the text at the top of the WID_AID_LOG_PANEL.
|
||||
static const int bottom_offset; ///< Offset of the text at the bottom of the WID_AID_LOG_PANEL.
|
||||
|
||||
@@ -895,6 +975,8 @@ struct AIDebugWindow : public QueryStringBaseWindow {
|
||||
bool show_break_box; ///< Whether the break/debug box is visible.
|
||||
static bool break_check_enabled; ///< Stop an AI when it prints a matching string
|
||||
static char break_string[MAX_BREAK_STR_STRING_LENGTH]; ///< The string to match to the AI output
|
||||
QueryString break_editbox; ///< Break editbox
|
||||
static StringFilter break_string_filter; ///< Log filter for break.
|
||||
static bool case_sensitive_break_check; ///< Is the matching done case-sensitive
|
||||
int highlight_row; ///< The output row that matches the given string, or -1
|
||||
Scrollbar *vscroll; ///< Cache of the vertical scrollbar.
|
||||
@@ -910,7 +992,7 @@ struct AIDebugWindow : public QueryStringBaseWindow {
|
||||
* @param desc The description of the window.
|
||||
* @param number The window number (actually unused).
|
||||
*/
|
||||
AIDebugWindow(const WindowDesc *desc, WindowNumber number) : QueryStringBaseWindow(MAX_BREAK_STR_STRING_LENGTH)
|
||||
AIDebugWindow(const WindowDesc *desc, WindowNumber number) : break_editbox(MAX_BREAK_STR_STRING_LENGTH)
|
||||
{
|
||||
this->CreateNestedTree(desc);
|
||||
this->vscroll = this->GetScrollbar(WID_AID_SCROLLBAR);
|
||||
@@ -931,17 +1013,19 @@ struct AIDebugWindow : public QueryStringBaseWindow {
|
||||
this->last_vscroll_pos = 0;
|
||||
this->autoscroll = true;
|
||||
this->highlight_row = -1;
|
||||
InitializeTextBuffer(&this->text, this->edit_str_buf, this->edit_str_size, MAX_BREAK_STR_STRING_LENGTH);
|
||||
|
||||
this->querystrings[WID_AID_BREAK_STR_EDIT_BOX] = &this->break_editbox;
|
||||
|
||||
/* Restore the break string value from static variable */
|
||||
strecpy(this->edit_str_buf, this->break_string, this->edit_str_buf + MAX_BREAK_STR_STRING_LENGTH);
|
||||
UpdateTextBufferSize(&this->text);
|
||||
this->break_editbox.text.Assign(this->break_string);
|
||||
|
||||
/* Restore button state from static class variables */
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
this->LowerWidget(WID_AID_SCRIPT_GAME);
|
||||
this->SetWidgetDisabledState(WID_AID_CONTINUE_BTN, !Game::IsPaused());
|
||||
} else if (ai_debug_company != INVALID_COMPANY) {
|
||||
this->LowerWidget(ai_debug_company + WID_AID_COMPANY_BUTTON_START);
|
||||
this->SetWidgetDisabledState(WID_AID_CONTINUE_BTN, !AI::IsPaused(ai_debug_company));
|
||||
}
|
||||
this->SetWidgetLoweredState(WID_AID_BREAK_STR_ON_OFF_BTN, this->break_check_enabled);
|
||||
this->SetWidgetLoweredState(WID_AID_MATCH_CASE_BTN, this->case_sensitive_break_check);
|
||||
@@ -977,6 +1061,14 @@ struct AIDebugWindow : public QueryStringBaseWindow {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* If no AI is available, see if there is a game script. */
|
||||
if (ai_debug_company == INVALID_COMPANY && Game::GetInstance() != NULL) {
|
||||
/* Lower the widget corresponding to the game script. */
|
||||
this->LowerWidget(WID_AID_SCRIPT_GAME);
|
||||
|
||||
ai_debug_company = OWNER_DEITY;
|
||||
}
|
||||
}
|
||||
|
||||
/* Update "Reload AI" and "AI settings" buttons */
|
||||
@@ -989,8 +1081,6 @@ struct AIDebugWindow : public QueryStringBaseWindow {
|
||||
|
||||
if (this->IsShaded()) return; // Don't draw anything when the window is shaded.
|
||||
|
||||
if (this->show_break_box) this->DrawEditBox(WID_AID_BREAK_STR_EDIT_BOX);
|
||||
|
||||
/* Paint the company icons */
|
||||
for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
|
||||
NWidgetCore *button = this->GetWidget<NWidgetCore>(i + WID_AID_COMPANY_BUTTON_START);
|
||||
@@ -1004,13 +1094,12 @@ struct AIDebugWindow : public QueryStringBaseWindow {
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
/* Mark dead/paused AIs by setting the background colour. */
|
||||
bool dead = valid && Company::Get(i)->ai_instance->IsDead();
|
||||
Colours colour = dead ? COLOUR_RED : COLOUR_GREY;
|
||||
if (button->colour != colour) {
|
||||
/* Mark dead AIs by red background */
|
||||
button->colour = colour;
|
||||
dirty = true;
|
||||
}
|
||||
bool paused = valid && Company::Get(i)->ai_instance->IsPaused();
|
||||
/* Re-paint if the button was updated.
|
||||
* (note that it is intentional that SetScriptButtonColour is always called) */
|
||||
dirty = SetScriptButtonColour(*button, dead, paused) || dirty;
|
||||
|
||||
/* Do we need a repaint? */
|
||||
if (dirty) this->SetDirty();
|
||||
@@ -1021,6 +1110,16 @@ struct AIDebugWindow : public QueryStringBaseWindow {
|
||||
DrawCompanyIcon(i, button->pos_x + button->current_x / 2 - 7 + offset, this->GetWidget<NWidgetBase>(WID_AID_COMPANY_BUTTON_START + i)->pos_y + 2 + offset);
|
||||
}
|
||||
|
||||
/* Set button colour for Game Script. */
|
||||
GameInstance *game = Game::GetInstance();
|
||||
bool dead = game != NULL && game->IsDead();
|
||||
bool paused = game != NULL && game->IsPaused();
|
||||
NWidgetCore *button = this->GetWidget<NWidgetCore>(WID_AID_SCRIPT_GAME);
|
||||
if (SetScriptButtonColour(*button, dead, paused)) {
|
||||
/* Re-paint if the button was updated. */
|
||||
this->SetWidgetDirty(WID_AID_SCRIPT_GAME);
|
||||
}
|
||||
|
||||
/* If there are no active companies, don't display anything else. */
|
||||
if (ai_debug_company == INVALID_COMPANY) return;
|
||||
|
||||
@@ -1133,10 +1232,13 @@ struct AIDebugWindow : public QueryStringBaseWindow {
|
||||
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
this->LowerWidget(WID_AID_SCRIPT_GAME);
|
||||
this->SetWidgetDisabledState(WID_AID_CONTINUE_BTN, !Game::IsPaused());
|
||||
} else {
|
||||
this->LowerWidget(ai_debug_company + WID_AID_COMPANY_BUTTON_START);
|
||||
this->SetWidgetDisabledState(WID_AID_CONTINUE_BTN, !AI::IsPaused(ai_debug_company));
|
||||
}
|
||||
|
||||
this->highlight_row = -1; // The highlight of one AI make little sense for another AI.
|
||||
this->autoscroll = true;
|
||||
this->last_vscroll_pos = this->vscroll->GetPosition();
|
||||
this->SetDirty();
|
||||
@@ -1146,12 +1248,12 @@ struct AIDebugWindow : public QueryStringBaseWindow {
|
||||
|
||||
virtual void OnClick(Point pt, int widget, int click_count)
|
||||
{
|
||||
/* Also called for hotkeys, so check for disabledness */
|
||||
if (this->IsWidgetDisabled(widget)) return;
|
||||
|
||||
/* Check which button is clicked */
|
||||
if (IsInsideMM(widget, WID_AID_COMPANY_BUTTON_START, WID_AID_COMPANY_BUTTON_END + 1)) {
|
||||
/* Is it no on disable? */
|
||||
if (!this->IsWidgetDisabled(widget)) {
|
||||
ChangeToAI((CompanyID)(widget - WID_AID_COMPANY_BUTTON_START));
|
||||
}
|
||||
ChangeToAI((CompanyID)(widget - WID_AID_COMPANY_BUTTON_START));
|
||||
}
|
||||
|
||||
switch (widget) {
|
||||
@@ -1179,39 +1281,70 @@ struct AIDebugWindow : public QueryStringBaseWindow {
|
||||
case WID_AID_MATCH_CASE_BTN:
|
||||
this->case_sensitive_break_check = !this->case_sensitive_break_check;
|
||||
this->SetWidgetLoweredState(WID_AID_MATCH_CASE_BTN, this->case_sensitive_break_check);
|
||||
this->SetWidgetDirty(WID_AID_MATCH_CASE_BTN);
|
||||
break;
|
||||
|
||||
case WID_AID_CONTINUE_BTN:
|
||||
/* Unpause */
|
||||
DoCommandP(0, PM_PAUSED_NORMAL, 0, CMD_PAUSE);
|
||||
/* Unpause current AI / game script and mark the corresponding script button dirty. */
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
Game::Unpause();
|
||||
this->SetWidgetDirty(WID_AID_SCRIPT_GAME);
|
||||
} else {
|
||||
AI::Unpause(ai_debug_company);
|
||||
this->SetWidgetDirty(WID_AID_COMPANY_BUTTON_START + ai_debug_company);
|
||||
}
|
||||
|
||||
/* If the last AI/Game Script is unpaused, unpause the game too. */
|
||||
if ((_pause_mode & PM_PAUSED_NORMAL) == PM_PAUSED_NORMAL) {
|
||||
bool all_unpaused = !Game::IsPaused();
|
||||
if (all_unpaused) {
|
||||
Company *c;
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
if (c->is_ai && AI::IsPaused(c->index)) {
|
||||
all_unpaused = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (all_unpaused) {
|
||||
/* All scripts have been unpaused => unpause the game. */
|
||||
DoCommandP(0, PM_PAUSED_NORMAL, 0, CMD_PAUSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this->highlight_row = -1;
|
||||
this->SetWidgetDirty(WID_AID_LOG_PANEL);
|
||||
this->DisableWidget(WID_AID_CONTINUE_BTN);
|
||||
this->RaiseWidget(WID_AID_CONTINUE_BTN); // Disabled widgets don't raise themself
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
virtual void OnTimeout()
|
||||
{
|
||||
this->RaiseWidget(WID_AID_RELOAD_TOGGLE);
|
||||
this->RaiseWidget(WID_AID_SETTINGS);
|
||||
this->SetDirty();
|
||||
}
|
||||
|
||||
virtual void OnMouseLoop()
|
||||
{
|
||||
this->HandleEditBox(WID_AID_BREAK_STR_EDIT_BOX);
|
||||
}
|
||||
|
||||
virtual EventState OnKeyPress(uint16 key, uint16 keycode)
|
||||
{
|
||||
EventState state = ES_NOT_HANDLED;
|
||||
if (this->HandleEditBoxKey(WID_AID_BREAK_STR_EDIT_BOX, key, keycode, state) != HEBR_NOT_FOCUSED) {
|
||||
/* Save the current string to static member so it can be restored next time the window is opened */
|
||||
strecpy(this->break_string, this->edit_str_buf, lastof(this->break_string));
|
||||
int num = CheckHotkeyMatch(aidebug_hotkeys, keycode, this);
|
||||
if (num != -1) {
|
||||
if (this->show_break_box && num == WID_AID_BREAK_STR_EDIT_BOX) {
|
||||
this->SetFocusedWidget(WID_AID_BREAK_STR_EDIT_BOX);
|
||||
SetFocusedWindow(this);
|
||||
state = ES_HANDLED;
|
||||
} else if (this->show_break_box || num < WID_AID_BREAK_STRING_WIDGETS) {
|
||||
this->OnClick(Point(), num, 1);
|
||||
state = ES_HANDLED;
|
||||
}
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
virtual void OnEditboxChanged(int wid)
|
||||
{
|
||||
if (wid == WID_AID_BREAK_STR_EDIT_BOX) {
|
||||
/* Save the current string to static member so it can be restored next time the window is opened. */
|
||||
strecpy(this->break_string, this->break_editbox.text.buf, lastof(this->break_string));
|
||||
break_string_filter.SetFilterTerm(this->break_string);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Some data on this window has become invalid.
|
||||
* @param data Information about the changed data.
|
||||
@@ -1221,39 +1354,35 @@ struct AIDebugWindow : public QueryStringBaseWindow {
|
||||
{
|
||||
if (data == -1 || ai_debug_company == data) this->SetDirty();
|
||||
|
||||
if (gui_scope && data == -2) {
|
||||
/* The continue button should be disabled when the game is unpaused and
|
||||
* it was previously paused by the break string ( = a line in the log
|
||||
* was highlighted )*/
|
||||
if ((_pause_mode & PM_PAUSED_NORMAL) == PM_UNPAUSED && this->highlight_row != -1) {
|
||||
this->DisableWidget(WID_AID_CONTINUE_BTN);
|
||||
this->SetWidgetDirty(WID_AID_CONTINUE_BTN);
|
||||
this->SetWidgetDirty(WID_AID_LOG_PANEL);
|
||||
this->highlight_row = -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* If the log message is related to the active company tab, check the break string.
|
||||
* This needs to be done in gameloop-scope, so the AI is suspended immediately. */
|
||||
if (ai_debug_company != OWNER_DEITY && !gui_scope && data == ai_debug_company && this->break_check_enabled && !StrEmpty(this->edit_str_buf)) {
|
||||
if (!gui_scope && data == ai_debug_company && this->break_check_enabled && !this->break_string_filter.IsEmpty()) {
|
||||
/* Get the log instance of the active company */
|
||||
ScriptLog::LogData *log = this->GetLogPointer();
|
||||
|
||||
if (log != NULL && case_sensitive_break_check?
|
||||
strstr(log->lines[log->pos], this->edit_str_buf) != 0 :
|
||||
strcasestr(log->lines[log->pos], this->edit_str_buf) != 0) {
|
||||
if (log != NULL) {
|
||||
this->break_string_filter.ResetState();
|
||||
this->break_string_filter.AddLine(log->lines[log->pos]);
|
||||
if (this->break_string_filter.GetState()) {
|
||||
/* Pause execution of script. */
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
Game::Pause();
|
||||
} else {
|
||||
AI::Pause(ai_debug_company);
|
||||
}
|
||||
|
||||
AI::Suspend(ai_debug_company);
|
||||
if ((_pause_mode & PM_PAUSED_NORMAL) == PM_UNPAUSED) {
|
||||
DoCommandP(0, PM_PAUSED_NORMAL, 1, CMD_PAUSE);
|
||||
/* Pause the game. */
|
||||
if ((_pause_mode & PM_PAUSED_NORMAL) == PM_UNPAUSED) {
|
||||
DoCommandP(0, PM_PAUSED_NORMAL, 1, CMD_PAUSE);
|
||||
}
|
||||
|
||||
/* Make it possible to click on the continue button */
|
||||
this->EnableWidget(WID_AID_CONTINUE_BTN);
|
||||
this->SetWidgetDirty(WID_AID_CONTINUE_BTN);
|
||||
|
||||
/* Highlight row that matched */
|
||||
this->highlight_row = log->pos;
|
||||
}
|
||||
|
||||
/* Make it possible to click on the continue button */
|
||||
this->EnableWidget(WID_AID_CONTINUE_BTN);
|
||||
this->SetWidgetDirty(WID_AID_CONTINUE_BTN);
|
||||
|
||||
/* Highlight row that matched */
|
||||
this->highlight_row = log->pos;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1262,6 +1391,8 @@ struct AIDebugWindow : public QueryStringBaseWindow {
|
||||
{
|
||||
this->vscroll->SetCapacityFromWidget(this, WID_AID_LOG_PANEL);
|
||||
}
|
||||
|
||||
static Hotkey<AIDebugWindow> aidebug_hotkeys[];
|
||||
};
|
||||
|
||||
const int AIDebugWindow::top_offset = WD_FRAMERECT_TOP + 2;
|
||||
@@ -1270,6 +1401,7 @@ CompanyID AIDebugWindow::ai_debug_company = INVALID_COMPANY;
|
||||
char AIDebugWindow::break_string[MAX_BREAK_STR_STRING_LENGTH] = "";
|
||||
bool AIDebugWindow::break_check_enabled = true;
|
||||
bool AIDebugWindow::case_sensitive_break_check = false;
|
||||
StringFilter AIDebugWindow::break_string_filter(&AIDebugWindow::case_sensitive_break_check);
|
||||
|
||||
/** Make a number of rows with buttons for each company for the AI debug window. */
|
||||
NWidgetBase *MakeCompanyButtonRowsAIDebug(int *biggest_index)
|
||||
@@ -1277,6 +1409,33 @@ NWidgetBase *MakeCompanyButtonRowsAIDebug(int *biggest_index)
|
||||
return MakeCompanyButtonRows(biggest_index, WID_AID_COMPANY_BUTTON_START, WID_AID_COMPANY_BUTTON_END, 8, STR_AI_DEBUG_SELECT_AI_TOOLTIP);
|
||||
}
|
||||
|
||||
Hotkey<AIDebugWindow> AIDebugWindow::aidebug_hotkeys[] = {
|
||||
Hotkey<AIDebugWindow>('1', "company_1", WID_AID_COMPANY_BUTTON_START),
|
||||
Hotkey<AIDebugWindow>('2', "company_2", WID_AID_COMPANY_BUTTON_START + 1),
|
||||
Hotkey<AIDebugWindow>('3', "company_3", WID_AID_COMPANY_BUTTON_START + 2),
|
||||
Hotkey<AIDebugWindow>('4', "company_4", WID_AID_COMPANY_BUTTON_START + 3),
|
||||
Hotkey<AIDebugWindow>('5', "company_5", WID_AID_COMPANY_BUTTON_START + 4),
|
||||
Hotkey<AIDebugWindow>('6', "company_6", WID_AID_COMPANY_BUTTON_START + 5),
|
||||
Hotkey<AIDebugWindow>('7', "company_7", WID_AID_COMPANY_BUTTON_START + 6),
|
||||
Hotkey<AIDebugWindow>('8', "company_8", WID_AID_COMPANY_BUTTON_START + 7),
|
||||
Hotkey<AIDebugWindow>('9', "company_9", WID_AID_COMPANY_BUTTON_START + 8),
|
||||
Hotkey<AIDebugWindow>((uint16)0, "company_10", WID_AID_COMPANY_BUTTON_START + 9),
|
||||
Hotkey<AIDebugWindow>((uint16)0, "company_11", WID_AID_COMPANY_BUTTON_START + 10),
|
||||
Hotkey<AIDebugWindow>((uint16)0, "company_12", WID_AID_COMPANY_BUTTON_START + 11),
|
||||
Hotkey<AIDebugWindow>((uint16)0, "company_13", WID_AID_COMPANY_BUTTON_START + 12),
|
||||
Hotkey<AIDebugWindow>((uint16)0, "company_14", WID_AID_COMPANY_BUTTON_START + 13),
|
||||
Hotkey<AIDebugWindow>((uint16)0, "company_15", WID_AID_COMPANY_BUTTON_START + 14),
|
||||
Hotkey<AIDebugWindow>('S', "settings", WID_AID_SETTINGS),
|
||||
Hotkey<AIDebugWindow>('0', "game_script", WID_AID_SCRIPT_GAME),
|
||||
Hotkey<AIDebugWindow>((uint16)0, "reload", WID_AID_RELOAD_TOGGLE),
|
||||
Hotkey<AIDebugWindow>('B', "break_toggle", WID_AID_BREAK_STR_ON_OFF_BTN),
|
||||
Hotkey<AIDebugWindow>('F', "break_string", WID_AID_BREAK_STR_EDIT_BOX),
|
||||
Hotkey<AIDebugWindow>('C', "match_case", WID_AID_MATCH_CASE_BTN),
|
||||
Hotkey<AIDebugWindow>(WKC_RETURN, "continue", WID_AID_CONTINUE_BTN),
|
||||
HOTKEY_LIST_END(AIDebugWindow)
|
||||
};
|
||||
Hotkey<AIDebugWindow> *_aidebug_hotkeys = AIDebugWindow::aidebug_hotkeys;
|
||||
|
||||
/** Widgets for the AI debug window. */
|
||||
static const NWidgetPart _nested_ai_debug_widgets[] = {
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
@@ -1289,7 +1448,7 @@ static const NWidgetPart _nested_ai_debug_widgets[] = {
|
||||
NWidgetFunction(MakeCompanyButtonRowsAIDebug), SetPadding(0, 2, 1, 2),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_AID_SCRIPT_GAME), SetMinimalSize(100, 20), SetResize(1, 0), SetDataTip(STR_AI_GAME_SCRIPT, STR_AI_GAME_SCRIPT_TOOLTIP),
|
||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AID_SCRIPT_GAME), SetMinimalSize(100, 20), SetResize(1, 0), SetDataTip(STR_AI_GAME_SCRIPT, STR_AI_GAME_SCRIPT_TOOLTIP),
|
||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AID_NAME_TEXT), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_JUST_STRING, STR_AI_DEBUG_NAME_TOOLTIP),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_AID_SETTINGS), SetMinimalSize(100, 20), SetDataTip(STR_AI_DEBUG_SETTINGS, STR_AI_DEBUG_SETTINGS_TOOLTIP),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_AID_RELOAD_TOGGLE), SetMinimalSize(100, 20), SetDataTip(STR_AI_DEBUG_RELOAD, STR_AI_DEBUG_RELOAD_TOOLTIP),
|
||||
@@ -1306,10 +1465,10 @@ static const NWidgetPart _nested_ai_debug_widgets[] = {
|
||||
NWidget(WWT_PANEL, COLOUR_GREY),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_LABEL, COLOUR_GREY), SetPadding(2, 2, 2, 4), SetDataTip(STR_AI_DEBUG_BREAK_ON_LABEL, 0x0),
|
||||
NWidget(WWT_EDITBOX, COLOUR_WHITE, WID_AID_BREAK_STR_EDIT_BOX), SetFill(1, 1), SetResize(1, 0), SetPadding(2, 2, 2, 2), SetDataTip(STR_AI_DEBUG_BREAK_STR_OSKTITLE, STR_AI_DEBUG_BREAK_STR_TOOLTIP),
|
||||
NWidget(WWT_EDITBOX, COLOUR_GREY, WID_AID_BREAK_STR_EDIT_BOX), SetFill(1, 1), SetResize(1, 0), SetPadding(2, 2, 2, 2), SetDataTip(STR_AI_DEBUG_BREAK_STR_OSKTITLE, STR_AI_DEBUG_BREAK_STR_TOOLTIP),
|
||||
EndContainer(),
|
||||
EndContainer(),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_AID_MATCH_CASE_BTN), SetMinimalSize(100, 0), SetFill(0, 1), SetDataTip(STR_AI_DEBUG_MATCH_CASE, STR_AI_DEBUG_MATCH_CASE_TOOLTIP),
|
||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AID_MATCH_CASE_BTN), SetMinimalSize(100, 0), SetFill(0, 1), SetDataTip(STR_AI_DEBUG_MATCH_CASE, STR_AI_DEBUG_MATCH_CASE_TOOLTIP),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_AID_CONTINUE_BTN), SetMinimalSize(100, 0), SetFill(0, 1), SetDataTip(STR_AI_DEBUG_CONTINUE, STR_AI_DEBUG_CONTINUE_TOOLTIP),
|
||||
EndContainer(),
|
||||
EndContainer(),
|
||||
@@ -1333,15 +1492,30 @@ static const WindowDesc _ai_debug_desc(
|
||||
* Open the AI debug window and select the given company.
|
||||
* @param show_company Display debug information about this AI company.
|
||||
*/
|
||||
void ShowAIDebugWindow(CompanyID show_company)
|
||||
Window *ShowAIDebugWindow(CompanyID show_company)
|
||||
{
|
||||
if (!_networking || _network_server) {
|
||||
AIDebugWindow *w = (AIDebugWindow *)BringWindowToFrontById(WC_AI_DEBUG, 0);
|
||||
if (w == NULL) w = new AIDebugWindow(&_ai_debug_desc, 0);
|
||||
if (show_company != INVALID_COMPANY) w->ChangeToAI(show_company);
|
||||
return w;
|
||||
} else {
|
||||
ShowErrorMessage(STR_ERROR_AI_DEBUG_SERVER_ONLY, INVALID_STRING_ID, WL_INFO);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler for global AI debug window hotkeys.
|
||||
*/
|
||||
EventState AIDebugGlobalHotkeys(uint16 key, uint16 keycode)
|
||||
{
|
||||
int num = CheckHotkeyMatch<AIDebugWindow>(_aidebug_hotkeys, keycode, NULL, true);
|
||||
if (num == -1) return ES_NOT_HANDLED;
|
||||
Window *w = ShowAIDebugWindow(INVALID_COMPANY);
|
||||
if (w == NULL) return ES_NOT_HANDLED;
|
||||
return w->OnKeyPress(key, keycode);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "../company_type.h"
|
||||
|
||||
void ShowAIDebugWindow(CompanyID show_company = INVALID_COMPANY);
|
||||
Window* ShowAIDebugWindow(CompanyID show_company = INVALID_COMPANY);
|
||||
void ShowAIConfigWindow();
|
||||
void ShowAIDebugWindowIfAIError();
|
||||
void InitializeAIGui();
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
static bool CheckAPIVersion(const char *api_version)
|
||||
{
|
||||
return strcmp(api_version, "0.7") == 0 || strcmp(api_version, "1.0") == 0 || strcmp(api_version, "1.1") == 0 || strcmp(api_version, "1.2") == 0;
|
||||
return strcmp(api_version, "0.7") == 0 || strcmp(api_version, "1.0") == 0 || strcmp(api_version, "1.1") == 0 || strcmp(api_version, "1.2") == 0 || strcmp(api_version, "1.3") == 0;
|
||||
}
|
||||
|
||||
#if defined(WIN32)
|
||||
|
||||
+5
-25
@@ -81,7 +81,6 @@
|
||||
|
||||
#include "../company_base.h"
|
||||
#include "../company_func.h"
|
||||
#include "../fileio_func.h"
|
||||
|
||||
AIInstance::AIInstance() :
|
||||
ScriptInstance("AI")
|
||||
@@ -128,13 +127,16 @@ void AIInstance::RegisterAPI()
|
||||
SQAIEventCompanyInTrouble_Register(this->engine);
|
||||
SQAIEventCompanyMerger_Register(this->engine);
|
||||
SQAIEventCompanyNew_Register(this->engine);
|
||||
SQAIEventCompanyTown_Register(this->engine);
|
||||
SQAIEventController_Register(this->engine);
|
||||
SQAIEventDisasterZeppelinerCleared_Register(this->engine);
|
||||
SQAIEventDisasterZeppelinerCrashed_Register(this->engine);
|
||||
SQAIEventEngineAvailable_Register(this->engine);
|
||||
SQAIEventEnginePreview_Register(this->engine);
|
||||
SQAIEventExclusiveTransportRights_Register(this->engine);
|
||||
SQAIEventIndustryClose_Register(this->engine);
|
||||
SQAIEventIndustryOpen_Register(this->engine);
|
||||
SQAIEventRoadReconstruction_Register(this->engine);
|
||||
SQAIEventStationFirstVehicle_Register(this->engine);
|
||||
SQAIEventSubsidyAwarded_Register(this->engine);
|
||||
SQAIEventSubsidyExpired_Register(this->engine);
|
||||
@@ -191,29 +193,7 @@ void AIInstance::RegisterAPI()
|
||||
SQAIWaypointList_Register(this->engine);
|
||||
SQAIWaypointList_Vehicle_Register(this->engine);
|
||||
|
||||
if (!this->LoadCompatibilityScripts(this->versionAPI)) this->Died();
|
||||
}
|
||||
|
||||
bool AIInstance::LoadCompatibilityScripts(const char *api_version)
|
||||
{
|
||||
char script_name[32];
|
||||
seprintf(script_name, lastof(script_name), "compat_%s.nut", api_version);
|
||||
char buf[MAX_PATH];
|
||||
Searchpath sp;
|
||||
FOR_ALL_SEARCHPATHS(sp) {
|
||||
FioAppendDirectory(buf, MAX_PATH, sp, AI_DIR);
|
||||
ttd_strlcat(buf, script_name, MAX_PATH);
|
||||
if (!FileExists(buf)) continue;
|
||||
|
||||
if (this->engine->LoadScript(buf)) return true;
|
||||
|
||||
ScriptLog::Error("Failed to load API compatibility script");
|
||||
DEBUG(script, 0, "Error compiling / running API compatibility script: %s", buf);
|
||||
return false;
|
||||
}
|
||||
|
||||
ScriptLog::Warning("API compatibility script not found");
|
||||
return true;
|
||||
if (!this->LoadCompatibilityScripts(this->versionAPI, AI_DIR)) this->Died();
|
||||
}
|
||||
|
||||
void AIInstance::Died()
|
||||
@@ -222,7 +202,7 @@ void AIInstance::Died()
|
||||
|
||||
ShowAIDebugWindow(_current_company);
|
||||
|
||||
const AIInfo *info = AIConfig::GetConfig(_current_company)->GetInfo();
|
||||
const AIInfo *info = AIConfig::GetConfig(_current_company, AIConfig::SSS_FORCE_GAME)->GetInfo();
|
||||
if (info != NULL) {
|
||||
ShowErrorMessage(STR_ERROR_AI_PLEASE_REPORT_CRASH, INVALID_STRING_ID, WL_WARNING);
|
||||
|
||||
|
||||
@@ -29,17 +29,10 @@ public:
|
||||
/* virtual */ ScriptInfo *FindLibrary(const char *library, int version);
|
||||
|
||||
private:
|
||||
const char *versionAPI; ///< Current API used by this script.
|
||||
|
||||
/* virtual */ void RegisterAPI();
|
||||
/* virtual */ void Died();
|
||||
/* virtual */ CommandCallback *GetDoCommandCallback();
|
||||
/* virtual */ void LoadDummyScript();
|
||||
|
||||
/**
|
||||
* Load squirrel scripts to emulate an older API.
|
||||
*/
|
||||
bool LoadCompatibilityScripts(const char *api_version);
|
||||
};
|
||||
|
||||
#endif /* AI_INSTANCE_HPP */
|
||||
|
||||
+9
-2
@@ -32,7 +32,7 @@ enum VehicleAirFlags {
|
||||
|
||||
|
||||
void HandleAircraftEnterHangar(Aircraft *v);
|
||||
void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, EngineImageType image_type);
|
||||
void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type);
|
||||
void UpdateAirplanesOnNewStation(const Station *st);
|
||||
void UpdateAircraftCache(Aircraft *v, bool update_range = false);
|
||||
|
||||
@@ -76,8 +76,15 @@ struct Aircraft FINAL : public SpecializedVehicle<Aircraft, VEH_AIRCRAFT> {
|
||||
int GetDisplaySpeed() const { return this->cur_speed; }
|
||||
int GetDisplayMaxSpeed() const { return this->vcache.cached_max_speed; }
|
||||
int GetSpeedOldUnits() const { return this->vcache.cached_max_speed * 10 / 128; }
|
||||
int GetCurrentMaxSpeed() const { return this->GetSpeedOldUnits(); }
|
||||
Money GetRunningCost() const;
|
||||
bool IsInDepot() const { return (this->vehstatus & VS_HIDDEN) != 0 && IsHangarTile(this->tile); }
|
||||
|
||||
bool IsInDepot() const
|
||||
{
|
||||
assert(this->IsPrimaryVehicle());
|
||||
return (this->vehstatus & VS_HIDDEN) != 0 && IsHangarTile(this->tile);
|
||||
}
|
||||
|
||||
bool Tick();
|
||||
void OnNewDay();
|
||||
uint Crash(bool flooded = false);
|
||||
|
||||
+18
-16
@@ -202,17 +202,22 @@ void DrawAircraftEngine(int left, int right, int preferred_x, int y, EngineID en
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the size of the sprite of an aircraft sprite heading west (used for lists)
|
||||
* @param engine The engine to get the sprite from
|
||||
* @param width The width of the sprite
|
||||
* @param height The height of the sprite
|
||||
* Get the size of the sprite of an aircraft sprite heading west (used for lists).
|
||||
* @param engine The engine to get the sprite from.
|
||||
* @param[out] width The width of the sprite.
|
||||
* @param[out] height The height of the sprite.
|
||||
* @param[out] xoffs Number of pixels to shift the sprite to the right.
|
||||
* @param[out] yoffs Number of pixels to shift the sprite downwards.
|
||||
* @param image_type Context the sprite is used in.
|
||||
*/
|
||||
void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, EngineImageType image_type)
|
||||
void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type)
|
||||
{
|
||||
const Sprite *spr = GetSprite(GetAircraftIcon(engine, image_type), ST_NORMAL);
|
||||
|
||||
width = UnScaleByZoom(spr->width, ZOOM_LVL_GUI);
|
||||
height = UnScaleByZoom(spr->height, ZOOM_LVL_GUI);
|
||||
xoffs = UnScaleByZoom(spr->x_offs, ZOOM_LVL_GUI);
|
||||
yoffs = UnScaleByZoom(spr->y_offs, ZOOM_LVL_GUI);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -365,7 +370,7 @@ bool Aircraft::FindClosestDepot(TileIndex *location, DestinationID *destination,
|
||||
static void CheckIfAircraftNeedsService(Aircraft *v)
|
||||
{
|
||||
if (Company::Get(v->owner)->settings.vehicle.servint_aircraft == 0 || !v->NeedsAutomaticServicing()) return;
|
||||
if (v->IsInDepot()) {
|
||||
if (v->IsChainInDepot()) {
|
||||
VehicleServiceInDepot(v);
|
||||
return;
|
||||
}
|
||||
@@ -1163,13 +1168,10 @@ static void CrashAirplane(Aircraft *v)
|
||||
AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, st == NULL ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING));
|
||||
Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, st == NULL ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING));
|
||||
|
||||
AddVehicleNewsItem(newsitem,
|
||||
NS_ACCIDENT,
|
||||
v->index,
|
||||
st != NULL ? st->index : INVALID_STATION);
|
||||
AddVehicleNewsItem(newsitem, NT_ACCIDENT, v->index, st != NULL ? st->index : INVALID_STATION);
|
||||
|
||||
ModifyStationRatingAround(v->tile, v->owner, -160, 30);
|
||||
SndPlayVehicleFx(SND_12_EXPLOSION, v);
|
||||
if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1222,7 +1224,7 @@ static void AircraftEntersTerminal(Aircraft *v)
|
||||
/* show newsitem of celebrating citizens */
|
||||
AddVehicleNewsItem(
|
||||
STR_NEWS_FIRST_AIRCRAFT_ARRIVAL,
|
||||
(v->owner == _local_company) ? NS_ARRIVAL_COMPANY : NS_ARRIVAL_OTHER,
|
||||
(v->owner == _local_company) ? NT_ARRIVAL_COMPANY : NT_ARRIVAL_OTHER,
|
||||
v->index,
|
||||
st->index
|
||||
);
|
||||
@@ -1461,8 +1463,8 @@ static void AircraftEventHandler_Flying(Aircraft *v, const AirportFTAClass *apc)
|
||||
{
|
||||
Station *st = Station::Get(v->targetairport);
|
||||
|
||||
/* runway busy or not allowed to use this airstation, circle */
|
||||
if (CanVehicleUseStation(v, st) && (st->owner == OWNER_NONE || st->owner == v->owner)) {
|
||||
/* Runway busy, not allowed to use this airstation or closed, circle. */
|
||||
if (CanVehicleUseStation(v, st) && (st->owner == OWNER_NONE || st->owner == v->owner) && !(st->airport.flags & AIRPORT_CLOSED_block)) {
|
||||
/* {32,FLYING,NOTHING_block,37}, {32,LANDING,N,33}, {32,HELILANDING,N,41},
|
||||
* if it is an airplane, look for LANDING, for helicopter HELILANDING
|
||||
* it is possible to choose from multiple landing runways, so loop until a free one is found */
|
||||
@@ -1862,7 +1864,7 @@ static void AircraftHandleDestTooFar(Aircraft *v, bool too_far)
|
||||
if (v->owner == _local_company) {
|
||||
/* Post a news message. */
|
||||
SetDParam(0, v->index);
|
||||
AddVehicleNewsItem(STR_NEWS_AIRCRAFT_DEST_TOO_FAR, NS_ADVICE, v->index);
|
||||
AddVehicleAdviceNewsItem(STR_NEWS_AIRCRAFT_DEST_TOO_FAR, v->index);
|
||||
}
|
||||
}
|
||||
return;
|
||||
@@ -1894,7 +1896,7 @@ static bool AircraftEventHandler(Aircraft *v, int loop)
|
||||
|
||||
if (v->current_order.IsType(OT_LOADING) || v->current_order.IsType(OT_LEAVESTATION)) return true;
|
||||
|
||||
if (v->state == FLYING) {
|
||||
if (v->state >= ENDTAKEOFF && v->state <= HELIENDLANDING) {
|
||||
/* If we are flying, unconditionally clear the 'dest too far' state. */
|
||||
AircraftHandleDestTooFar(v, false);
|
||||
} else if (v->acache.cached_max_range_sqr != 0) {
|
||||
|
||||
+2
-1
@@ -122,7 +122,8 @@ static const uint64
|
||||
OUT_WAY_block2 = 1ULL << 31,
|
||||
/* end of new blocks */
|
||||
|
||||
NOTHING_block = 1ULL << 30;
|
||||
NOTHING_block = 1ULL << 30,
|
||||
AIRPORT_CLOSED_block = 1ULL << 63; ///< Dummy block for indicating a closed airport.
|
||||
|
||||
/** A single location on an airport where aircraft can move to. */
|
||||
struct AirportMovingData {
|
||||
|
||||
+25
-22
@@ -43,7 +43,7 @@ void CcBuildAirport(const CommandCost &result, TileIndex tile, uint32 p1, uint32
|
||||
{
|
||||
if (result.Failed()) return;
|
||||
|
||||
SndPlayTileFx(SND_1F_SPLAT, tile);
|
||||
if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_SPLAT, tile);
|
||||
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ static void PlaceAirport(TileIndex tile)
|
||||
uint32 p2 = _ctrl_pressed;
|
||||
SB(p2, 16, 16, INVALID_STATION); // no station to join
|
||||
|
||||
uint32 p1 = AirportClass::Get(_selected_airport_class, _selected_airport_index)->GetIndex();
|
||||
uint32 p1 = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index)->GetIndex();
|
||||
p1 |= _selected_airport_layout << 8;
|
||||
CommandContainer cmdcont = { tile, p1, p2, CMD_BUILD_AIRPORT | CMD_MSG(STR_ERROR_CAN_T_BUILD_AIRPORT_HERE), CcBuildAirport, "" };
|
||||
ShowSelectStationIfNeeded(cmdcont, TileArea(tile, _thd.size.x / TILE_SIZE, _thd.size.y / TILE_SIZE));
|
||||
@@ -207,8 +207,8 @@ class BuildAirportWindow : public PickerWindowBase {
|
||||
{
|
||||
DropDownList *list = new DropDownList();
|
||||
|
||||
for (uint i = 0; i < AirportClass::GetCount(); i++) {
|
||||
list->push_back(new DropDownListStringItem(AirportClass::GetName((AirportClassID)i), i, false));
|
||||
for (uint i = 0; i < AirportClass::GetClassCount(); i++) {
|
||||
list->push_back(new DropDownListStringItem(AirportClass::Get((AirportClassID)i)->name, i, false));
|
||||
}
|
||||
|
||||
return list;
|
||||
@@ -229,7 +229,7 @@ public:
|
||||
this->SetWidgetLoweredState(WID_AP_BTN_DOHILIGHT, _settings_client.gui.station_show_coverage);
|
||||
this->OnInvalidateData();
|
||||
|
||||
this->vscroll->SetCount(AirportClass::GetCount(_selected_airport_class));
|
||||
this->vscroll->SetCount(AirportClass::Get(_selected_airport_class)->GetSpecCount());
|
||||
this->SelectFirstAvailableAirport(true);
|
||||
}
|
||||
|
||||
@@ -242,13 +242,13 @@ public:
|
||||
{
|
||||
switch (widget) {
|
||||
case WID_AP_CLASS_DROPDOWN:
|
||||
SetDParam(0, AirportClass::GetName(_selected_airport_class));
|
||||
SetDParam(0, AirportClass::Get(_selected_airport_class)->name);
|
||||
break;
|
||||
|
||||
case WID_AP_LAYOUT_NUM:
|
||||
SetDParam(0, STR_EMPTY);
|
||||
if (_selected_airport_index != -1) {
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class, _selected_airport_index);
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index);
|
||||
StringID string = GetAirportTextCallback(as, _selected_airport_layout, CBID_AIRPORT_LAYOUT_NAME);
|
||||
if (string != STR_UNDEFINED) {
|
||||
SetDParam(0, string);
|
||||
@@ -268,8 +268,8 @@ public:
|
||||
switch (widget) {
|
||||
case WID_AP_CLASS_DROPDOWN: {
|
||||
Dimension d = {0, 0};
|
||||
for (uint i = 0; i < AirportClass::GetCount(); i++) {
|
||||
SetDParam(0, AirportClass::GetName((AirportClassID)i));
|
||||
for (uint i = 0; i < AirportClass::GetClassCount(); i++) {
|
||||
SetDParam(0, AirportClass::Get((AirportClassID)i)->name);
|
||||
d = maxdim(d, GetStringBoundingBox(STR_BLACK_STRING));
|
||||
}
|
||||
d.width += padding.width;
|
||||
@@ -332,8 +332,9 @@ public:
|
||||
switch (widget) {
|
||||
case WID_AP_AIRPORT_LIST: {
|
||||
int y = r.top;
|
||||
for (uint i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < AirportClass::GetCount(_selected_airport_class); i++) {
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class, i);
|
||||
AirportClass *apclass = AirportClass::Get(_selected_airport_class);
|
||||
for (uint i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < apclass->GetSpecCount(); i++) {
|
||||
const AirportSpec *as = apclass->GetSpec(i);
|
||||
if (!as->IsAvailable()) {
|
||||
GfxFillRect(r.left + 1, y + 1, r.right - 1, y + this->line_height - 2, PC_BLACK, FILLRECT_CHECKER);
|
||||
}
|
||||
@@ -352,7 +353,7 @@ public:
|
||||
|
||||
case WID_AP_EXTRA_TEXT:
|
||||
if (_selected_airport_index != -1) {
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class, _selected_airport_index);
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index);
|
||||
StringID string = GetAirportTextCallback(as, _selected_airport_layout, CBID_AIRPORT_ADDITIONAL_TEXT);
|
||||
if (string != STR_UNDEFINED) {
|
||||
SetDParam(0, string);
|
||||
@@ -374,7 +375,7 @@ public:
|
||||
int bottom = panel_nwi->pos_y + panel_nwi->current_y;
|
||||
|
||||
if (_selected_airport_index != -1) {
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class, _selected_airport_index);
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index);
|
||||
int rad = _settings_game.station.modified_catchment ? as->catchment : (uint)CA_UNMODIFIED;
|
||||
|
||||
/* only show the station (airport) noise, if the noise option is activated */
|
||||
@@ -412,7 +413,7 @@ public:
|
||||
this->DisableWidget(WID_AP_LAYOUT_DECREASE);
|
||||
this->DisableWidget(WID_AP_LAYOUT_INCREASE);
|
||||
} else {
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class, _selected_airport_index);
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index);
|
||||
int w = as->size_x;
|
||||
int h = as->size_y;
|
||||
Direction rotation = as->rotation[_selected_airport_layout];
|
||||
@@ -439,7 +440,7 @@ public:
|
||||
case WID_AP_AIRPORT_LIST: {
|
||||
int num_clicked = this->vscroll->GetPosition() + (pt.y - this->nested_array[widget]->pos_y) / this->line_height;
|
||||
if (num_clicked >= this->vscroll->GetCount()) break;
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class, num_clicked);
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(num_clicked);
|
||||
if (as->IsAvailable()) this->SelectOtherAirport(num_clicked);
|
||||
break;
|
||||
}
|
||||
@@ -449,7 +450,7 @@ public:
|
||||
this->SetWidgetLoweredState(WID_AP_BTN_DONTHILIGHT, !_settings_client.gui.station_show_coverage);
|
||||
this->SetWidgetLoweredState(WID_AP_BTN_DOHILIGHT, _settings_client.gui.station_show_coverage);
|
||||
this->SetDirty();
|
||||
SndPlayFx(SND_15_BEEP);
|
||||
if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
|
||||
this->UpdateSelectSize();
|
||||
break;
|
||||
|
||||
@@ -475,8 +476,9 @@ public:
|
||||
void SelectFirstAvailableAirport(bool change_class)
|
||||
{
|
||||
/* First try to select an airport in the selected class. */
|
||||
for (uint i = 0; i < AirportClass::GetCount(_selected_airport_class); i++) {
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class, i);
|
||||
AirportClass *sel_apclass = AirportClass::Get(_selected_airport_class);
|
||||
for (uint i = 0; i < sel_apclass->GetSpecCount(); i++) {
|
||||
const AirportSpec *as = sel_apclass->GetSpec(i);
|
||||
if (as->IsAvailable()) {
|
||||
this->SelectOtherAirport(i);
|
||||
return;
|
||||
@@ -486,8 +488,9 @@ public:
|
||||
/* If that fails, select the first available airport
|
||||
* from a random class. */
|
||||
for (AirportClassID j = APC_BEGIN; j < APC_MAX; j++) {
|
||||
for (uint i = 0; i < AirportClass::GetCount(j); i++) {
|
||||
const AirportSpec *as = AirportClass::Get(j, i);
|
||||
AirportClass *apclass = AirportClass::Get(j);
|
||||
for (uint i = 0; i < apclass->GetSpecCount(); i++) {
|
||||
const AirportSpec *as = apclass->GetSpec(i);
|
||||
if (as->IsAvailable()) {
|
||||
_selected_airport_class = j;
|
||||
this->SelectOtherAirport(i);
|
||||
@@ -504,7 +507,7 @@ public:
|
||||
{
|
||||
assert(widget == WID_AP_CLASS_DROPDOWN);
|
||||
_selected_airport_class = (AirportClassID)index;
|
||||
this->vscroll->SetCount(AirportClass::GetCount(_selected_airport_class));
|
||||
this->vscroll->SetCount(AirportClass::Get(_selected_airport_class)->GetSpecCount());
|
||||
this->SelectFirstAvailableAirport(false);
|
||||
}
|
||||
|
||||
@@ -554,7 +557,7 @@ static const NWidgetPart _nested_build_airport_widgets[] = {
|
||||
static const WindowDesc _build_airport_desc(
|
||||
WDP_AUTO, 0, 0,
|
||||
WC_BUILD_STATION, WC_BUILD_TOOLBAR,
|
||||
WDF_CONSTRUCTION | WDF_UNCLICK_BUTTONS,
|
||||
WDF_CONSTRUCTION,
|
||||
_nested_build_airport_widgets, lengthof(_nested_build_airport_widgets)
|
||||
);
|
||||
|
||||
|
||||
@@ -54,6 +54,16 @@ static EngineID GetNextArticulatedPart(uint index, EngineID front_type, Vehicle
|
||||
return GetNewEngineID(front_engine->GetGRF(), front_engine->type, callback);
|
||||
}
|
||||
|
||||
/**
|
||||
* Does a NewGRF report that this should be an articulated vehicle?
|
||||
* @param engine_type The engine to check.
|
||||
* @return True iff the articulated engine callback flag is set.
|
||||
*/
|
||||
bool IsArticulatedEngine(EngineID engine_type)
|
||||
{
|
||||
return HasBit(EngInfo(engine_type)->callback_mask, CBM_VEHICLE_ARTIC_ENGINE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Count the number of articulated parts of an engine.
|
||||
* @param engine_type The engine to get the number of parts of.
|
||||
|
||||
@@ -23,6 +23,7 @@ uint32 GetUnionOfArticulatedRefitMasks(EngineID engine, bool include_initial_car
|
||||
uint32 GetIntersectionOfArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type);
|
||||
bool IsArticulatedVehicleCarryingDifferentCargoes(const Vehicle *v, CargoID *cargo_type);
|
||||
bool IsArticulatedVehicleRefittable(EngineID engine);
|
||||
bool IsArticulatedEngine(EngineID engine_type);
|
||||
void CheckConsistencyOfArticulatedVehicle(const Vehicle *v);
|
||||
|
||||
|
||||
|
||||
+6
-2
@@ -57,16 +57,18 @@ void RemoveAllEngineReplacement(EngineRenewList *erl)
|
||||
* @param erl The renewlist to search in.
|
||||
* @param engine Engine type to be replaced.
|
||||
* @param group The group related to this replacement.
|
||||
* @param[out] replace_when_old Set to true if the replacement should be done when old.
|
||||
* @return The engine type to replace with, or INVALID_ENGINE if no
|
||||
* replacement is in the list.
|
||||
*/
|
||||
EngineID EngineReplacement(EngineRenewList erl, EngineID engine, GroupID group)
|
||||
EngineID EngineReplacement(EngineRenewList erl, EngineID engine, GroupID group, bool *replace_when_old)
|
||||
{
|
||||
const EngineRenew *er = GetEngineReplacement(erl, engine, group);
|
||||
if (er == NULL && (group == DEFAULT_GROUP || (Group::IsValidID(group) && !Group::Get(group)->replace_protection))) {
|
||||
/* We didn't find anything useful in the vehicle's own group so we will try ALL_GROUP */
|
||||
er = GetEngineReplacement(erl, engine, ALL_GROUP);
|
||||
}
|
||||
if (replace_when_old != NULL) *replace_when_old = er == NULL ? false : er->replace_when_old;
|
||||
return er == NULL ? INVALID_ENGINE : er->to;
|
||||
}
|
||||
|
||||
@@ -76,10 +78,11 @@ EngineID EngineReplacement(EngineRenewList erl, EngineID engine, GroupID group)
|
||||
* @param old_engine The original engine type.
|
||||
* @param new_engine The replacement engine type.
|
||||
* @param group The group related to this replacement.
|
||||
* @param replace_when_old Replace when old or always?
|
||||
* @param flags The calling command flags.
|
||||
* @return 0 on success, CMD_ERROR on failure.
|
||||
*/
|
||||
CommandCost AddEngineReplacement(EngineRenewList *erl, EngineID old_engine, EngineID new_engine, GroupID group, DoCommandFlag flags)
|
||||
CommandCost AddEngineReplacement(EngineRenewList *erl, EngineID old_engine, EngineID new_engine, GroupID group, bool replace_when_old, DoCommandFlag flags)
|
||||
{
|
||||
/* Check if the old vehicle is already in the list */
|
||||
EngineRenew *er = GetEngineReplacement(*erl, old_engine, group);
|
||||
@@ -93,6 +96,7 @@ CommandCost AddEngineReplacement(EngineRenewList *erl, EngineID old_engine, Engi
|
||||
if (flags & DC_EXEC) {
|
||||
er = new EngineRenew(old_engine, new_engine);
|
||||
er->group_id = group;
|
||||
er->replace_when_old = replace_when_old;
|
||||
|
||||
/* Insert before the first element */
|
||||
er->next = (EngineRenew *)(*erl);
|
||||
|
||||
@@ -37,6 +37,7 @@ struct EngineRenew : EngineRenewPool::PoolItem<&_enginerenew_pool> {
|
||||
EngineID to;
|
||||
EngineRenew *next;
|
||||
GroupID group_id;
|
||||
bool replace_when_old; ///< Do replacement only when vehicle is old.
|
||||
|
||||
EngineRenew(EngineID from = INVALID_ENGINE, EngineID to = INVALID_ENGINE) : from(from), to(to) {}
|
||||
~EngineRenew() {}
|
||||
|
||||
+15
-13
@@ -225,10 +225,11 @@ static CargoID GetNewCargoTypeForReplace(Vehicle *v, EngineID engine_type, bool
|
||||
* Get the EngineID of the replacement for a vehicle
|
||||
* @param v The vehicle to find a replacement for
|
||||
* @param c The vehicle's owner (it's faster to forward the pointer than refinding it)
|
||||
* @param always_replace Always replace, even if not old.
|
||||
* @param [out] e the EngineID of the replacement. INVALID_ENGINE if no replacement is found
|
||||
* @return Error if the engine to build is not available
|
||||
*/
|
||||
static CommandCost GetNewEngineType(const Vehicle *v, const Company *c, EngineID &e)
|
||||
static CommandCost GetNewEngineType(const Vehicle *v, const Company *c, bool always_replace, EngineID &e)
|
||||
{
|
||||
assert(v->type != VEH_TRAIN || !v->IsArticulatedPart());
|
||||
|
||||
@@ -239,7 +240,9 @@ static CommandCost GetNewEngineType(const Vehicle *v, const Company *c, EngineID
|
||||
return CommandCost();
|
||||
}
|
||||
|
||||
e = EngineReplacementForCompany(c, v->engine_type, v->group_id);
|
||||
bool replace_when_old;
|
||||
e = EngineReplacementForCompany(c, v->engine_type, v->group_id, &replace_when_old);
|
||||
if (!always_replace && replace_when_old && !v->NeedsAutorenewing(c, false)) e = INVALID_ENGINE;
|
||||
|
||||
/* Autoreplace, if engine is available */
|
||||
if (e != INVALID_ENGINE && IsEngineBuildable(e, v->type, _current_company)) {
|
||||
@@ -271,7 +274,7 @@ static CommandCost BuildReplacementVehicle(Vehicle *old_veh, Vehicle **new_vehic
|
||||
/* Shall the vehicle be replaced? */
|
||||
const Company *c = Company::Get(_current_company);
|
||||
EngineID e;
|
||||
CommandCost cost = GetNewEngineType(old_veh, c, e);
|
||||
CommandCost cost = GetNewEngineType(old_veh, c, true, e);
|
||||
if (cost.Failed()) return cost;
|
||||
if (e == INVALID_ENGINE) return CommandCost(); // neither autoreplace is set, nor autorenew is triggered
|
||||
|
||||
@@ -354,11 +357,6 @@ static CommandCost CopyHeadSpecificThings(Vehicle *old_head, Vehicle *new_head,
|
||||
|
||||
/* Last do those things which do never fail (resp. we do not care about), but which are not undo-able */
|
||||
if (cost.Succeeded() && old_head != new_head && (flags & DC_EXEC) != 0) {
|
||||
/* Copy vehicle name */
|
||||
if (old_head->name != NULL) {
|
||||
DoCommand(0, new_head->index, 0, DC_EXEC | DC_AUTOREPLACE, CMD_RENAME_VEHICLE, old_head->name);
|
||||
}
|
||||
|
||||
/* Copy other things which cannot be copied by a command and which shall not stay resetted from the build vehicle command */
|
||||
new_head->CopyVehicleConfigAndStatistics(old_head);
|
||||
|
||||
@@ -662,7 +660,7 @@ CommandCost CmdAutoreplaceVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1
|
||||
CommandCost ret = CheckOwnership(v->owner);
|
||||
if (ret.Failed()) return ret;
|
||||
|
||||
if (!v->IsInDepot()) return CMD_ERROR;
|
||||
if (!v->IsChainInDepot()) return CMD_ERROR;
|
||||
if (v->vehstatus & VS_CRASHED) return CMD_ERROR;
|
||||
|
||||
bool free_wagon = false;
|
||||
@@ -683,7 +681,7 @@ CommandCost CmdAutoreplaceVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1
|
||||
bool any_replacements = false;
|
||||
while (w != NULL) {
|
||||
EngineID e;
|
||||
CommandCost cost = GetNewEngineType(w, c, e);
|
||||
CommandCost cost = GetNewEngineType(w, c, false, e);
|
||||
if (cost.Failed()) return cost;
|
||||
any_replacements |= (e != INVALID_ENGINE);
|
||||
w = (!free_wagon && w->type == VEH_TRAIN ? Train::From(w)->GetNextUnit() : NULL);
|
||||
@@ -699,7 +697,7 @@ CommandCost CmdAutoreplaceVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1
|
||||
if (!was_stopped) cost.AddCost(CmdStartStopVehicle(v, true));
|
||||
if (cost.Failed()) return cost;
|
||||
|
||||
assert(v->IsStoppedInDepot());
|
||||
assert(free_wagon || v->IsStoppedInDepot());
|
||||
|
||||
/* We have to construct the new vehicle chain to test whether it is valid.
|
||||
* Vehicle construction needs random bits, so we have to save the random seeds
|
||||
@@ -736,6 +734,7 @@ CommandCost CmdAutoreplaceVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1
|
||||
* @param tile unused
|
||||
* @param flags operation to perform
|
||||
* @param p1 packed data
|
||||
* - bit 0 = replace when engine gets old?
|
||||
* - bits 16-31 = engine group
|
||||
* @param p2 packed data
|
||||
* - bits 0-15 = old engine type
|
||||
@@ -760,12 +759,15 @@ CommandCost CmdSetAutoReplace(TileIndex tile, DoCommandFlag flags, uint32 p1, ui
|
||||
if (!Engine::IsValidID(new_engine_type)) return CMD_ERROR;
|
||||
if (!CheckAutoreplaceValidity(old_engine_type, new_engine_type, _current_company)) return CMD_ERROR;
|
||||
|
||||
cost = AddEngineReplacementForCompany(c, old_engine_type, new_engine_type, id_g, flags);
|
||||
cost = AddEngineReplacementForCompany(c, old_engine_type, new_engine_type, id_g, HasBit(p1, 0), flags);
|
||||
} else {
|
||||
cost = RemoveEngineReplacementForCompany(c, old_engine_type, id_g, flags);
|
||||
}
|
||||
|
||||
if (flags & DC_EXEC) GroupStatistics::UpdateAutoreplace(_current_company);
|
||||
if (flags & DC_EXEC) {
|
||||
GroupStatistics::UpdateAutoreplace(_current_company);
|
||||
SetWindowClassesDirty(GetWindowClassForVehicleType(Engine::Get(old_engine_type)->type));
|
||||
}
|
||||
if ((flags & DC_EXEC) && IsLocalCompany()) InvalidateAutoreplaceWindow(old_engine_type, id_g);
|
||||
|
||||
return cost;
|
||||
|
||||
+22
-6
@@ -16,8 +16,8 @@
|
||||
#include "company_base.h"
|
||||
|
||||
void RemoveAllEngineReplacement(EngineRenewList *erl);
|
||||
EngineID EngineReplacement(EngineRenewList erl, EngineID engine, GroupID group);
|
||||
CommandCost AddEngineReplacement(EngineRenewList *erl, EngineID old_engine, EngineID new_engine, GroupID group, DoCommandFlag flags);
|
||||
EngineID EngineReplacement(EngineRenewList erl, EngineID engine, GroupID group, bool *replace_when_old = NULL);
|
||||
CommandCost AddEngineReplacement(EngineRenewList *erl, EngineID old_engine, EngineID new_engine, GroupID group, bool replace_when_old, DoCommandFlag flags);
|
||||
CommandCost RemoveEngineReplacement(EngineRenewList *erl, EngineID engine, GroupID group, DoCommandFlag flags);
|
||||
|
||||
/**
|
||||
@@ -34,12 +34,13 @@ static inline void RemoveAllEngineReplacementForCompany(Company *c)
|
||||
* @param c company.
|
||||
* @param engine Engine type.
|
||||
* @param group The group related to this replacement.
|
||||
* @param[out] replace_when_old Set to true if the replacement should be done when old.
|
||||
* @return The engine type to replace with, or INVALID_ENGINE if no
|
||||
* replacement is in the list.
|
||||
*/
|
||||
static inline EngineID EngineReplacementForCompany(const Company *c, EngineID engine, GroupID group)
|
||||
static inline EngineID EngineReplacementForCompany(const Company *c, EngineID engine, GroupID group, bool *replace_when_old = NULL)
|
||||
{
|
||||
return EngineReplacement(c->engine_renew_list, engine, group);
|
||||
return EngineReplacement(c->engine_renew_list, engine, group, replace_when_old);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -54,18 +55,33 @@ static inline bool EngineHasReplacementForCompany(const Company *c, EngineID eng
|
||||
return EngineReplacementForCompany(c, engine, group) != INVALID_ENGINE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a company has a replacement set up for the given engine when it gets old.
|
||||
* @param c Company.
|
||||
* @param engine Engine type to be replaced.
|
||||
* @param group The group related to this replacement.
|
||||
* @return True if a replacement when old was set up, false otherwise.
|
||||
*/
|
||||
static inline bool EngineHasReplacementWhenOldForCompany(const Company *c, EngineID engine, GroupID group)
|
||||
{
|
||||
bool replace_when_old;
|
||||
EngineReplacement(c->engine_renew_list, engine, group, &replace_when_old);
|
||||
return replace_when_old;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an engine replacement for the company.
|
||||
* @param c Company.
|
||||
* @param old_engine The original engine type.
|
||||
* @param new_engine The replacement engine type.
|
||||
* @param group The group related to this replacement.
|
||||
* @param replace_when_old Replace when old or always?
|
||||
* @param flags The calling command flags.
|
||||
* @return 0 on success, CMD_ERROR on failure.
|
||||
*/
|
||||
static inline CommandCost AddEngineReplacementForCompany(Company *c, EngineID old_engine, EngineID new_engine, GroupID group, DoCommandFlag flags)
|
||||
static inline CommandCost AddEngineReplacementForCompany(Company *c, EngineID old_engine, EngineID new_engine, GroupID group, bool replace_when_old, DoCommandFlag flags)
|
||||
{
|
||||
return AddEngineReplacement(&c->engine_renew_list, old_engine, new_engine, group, flags);
|
||||
return AddEngineReplacement(&c->engine_renew_list, old_engine, new_engine, group, replace_when_old, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+85
-32
@@ -24,6 +24,7 @@
|
||||
#include "settings_func.h"
|
||||
#include "core/geometry_func.hpp"
|
||||
#include "rail_gui.h"
|
||||
#include "widgets/dropdown_func.h"
|
||||
|
||||
#include "widgets/autoreplace_widget.h"
|
||||
|
||||
@@ -33,7 +34,7 @@ void DrawEngineList(VehicleType type, int x, int r, int y, const GUIEngineList *
|
||||
|
||||
static int CDECL EngineNumberSorter(const EngineID *a, const EngineID *b)
|
||||
{
|
||||
int r = ListPositionOfEngine(*a) - ListPositionOfEngine(*b);
|
||||
int r = Engine::Get(*a)->list_position - Engine::Get(*b)->list_position;
|
||||
|
||||
return r;
|
||||
}
|
||||
@@ -67,6 +68,12 @@ void AddRemoveEngineFromAutoreplaceAndBuildWindows(VehicleType type)
|
||||
InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well
|
||||
}
|
||||
|
||||
static const StringID _start_replace_dropdown[] = {
|
||||
STR_REPLACE_VEHICLES_NOW,
|
||||
STR_REPLACE_VEHICLES_WHEN_OLD,
|
||||
INVALID_STRING_ID
|
||||
};
|
||||
|
||||
/**
|
||||
* Window for the autoreplacing of vehicles.
|
||||
*/
|
||||
@@ -170,6 +177,18 @@ class ReplaceVehicleWindow : public Window {
|
||||
this->reset_sel_engine = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle click on the start replace button.
|
||||
* @param replace_when_old Replace now or only when old?
|
||||
*/
|
||||
void ReplaceClick_StartReplace(bool replace_when_old)
|
||||
{
|
||||
EngineID veh_from = this->sel_engine[0];
|
||||
EngineID veh_to = this->sel_engine[1];
|
||||
DoCommandP(0, (replace_when_old ? 1 : 0) | (this->sel_group << 16), veh_from + (veh_to << 16), CMD_SET_AUTOREPLACE);
|
||||
this->SetDirty();
|
||||
}
|
||||
|
||||
public:
|
||||
ReplaceVehicleWindow(const WindowDesc *desc, VehicleType vehicletype, GroupID id_g) : Window()
|
||||
{
|
||||
@@ -270,6 +289,17 @@ public:
|
||||
*size = maxdim(*size, d);
|
||||
break;
|
||||
}
|
||||
|
||||
case WID_RV_START_REPLACE: {
|
||||
Dimension d = GetStringBoundingBox(STR_REPLACE_VEHICLES_START);
|
||||
for (int i = 0; _start_replace_dropdown[i] != INVALID_STRING_ID; i++) {
|
||||
d = maxdim(d, GetStringBoundingBox(_start_replace_dropdown[i]));
|
||||
}
|
||||
d.width += padding.width;
|
||||
d.height += padding.height;
|
||||
*size = maxdim(*size, d);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -278,6 +308,20 @@ public:
|
||||
switch (widget) {
|
||||
case WID_RV_CAPTION:
|
||||
SetDParam(0, STR_REPLACE_VEHICLE_TRAIN + this->window_number);
|
||||
switch (this->sel_group) {
|
||||
case ALL_GROUP:
|
||||
SetDParam(1, STR_GROUP_ALL_TRAINS + this->window_number);
|
||||
break;
|
||||
|
||||
case DEFAULT_GROUP:
|
||||
SetDParam(1, STR_GROUP_DEFAULT_TRAINS + this->window_number);
|
||||
break;
|
||||
|
||||
default:
|
||||
SetDParam(1, STR_GROUP_NAME);
|
||||
SetDParam(2, sel_group);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case WID_RV_TRAIN_WAGONREMOVE_TOGGLE: {
|
||||
@@ -301,8 +345,10 @@ public:
|
||||
if (!EngineHasReplacementForCompany(c, this->sel_engine[0], this->sel_group)) {
|
||||
SetDParam(0, STR_REPLACE_NOT_REPLACING);
|
||||
} else {
|
||||
SetDParam(0, STR_ENGINE_NAME);
|
||||
SetDParam(1, EngineReplacementForCompany(c, this->sel_engine[0], this->sel_group));
|
||||
bool when_old = false;
|
||||
EngineID e = EngineReplacementForCompany(c, this->sel_engine[0], this->sel_group, &when_old);
|
||||
SetDParam(0, when_old ? STR_REPLACE_REPLACING_WHEN_OLD : STR_ENGINE_NAME);
|
||||
SetDParam(1, e);
|
||||
}
|
||||
} else {
|
||||
SetDParam(0, STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED);
|
||||
@@ -334,13 +380,11 @@ public:
|
||||
|
||||
/* Disable the "Start Replacing" button if:
|
||||
* Either engines list is empty
|
||||
* or The selected replacement engine has a replacement (to prevent loops)
|
||||
* or The right engines list (new replacement) has the existing replacement vehicle selected */
|
||||
* or The selected replacement engine has a replacement (to prevent loops). */
|
||||
this->SetWidgetDisabledState(WID_RV_START_REPLACE,
|
||||
this->sel_engine[0] == INVALID_ENGINE ||
|
||||
this->sel_engine[1] == INVALID_ENGINE ||
|
||||
EngineReplacementForCompany(c, this->sel_engine[1], this->sel_group) != INVALID_ENGINE ||
|
||||
EngineReplacementForCompany(c, this->sel_engine[0], this->sel_group) == this->sel_engine[1]);
|
||||
EngineReplacementForCompany(c, this->sel_engine[1], this->sel_group) != INVALID_ENGINE);
|
||||
|
||||
/* Disable the "Stop Replacing" button if:
|
||||
* The left engines list (existing vehicle) is empty
|
||||
@@ -349,9 +393,6 @@ public:
|
||||
this->sel_engine[0] == INVALID_ENGINE ||
|
||||
!EngineHasReplacementForCompany(c, this->sel_engine[0], this->sel_group));
|
||||
|
||||
/* now the actual drawing of the window itself takes place */
|
||||
SetDParam(0, STR_REPLACE_VEHICLE_TRAIN + this->window_number);
|
||||
|
||||
if (this->window_number == VEH_TRAIN) {
|
||||
/* sets the colour of that art thing */
|
||||
this->GetWidget<NWidgetCore>(WID_RV_TRAIN_FLUFF_LEFT)->colour = _company_colours[_local_company];
|
||||
@@ -401,10 +442,13 @@ public:
|
||||
break;
|
||||
|
||||
case WID_RV_START_REPLACE: { // Start replacing
|
||||
EngineID veh_from = this->sel_engine[0];
|
||||
EngineID veh_to = this->sel_engine[1];
|
||||
DoCommandP(0, this->sel_group << 16, veh_from + (veh_to << 16), CMD_SET_AUTOREPLACE);
|
||||
this->SetDirty();
|
||||
if (this->GetWidget<NWidgetLeaf>(widget)->ButtonHit(pt)) {
|
||||
this->HandleButtonClick(WID_RV_START_REPLACE);
|
||||
ReplaceClick_StartReplace(false);
|
||||
} else {
|
||||
bool replacment_when_old = EngineHasReplacementWhenOldForCompany(Company::Get(_local_company), this->sel_engine[0], this->sel_group);
|
||||
ShowDropDownMenu(this, _start_replace_dropdown, replacment_when_old ? 1 : 0, WID_RV_START_REPLACE, !this->replace_engines ? 1 << 1 : 0, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -441,17 +485,26 @@ public:
|
||||
|
||||
virtual void OnDropdownSelect(int widget, int index)
|
||||
{
|
||||
RailType temp = (RailType)index;
|
||||
if (temp == sel_railtype) return; // we didn't select a new one. No need to change anything
|
||||
sel_railtype = temp;
|
||||
/* Reset scrollbar positions */
|
||||
this->vscroll[0]->SetPosition(0);
|
||||
this->vscroll[1]->SetPosition(0);
|
||||
/* Rebuild the lists */
|
||||
this->engines[0].ForceRebuild();
|
||||
this->engines[1].ForceRebuild();
|
||||
this->reset_sel_engine = true;
|
||||
this->SetDirty();
|
||||
switch (widget) {
|
||||
case WID_RV_TRAIN_RAILTYPE_DROPDOWN: {
|
||||
RailType temp = (RailType)index;
|
||||
if (temp == sel_railtype) return; // we didn't select a new one. No need to change anything
|
||||
sel_railtype = temp;
|
||||
/* Reset scrollbar positions */
|
||||
this->vscroll[0]->SetPosition(0);
|
||||
this->vscroll[1]->SetPosition(0);
|
||||
/* Rebuild the lists */
|
||||
this->engines[0].ForceRebuild();
|
||||
this->engines[1].ForceRebuild();
|
||||
this->reset_sel_engine = true;
|
||||
this->SetDirty();
|
||||
break;
|
||||
}
|
||||
|
||||
case WID_RV_START_REPLACE:
|
||||
this->ReplaceClick_StartReplace(index != 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
virtual void OnResize()
|
||||
@@ -493,11 +546,11 @@ static const NWidgetPart _nested_replace_rail_vehicle_widgets[] = {
|
||||
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_RV_RIGHT_SCROLLBAR),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_LEFT_DETAILS), SetMinimalSize(228, 102), SetResize(1, 0), EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_RIGHT_DETAILS), SetMinimalSize(228, 102), SetResize(1, 0), EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_LEFT_DETAILS), SetMinimalSize(240, 122), SetResize(1, 0), EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_RIGHT_DETAILS), SetMinimalSize(240, 122), SetResize(1, 0), EndContainer(),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_START_REPLACE), SetMinimalSize(139, 12), SetDataTip(STR_REPLACE_VEHICLES_START, STR_REPLACE_HELP_START_BUTTON),
|
||||
NWidget(NWID_PUSHBUTTON_DROPDOWN, COLOUR_GREY, WID_RV_START_REPLACE), SetMinimalSize(139, 12), SetDataTip(STR_REPLACE_VEHICLES_START, STR_REPLACE_HELP_START_BUTTON),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_INFO_TAB), SetMinimalSize(167, 12), SetDataTip(0x0, STR_REPLACE_HELP_REPLACE_INFO_TAB), SetResize(1, 0),
|
||||
EndContainer(),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_STOP_REPLACE), SetMinimalSize(150, 12), SetDataTip(STR_REPLACE_VEHICLES_STOP, STR_REPLACE_HELP_STOP_BUTTON),
|
||||
@@ -513,9 +566,9 @@ static const NWidgetPart _nested_replace_rail_vehicle_widgets[] = {
|
||||
};
|
||||
|
||||
static const WindowDesc _replace_rail_vehicle_desc(
|
||||
WDP_AUTO, 456, 140,
|
||||
WDP_AUTO, 500, 140,
|
||||
WC_REPLACE_VEHICLE, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS | WDF_CONSTRUCTION,
|
||||
WDF_CONSTRUCTION,
|
||||
_nested_replace_rail_vehicle_widgets, lengthof(_nested_replace_rail_vehicle_widgets)
|
||||
);
|
||||
|
||||
@@ -537,7 +590,7 @@ static const NWidgetPart _nested_replace_vehicle_widgets[] = {
|
||||
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_RIGHT_DETAILS), SetMinimalSize(228, 92), SetResize(1, 0), EndContainer(),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_START_REPLACE), SetMinimalSize(139, 12), SetDataTip(STR_REPLACE_VEHICLES_START, STR_REPLACE_HELP_START_BUTTON),
|
||||
NWidget(NWID_PUSHBUTTON_DROPDOWN, COLOUR_GREY, WID_RV_START_REPLACE), SetMinimalSize(139, 12), SetDataTip(STR_REPLACE_VEHICLES_START, STR_REPLACE_HELP_START_BUTTON),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_INFO_TAB), SetMinimalSize(167, 12), SetDataTip(0x0, STR_REPLACE_HELP_REPLACE_INFO_TAB), SetResize(1, 0), EndContainer(),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_STOP_REPLACE), SetMinimalSize(138, 12), SetDataTip(STR_REPLACE_VEHICLES_STOP, STR_REPLACE_HELP_STOP_BUTTON),
|
||||
NWidget(WWT_RESIZEBOX, COLOUR_GREY),
|
||||
@@ -547,7 +600,7 @@ static const NWidgetPart _nested_replace_vehicle_widgets[] = {
|
||||
static const WindowDesc _replace_vehicle_desc(
|
||||
WDP_AUTO, 456, 118,
|
||||
WC_REPLACE_VEHICLE, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS | WDF_CONSTRUCTION,
|
||||
WDF_CONSTRUCTION,
|
||||
_nested_replace_vehicle_widgets, lengthof(_nested_replace_vehicle_widgets)
|
||||
);
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
/* $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 base_consist.cpp Properties for front vehicles/consists. */
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "base_consist.h"
|
||||
#include "vehicle_base.h"
|
||||
|
||||
BaseConsist::~BaseConsist()
|
||||
{
|
||||
free(this->name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy properties of other BaseConsist.
|
||||
* @param src Source for copying
|
||||
*/
|
||||
void BaseConsist::CopyConsistPropertiesFrom(const BaseConsist *src)
|
||||
{
|
||||
if (this == src) return;
|
||||
|
||||
free(this->name);
|
||||
this->name = src->name != NULL ? strdup(src->name) : NULL;
|
||||
|
||||
this->current_order_time = src->current_order_time;
|
||||
this->lateness_counter = src->lateness_counter;
|
||||
this->timetable_start = src->timetable_start;
|
||||
|
||||
this->service_interval = src->service_interval;
|
||||
|
||||
this->cur_real_order_index = src->cur_real_order_index;
|
||||
this->cur_implicit_order_index = src->cur_implicit_order_index;
|
||||
|
||||
if (HasBit(src->vehicle_flags, VF_TIMETABLE_STARTED)) SetBit(this->vehicle_flags, VF_TIMETABLE_STARTED);
|
||||
if (HasBit(src->vehicle_flags, VF_AUTOFILL_TIMETABLE)) SetBit(this->vehicle_flags, VF_AUTOFILL_TIMETABLE);
|
||||
if (HasBit(src->vehicle_flags, VF_AUTOFILL_PRES_WAIT_TIME)) SetBit(this->vehicle_flags, VF_AUTOFILL_PRES_WAIT_TIME);
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/* $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 base_consist.h Properties for front vehicles/consists. */
|
||||
|
||||
#ifndef BASE_CONSIST_H
|
||||
#define BASE_CONSIST_H
|
||||
|
||||
#include "order_type.h"
|
||||
#include "date_type.h"
|
||||
|
||||
/** Various front vehicle properties that are preserved when autoreplacing, using order-backup or switching front engines within a consist. */
|
||||
struct BaseConsist {
|
||||
char *name; ///< Name of vehicle
|
||||
|
||||
/* Used for timetabling. */
|
||||
uint32 current_order_time; ///< How many ticks have passed since this order started.
|
||||
int32 lateness_counter; ///< How many ticks late (or early if negative) this vehicle is.
|
||||
Date timetable_start; ///< When the vehicle is supposed to start the timetable.
|
||||
|
||||
Date service_interval; ///< The interval for (automatic) servicing; either in days or %.
|
||||
|
||||
VehicleOrderID cur_real_order_index;///< The index to the current real (non-implicit) order
|
||||
VehicleOrderID cur_implicit_order_index;///< The index to the current implicit order
|
||||
|
||||
byte vehicle_flags; ///< Used for gradual loading and other miscellaneous things (@see VehicleFlags enum)
|
||||
|
||||
BaseConsist() : name(NULL) {}
|
||||
virtual ~BaseConsist();
|
||||
|
||||
void CopyConsistPropertiesFrom(const BaseConsist *src);
|
||||
};
|
||||
|
||||
#endif /* BASE_CONSIST_H */
|
||||
@@ -15,6 +15,8 @@
|
||||
#include "fileio_func.h"
|
||||
#include "core/smallmap_type.hpp"
|
||||
#include "gfx_type.h"
|
||||
#include "textfile_type.h"
|
||||
#include "textfile_gui.h"
|
||||
|
||||
/* Forward declare these; can't do 'struct X' in functions as older GCCs barf on that */
|
||||
struct IniFile;
|
||||
@@ -143,6 +145,22 @@ struct BaseSet {
|
||||
{
|
||||
return file->CheckMD5(subdir, SIZE_MAX);
|
||||
}
|
||||
|
||||
/**
|
||||
* Search a textfile file next to this base media.
|
||||
* @param type The type of the textfile to search for.
|
||||
* @return The filename for the textfile, \c NULL otherwise.
|
||||
*/
|
||||
const char *GetTextfile(TextfileType type) const
|
||||
{
|
||||
for (uint i = 0; i < NUM_FILES; i++) {
|
||||
const char *textfile = ::GetTextfile(type, BASESET_DIR, this->files[i].filename);
|
||||
if (textfile != NULL) {
|
||||
return textfile;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -183,6 +201,8 @@ public:
|
||||
return num + fs.Scan(GetExtension(), BASESET_DIR, Tbase_set::SEARCH_IN_TARS);
|
||||
}
|
||||
|
||||
static Tbase_set *GetAvailableSets();
|
||||
|
||||
static bool SetSet(const char *name);
|
||||
static char *GetSetsList(char *p, const char *last);
|
||||
static int GetNumSets();
|
||||
@@ -199,6 +219,15 @@ public:
|
||||
static bool HasSet(const ContentInfo *ci, bool md5sum);
|
||||
};
|
||||
|
||||
/**
|
||||
* Check whether there's a base set matching some information.
|
||||
* @param ci The content info to compare it to.
|
||||
* @param md5sum Should the MD5 checksum be tested as well?
|
||||
* @param s The list with sets.
|
||||
* @return The filename of the first file of the base set, or \c NULL if there is no match.
|
||||
*/
|
||||
template <class Tbase_set>
|
||||
const char *TryGetBaseSetFile(const ContentInfo *ci, bool md5sum, const Tbase_set *s);
|
||||
|
||||
/** Types of graphics in the base graphics set */
|
||||
enum GraphicsFileType {
|
||||
|
||||
+29
-15
@@ -7,7 +7,10 @@
|
||||
* 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 base_media_func.h Generic function implementations for base data (graphics, sounds). */
|
||||
/**
|
||||
* @file base_media_func.h Generic function implementations for base data (graphics, sounds).
|
||||
* @note You should _never_ include this file due to the SET_TYPE define.
|
||||
*/
|
||||
|
||||
#include "base_media_base.h"
|
||||
#include "debug.h"
|
||||
@@ -274,19 +277,13 @@ template <class Tbase_set>
|
||||
#if defined(ENABLE_NETWORK)
|
||||
#include "network/network_content.h"
|
||||
|
||||
/**
|
||||
* Check whether there's a base set matching some information.
|
||||
* @param ci The content info to compare it to.
|
||||
* @param md5sum Should the MD5 checksum be tested as well?
|
||||
* @param s The list with sets.
|
||||
*/
|
||||
template <class Tbase_set> bool HasBaseSet(const ContentInfo *ci, bool md5sum, const Tbase_set *s)
|
||||
template <class Tbase_set> const char *TryGetBaseSetFile(const ContentInfo *ci, bool md5sum, const Tbase_set *s)
|
||||
{
|
||||
for (; s != NULL; s = s->next) {
|
||||
if (s->GetNumMissing() != 0) continue;
|
||||
|
||||
if (s->shortname != ci->unique_id) continue;
|
||||
if (!md5sum) return true;
|
||||
if (!md5sum) return s->files[0].filename;
|
||||
|
||||
byte md5[16];
|
||||
memset(md5, 0, sizeof(md5));
|
||||
@@ -295,21 +292,26 @@ template <class Tbase_set> bool HasBaseSet(const ContentInfo *ci, bool md5sum, c
|
||||
md5[j] ^= s->files[i].hash[j];
|
||||
}
|
||||
}
|
||||
if (memcmp(md5, ci->md5sum, sizeof(md5)) == 0) return true;
|
||||
if (memcmp(md5, ci->md5sum, sizeof(md5)) == 0) return s->files[0].filename;
|
||||
}
|
||||
|
||||
return false;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
template <class Tbase_set>
|
||||
/* static */ bool BaseMedia<Tbase_set>::HasSet(const ContentInfo *ci, bool md5sum)
|
||||
{
|
||||
return HasBaseSet(ci, md5sum, BaseMedia<Tbase_set>::available_sets) ||
|
||||
HasBaseSet(ci, md5sum, BaseMedia<Tbase_set>::duplicate_sets);
|
||||
return (TryGetBaseSetFile(ci, md5sum, BaseMedia<Tbase_set>::available_sets) != NULL) ||
|
||||
(TryGetBaseSetFile(ci, md5sum, BaseMedia<Tbase_set>::duplicate_sets) != NULL);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
template <class Tbase_set>
|
||||
const char *TryGetBaseSetFile(const ContentInfo *ci, bool md5sum, const Tbase_set *s)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
template <class Tbase_set>
|
||||
/* static */ bool BaseMedia<Tbase_set>::HasSet(const ContentInfo *ci, bool md5sum)
|
||||
{
|
||||
@@ -374,6 +376,16 @@ template <class Tbase_set>
|
||||
return BaseMedia<Tbase_set>::used_set;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the available sets.
|
||||
* @return The available sets.
|
||||
*/
|
||||
template <class Tbase_set>
|
||||
/* static */ Tbase_set *BaseMedia<Tbase_set>::GetAvailableSets()
|
||||
{
|
||||
return BaseMedia<Tbase_set>::available_sets;
|
||||
}
|
||||
|
||||
/**
|
||||
* Force instantiation of methods so we don't get linker errors.
|
||||
* @param repl_type the type of the BaseMedia to instantiate
|
||||
@@ -390,5 +402,7 @@ template <class Tbase_set>
|
||||
template int repl_type::GetIndexOfUsedSet(); \
|
||||
template const set_type *repl_type::GetSet(int index); \
|
||||
template const set_type *repl_type::GetUsedSet(); \
|
||||
template bool repl_type::DetermineBestSet();
|
||||
template bool repl_type::DetermineBestSet(); \
|
||||
template set_type *repl_type::GetAvailableSets(); \
|
||||
template const char *TryGetBaseSetFile(const ContentInfo *ci, bool md5sum, const set_type *s);
|
||||
|
||||
|
||||
+10
-10
@@ -31,13 +31,13 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
|
||||
src_n = (const uint16 *)((const byte *)src_n + *(const uint32 *)src_n);
|
||||
}
|
||||
|
||||
uint32 *dst = (uint32 *)bp->dst + bp->top * bp->pitch + bp->left;
|
||||
Colour *dst = (Colour *)bp->dst + bp->top * bp->pitch + bp->left;
|
||||
uint16 *anim = this->anim_buf + ((uint32 *)bp->dst - (uint32 *)_screen.dst_ptr) + bp->top * this->anim_buf_width + bp->left;
|
||||
|
||||
const byte *remap = bp->remap; // store so we don't have to access it via bp everytime
|
||||
|
||||
for (int y = 0; y < bp->height; y++) {
|
||||
uint32 *dst_ln = dst + bp->pitch;
|
||||
Colour *dst_ln = dst + bp->pitch;
|
||||
uint16 *anim_ln = anim + this->anim_buf_width;
|
||||
|
||||
const Colour *src_px_ln = (const Colour *)((const byte *)src_px + *(const uint32 *)src_px);
|
||||
@@ -46,7 +46,7 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
|
||||
const uint16 *src_n_ln = (const uint16 *)((const byte *)src_n + *(const uint32 *)src_n);
|
||||
src_n += 2;
|
||||
|
||||
uint32 *dst_end = dst + bp->skip_left;
|
||||
Colour *dst_end = dst + bp->skip_left;
|
||||
|
||||
uint n;
|
||||
|
||||
@@ -219,7 +219,7 @@ void Blitter_32bppAnim::DrawColourMappingRect(void *dst, int width, int height,
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 *udst = (uint32 *)dst;
|
||||
Colour *udst = (Colour *)dst;
|
||||
uint16 *anim;
|
||||
|
||||
anim = this->anim_buf + ((uint32 *)dst - (uint32 *)_screen.dst_ptr);
|
||||
@@ -256,7 +256,7 @@ void Blitter_32bppAnim::DrawColourMappingRect(void *dst, int width, int height,
|
||||
|
||||
void Blitter_32bppAnim::SetPixel(void *video, int x, int y, uint8 colour)
|
||||
{
|
||||
*((uint32 *)video + x + y * _screen.pitch) = LookupColourInPalette(colour);
|
||||
*((Colour *)video + x + y * _screen.pitch) = LookupColourInPalette(colour);
|
||||
|
||||
/* Set the colour in the anim-buffer too, if we are rendering to the screen */
|
||||
if (_screen_disable_anim) return;
|
||||
@@ -271,13 +271,13 @@ void Blitter_32bppAnim::DrawRect(void *video, int width, int height, uint8 colou
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 colour32 = LookupColourInPalette(colour);
|
||||
Colour colour32 = LookupColourInPalette(colour);
|
||||
uint16 *anim_line;
|
||||
|
||||
anim_line = ((uint32 *)video - (uint32 *)_screen.dst_ptr) + this->anim_buf;
|
||||
|
||||
do {
|
||||
uint32 *dst = (uint32 *)video;
|
||||
Colour *dst = (Colour *)video;
|
||||
uint16 *anim = anim_line;
|
||||
|
||||
for (int i = width; i > 0; i--) {
|
||||
@@ -296,13 +296,13 @@ void Blitter_32bppAnim::CopyFromBuffer(void *video, const void *src, int width,
|
||||
{
|
||||
assert(!_screen_disable_anim);
|
||||
assert(video >= _screen.dst_ptr && video <= (uint32 *)_screen.dst_ptr + _screen.width + _screen.height * _screen.pitch);
|
||||
uint32 *dst = (uint32 *)video;
|
||||
Colour *dst = (Colour *)video;
|
||||
const uint32 *usrc = (const uint32 *)src;
|
||||
uint16 *anim_line = ((uint32 *)video - (uint32 *)_screen.dst_ptr) + this->anim_buf;
|
||||
|
||||
for (; height > 0; height--) {
|
||||
/* We need to keep those for palette animation. */
|
||||
uint32 *dst_pal = dst;
|
||||
Colour *dst_pal = dst;
|
||||
uint16 *anim_pal = anim_line;
|
||||
|
||||
memcpy(dst, usrc, width * sizeof(uint32));
|
||||
@@ -422,7 +422,7 @@ void Blitter_32bppAnim::PaletteAnimate(const Palette &palette)
|
||||
assert(this->palette.first_dirty == PALETTE_ANIM_START || this->palette.first_dirty == 0);
|
||||
|
||||
const uint16 *anim = this->anim_buf;
|
||||
uint32 *dst = (uint32 *)_screen.dst_ptr;
|
||||
Colour *dst = (Colour *)_screen.dst_ptr;
|
||||
|
||||
/* Let's walk the anim buffer and try to find the pixels */
|
||||
for (int y = this->anim_buf_height; y != 0 ; y--) {
|
||||
|
||||
@@ -47,9 +47,9 @@ public:
|
||||
/**
|
||||
* Look up the colour in the current palette.
|
||||
*/
|
||||
inline uint32 LookupColourInPalette(uint index)
|
||||
inline Colour LookupColourInPalette(uint index)
|
||||
{
|
||||
return this->palette.palette[index].data;
|
||||
return this->palette.palette[index];
|
||||
}
|
||||
|
||||
template <BlitterMode mode> void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
|
||||
|
||||
@@ -19,15 +19,15 @@ void *Blitter_32bppBase::MoveTo(void *video, int x, int y)
|
||||
|
||||
void Blitter_32bppBase::SetPixel(void *video, int x, int y, uint8 colour)
|
||||
{
|
||||
*((uint32 *)video + x + y * _screen.pitch) = LookupColourInPalette(colour);
|
||||
*((Colour *)video + x + y * _screen.pitch) = LookupColourInPalette(colour);
|
||||
}
|
||||
|
||||
void Blitter_32bppBase::DrawRect(void *video, int width, int height, uint8 colour)
|
||||
{
|
||||
uint32 colour32 = LookupColourInPalette(colour);
|
||||
Colour colour32 = LookupColourInPalette(colour);
|
||||
|
||||
do {
|
||||
uint32 *dst = (uint32 *)video;
|
||||
Colour *dst = (Colour *)video;
|
||||
for (int i = width; i > 0; i--) {
|
||||
*dst = colour32;
|
||||
dst++;
|
||||
|
||||
+38
-42
@@ -33,33 +33,25 @@ public:
|
||||
/* virtual */ Blitter::PaletteAnimation UsePaletteAnimation();
|
||||
/* virtual */ int GetBytesPerPixel() { return 4; }
|
||||
|
||||
/**
|
||||
* Compose a colour based on RGB values.
|
||||
*/
|
||||
static inline uint32 ComposeColour(uint a, uint r, uint g, uint b)
|
||||
{
|
||||
return (((a) << 24) & 0xFF000000) | (((r) << 16) & 0x00FF0000) | (((g) << 8) & 0x0000FF00) | ((b) & 0x000000FF);
|
||||
}
|
||||
|
||||
/**
|
||||
* Look up the colour in the current palette.
|
||||
*/
|
||||
static inline uint32 LookupColourInPalette(uint index)
|
||||
static inline Colour LookupColourInPalette(uint index)
|
||||
{
|
||||
return _cur_palette.palette[index].data;
|
||||
return _cur_palette.palette[index];
|
||||
}
|
||||
|
||||
/**
|
||||
* Compose a colour based on RGBA values and the current pixel value.
|
||||
*/
|
||||
static inline uint32 ComposeColourRGBANoCheck(uint r, uint g, uint b, uint a, uint32 current)
|
||||
static inline Colour ComposeColourRGBANoCheck(uint r, uint g, uint b, uint a, Colour current)
|
||||
{
|
||||
uint cr = GB(current, 16, 8);
|
||||
uint cg = GB(current, 8, 8);
|
||||
uint cb = GB(current, 0, 8);
|
||||
uint cr = current.r;
|
||||
uint cg = current.g;
|
||||
uint cb = current.b;
|
||||
|
||||
/* The 256 is wrong, it should be 255, but 256 is much faster... */
|
||||
return ComposeColour(0xFF,
|
||||
return Colour(
|
||||
((int)(r - cr) * a) / 256 + cr,
|
||||
((int)(g - cg) * a) / 256 + cg,
|
||||
((int)(b - cb) * a) / 256 + cb);
|
||||
@@ -69,10 +61,10 @@ public:
|
||||
* Compose a colour based on RGBA values and the current pixel value.
|
||||
* Handles fully transparent and solid pixels in a special (faster) way.
|
||||
*/
|
||||
static inline uint32 ComposeColourRGBA(uint r, uint g, uint b, uint a, uint32 current)
|
||||
static inline Colour ComposeColourRGBA(uint r, uint g, uint b, uint a, Colour current)
|
||||
{
|
||||
if (a == 0) return current;
|
||||
if (a >= 255) return ComposeColour(0xFF, r, g, b);
|
||||
if (a >= 255) return Colour(r, g, b);
|
||||
|
||||
return ComposeColourRGBANoCheck(r, g, b, a, current);
|
||||
}
|
||||
@@ -80,11 +72,11 @@ public:
|
||||
/**
|
||||
* Compose a colour based on Pixel value, alpha value, and the current pixel value.
|
||||
*/
|
||||
static inline uint32 ComposeColourPANoCheck(uint32 colour, uint a, uint32 current)
|
||||
static inline Colour ComposeColourPANoCheck(Colour colour, uint a, Colour current)
|
||||
{
|
||||
uint r = GB(colour, 16, 8);
|
||||
uint g = GB(colour, 8, 8);
|
||||
uint b = GB(colour, 0, 8);
|
||||
uint r = colour.r;
|
||||
uint g = colour.g;
|
||||
uint b = colour.b;
|
||||
|
||||
return ComposeColourRGBANoCheck(r, g, b, a, current);
|
||||
}
|
||||
@@ -93,10 +85,13 @@ public:
|
||||
* Compose a colour based on Pixel value, alpha value, and the current pixel value.
|
||||
* Handles fully transparent and solid pixels in a special (faster) way.
|
||||
*/
|
||||
static inline uint32 ComposeColourPA(uint32 colour, uint a, uint32 current)
|
||||
static inline Colour ComposeColourPA(Colour colour, uint a, Colour current)
|
||||
{
|
||||
if (a == 0) return current;
|
||||
if (a >= 255) return (colour | 0xFF000000);
|
||||
if (a >= 255) {
|
||||
colour.a = 255;
|
||||
return colour;
|
||||
}
|
||||
|
||||
return ComposeColourPANoCheck(colour, a, current);
|
||||
}
|
||||
@@ -108,13 +103,13 @@ public:
|
||||
* @param denom denominator, makes colour darker.
|
||||
* @return the new colour for the screen.
|
||||
*/
|
||||
static inline uint32 MakeTransparent(uint32 colour, uint nom, uint denom = 256)
|
||||
static inline Colour MakeTransparent(Colour colour, uint nom, uint denom = 256)
|
||||
{
|
||||
uint r = GB(colour, 16, 8);
|
||||
uint g = GB(colour, 8, 8);
|
||||
uint b = GB(colour, 0, 8);
|
||||
uint r = colour.r;
|
||||
uint g = colour.g;
|
||||
uint b = colour.b;
|
||||
|
||||
return ComposeColour(0xFF, r * nom / denom, g * nom / denom, b * nom / denom);
|
||||
return Colour(r * nom / denom, g * nom / denom, b * nom / denom);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -122,45 +117,46 @@ public:
|
||||
* @param colour the colour to make grey.
|
||||
* @return the new colour, now grey.
|
||||
*/
|
||||
static inline uint32 MakeGrey(uint32 colour)
|
||||
static inline Colour MakeGrey(Colour colour)
|
||||
{
|
||||
uint r = GB(colour, 16, 8);
|
||||
uint g = GB(colour, 8, 8);
|
||||
uint b = GB(colour, 0, 8);
|
||||
uint r = colour.r;
|
||||
uint g = colour.g;
|
||||
uint b = colour.b;
|
||||
|
||||
/* To avoid doubles and stuff, multiple it with a total of 65536 (16bits), then
|
||||
* divide by it to normalize the value to a byte again. See heightmap.cpp for
|
||||
* information about the formula. */
|
||||
colour = ((r * 19595) + (g * 38470) + (b * 7471)) / 65536;
|
||||
uint grey = ((r * 19595) + (g * 38470) + (b * 7471)) / 65536;
|
||||
|
||||
return ComposeColour(0xFF, colour, colour, colour);
|
||||
return Colour(grey, grey, grey);
|
||||
}
|
||||
|
||||
static const int DEFAULT_BRIGHTNESS = 64;
|
||||
static const int DEFAULT_BRIGHTNESS = 128;
|
||||
|
||||
static inline uint32 AdjustBrightness(uint32 colour, uint8 brightness)
|
||||
static inline Colour AdjustBrightness(Colour colour, uint8 brightness)
|
||||
{
|
||||
/* Shortcut for normal brightness */
|
||||
if (brightness == DEFAULT_BRIGHTNESS) return colour;
|
||||
|
||||
uint16 ob = 0;
|
||||
uint16 r = GB(colour, 16, 8) * brightness / DEFAULT_BRIGHTNESS;
|
||||
uint16 g = GB(colour, 8, 8) * brightness / DEFAULT_BRIGHTNESS;
|
||||
uint16 b = GB(colour, 0, 8) * brightness / DEFAULT_BRIGHTNESS;
|
||||
uint16 r = colour.r * brightness / DEFAULT_BRIGHTNESS;
|
||||
uint16 g = colour.g * brightness / DEFAULT_BRIGHTNESS;
|
||||
uint16 b = colour.b * brightness / DEFAULT_BRIGHTNESS;
|
||||
|
||||
/* Sum overbright */
|
||||
if (r > 255) ob += r - 255;
|
||||
if (g > 255) ob += g - 255;
|
||||
if (b > 255) ob += b - 255;
|
||||
|
||||
if (ob == 0) return ComposeColour(GB(colour, 24, 8), r, g, b);
|
||||
if (ob == 0) return Colour(r, g, b, colour.a);
|
||||
|
||||
/* Reduce overbright strength */
|
||||
ob /= 2;
|
||||
return ComposeColour(GB(colour, 24, 8),
|
||||
return Colour(
|
||||
r >= 255 ? 255 : min(r + ob * (255 - r) / 256, 255),
|
||||
g >= 255 ? 255 : min(g + ob * (255 - g) / 256, 255),
|
||||
b >= 255 ? 255 : min(b + ob * (255 - b) / 256, 255));
|
||||
b >= 255 ? 255 : min(b + ob * (255 - b) / 256, 255),
|
||||
colour.a);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -44,14 +44,14 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
|
||||
}
|
||||
|
||||
/* skip lines in dst */
|
||||
uint32 *dst = (uint32 *)bp->dst + bp->top * bp->pitch + bp->left;
|
||||
Colour *dst = (Colour *)bp->dst + bp->top * bp->pitch + bp->left;
|
||||
|
||||
/* store so we don't have to access it via bp everytime (compiler assumes pointer aliasing) */
|
||||
const byte *remap = bp->remap;
|
||||
|
||||
for (int y = 0; y < bp->height; y++) {
|
||||
/* next dst line begins here */
|
||||
uint32 *dst_ln = dst + bp->pitch;
|
||||
Colour *dst_ln = dst + bp->pitch;
|
||||
|
||||
/* next src line begins here */
|
||||
const Colour *src_px_ln = (const Colour *)((const byte *)src_px + *(const uint32 *)src_px);
|
||||
@@ -62,7 +62,7 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
|
||||
src_n += 2;
|
||||
|
||||
/* we will end this line when we reach this point */
|
||||
uint32 *dst_end = dst + bp->skip_left;
|
||||
Colour *dst_end = dst + bp->skip_left;
|
||||
|
||||
/* number of pixels with the same aplha channel class */
|
||||
uint n;
|
||||
@@ -215,7 +215,7 @@ Sprite *Blitter_32bppOptimized::Encode(SpriteLoader::Sprite *sprite, AllocatorPr
|
||||
Colour *dst_px_orig[ZOOM_LVL_COUNT];
|
||||
|
||||
/* interleaved stream of 'm' channel and 'n' channel
|
||||
* 'n' is number if following pixels with the same alpha channel class
|
||||
* 'n' is number of following pixels with the same alpha channel class
|
||||
* there are 3 classes: 0, 255, others
|
||||
*
|
||||
* it has to be stored in one stream so fewer registers are used -
|
||||
@@ -286,10 +286,10 @@ Sprite *Blitter_32bppOptimized::Encode(SpriteLoader::Sprite *sprite, AllocatorPr
|
||||
*dst_n |= rgb_max << 8;
|
||||
|
||||
/* Pre-convert the mapping channel to a RGB value */
|
||||
uint32 colour = this->AdjustBrightness(this->LookupColourInPalette(src->m), rgb_max);
|
||||
dst_px->r = GB(colour, 16, 8);
|
||||
dst_px->g = GB(colour, 8, 8);
|
||||
dst_px->b = GB(colour, 0, 8);
|
||||
Colour colour = this->AdjustBrightness(this->LookupColourInPalette(src->m), rgb_max);
|
||||
dst_px->r = colour.r;
|
||||
dst_px->g = colour.g;
|
||||
dst_px->b = colour.b;
|
||||
} else {
|
||||
dst_px->r = src->r;
|
||||
dst_px->g = src->g;
|
||||
|
||||
@@ -21,11 +21,11 @@ static FBlitter_32bppSimple iFBlitter_32bppSimple;
|
||||
void Blitter_32bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
|
||||
{
|
||||
const Blitter_32bppSimple::Pixel *src, *src_line;
|
||||
uint32 *dst, *dst_line;
|
||||
Colour *dst, *dst_line;
|
||||
|
||||
/* Find where to start reading in the source sprite */
|
||||
src_line = (const Blitter_32bppSimple::Pixel *)bp->sprite + (bp->skip_top * bp->sprite_width + bp->skip_left) * ScaleByZoom(1, zoom);
|
||||
dst_line = (uint32 *)bp->dst + bp->top * bp->pitch + bp->left;
|
||||
dst_line = (Colour *)bp->dst + bp->top * bp->pitch + bp->left;
|
||||
|
||||
for (int y = 0; y < bp->height; y++) {
|
||||
dst = dst_line;
|
||||
@@ -66,7 +66,7 @@ void Blitter_32bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoo
|
||||
|
||||
void Blitter_32bppSimple::DrawColourMappingRect(void *dst, int width, int height, PaletteID pal)
|
||||
{
|
||||
uint32 *udst = (uint32 *)dst;
|
||||
Colour *udst = (Colour *)dst;
|
||||
|
||||
if (pal == PALETTE_TO_TRANSPARENT) {
|
||||
do {
|
||||
@@ -122,10 +122,10 @@ Sprite *Blitter_32bppSimple::Encode(SpriteLoader::Sprite *sprite, AllocatorProc
|
||||
dst[i].v = rgb_max;
|
||||
|
||||
/* Pre-convert the mapping channel to a RGB value */
|
||||
uint colour = this->AdjustBrightness(this->LookupColourInPalette(src->m), dst[i].v);
|
||||
dst[i].r = GB(colour, 16, 8);
|
||||
dst[i].g = GB(colour, 8, 8);
|
||||
dst[i].b = GB(colour, 0, 8);
|
||||
Colour colour = this->AdjustBrightness(this->LookupColourInPalette(src->m), dst[i].v);
|
||||
dst[i].r = colour.r;
|
||||
dst[i].g = colour.g;
|
||||
dst[i].b = colour.b;
|
||||
dst[i].a = src->a;
|
||||
dst[i].m = src->m;
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ static const NWidgetPart _bootstrap_query_widgets[] = {
|
||||
static const WindowDesc _bootstrap_query_desc(
|
||||
WDP_CENTER, 0, 0,
|
||||
WC_CONFIRM_POPUP_QUERY, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
0,
|
||||
_bootstrap_query_widgets, lengthof(_bootstrap_query_widgets)
|
||||
);
|
||||
|
||||
@@ -218,7 +218,7 @@ bool HandleBootstrap()
|
||||
if (BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth() == 0) goto failure;
|
||||
|
||||
/* If there is no network or no freetype, then there is nothing we can do. Go straight to failure. */
|
||||
#if defined(ENABLE_NETWORK) && defined(WITH_FREETYPE) && !defined(__APPLE__)
|
||||
#if defined(ENABLE_NETWORK) && defined(WITH_FREETYPE) && !defined(__APPLE__) && (defined(WITH_FONTCONFIG) || defined(WIN32))
|
||||
if (!_network_available) goto failure;
|
||||
|
||||
/* First tell the game we're bootstrapping. */
|
||||
|
||||
+1
-1
@@ -59,7 +59,7 @@ typedef GUIList<BuildBridgeData> GUIBridgeList; ///< List of bridges, used in #B
|
||||
void CcBuildBridge(const CommandCost &result, TileIndex end_tile, uint32 p1, uint32 p2)
|
||||
{
|
||||
if (result.Failed()) return;
|
||||
SndPlayTileFx(SND_27_BLACKSMITH_ANVIL, end_tile);
|
||||
if (_settings_client.sound.confirm) SndPlayTileFx(SND_27_BLACKSMITH_ANVIL, end_tile);
|
||||
|
||||
TransportType transport_type = Extract<TransportType, 15, 2>(p2);
|
||||
|
||||
|
||||
+27
-14
@@ -30,6 +30,7 @@
|
||||
#include "engine_gui.h"
|
||||
#include "cargotype.h"
|
||||
#include "core/geometry_func.hpp"
|
||||
#include "autoreplace_func.h"
|
||||
|
||||
#include "widgets/build_vehicle_widget.h"
|
||||
|
||||
@@ -42,7 +43,7 @@
|
||||
*/
|
||||
uint GetEngineListHeight(VehicleType type)
|
||||
{
|
||||
return max<uint>(FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM, GetVehicleHeight(type));
|
||||
return max<uint>(FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM, GetVehicleImageCellSize(type, EIT_PURCHASE).height);
|
||||
}
|
||||
|
||||
static const NWidgetPart _nested_build_vehicle_widgets[] = {
|
||||
@@ -98,7 +99,7 @@ static CargoID _last_filter_criteria[] = {CF_ANY, CF_ANY, CF_ANY, CF_ANY};
|
||||
*/
|
||||
static int CDECL EngineNumberSorter(const EngineID *a, const EngineID *b)
|
||||
{
|
||||
int r = ListPositionOfEngine(*a) - ListPositionOfEngine(*b);
|
||||
int r = Engine::Get(*a)->list_position - Engine::Get(*b)->list_position;
|
||||
|
||||
return _internal_sort_order ? -r : r;
|
||||
}
|
||||
@@ -515,7 +516,7 @@ static const StringID _sort_listing[][12] = {{
|
||||
static bool CDECL CargoFilter(const EngineID *eid, const CargoID cid)
|
||||
{
|
||||
if (cid == CF_ANY) return true;
|
||||
uint32 refit_mask = GetUnionOfArticulatedRefitMasks(*eid, true);
|
||||
uint32 refit_mask = GetUnionOfArticulatedRefitMasks(*eid, true) & _standard_cargo_mask;
|
||||
return (cid == CF_NONE ? refit_mask == 0 : HasBit(refit_mask, cid));
|
||||
}
|
||||
|
||||
@@ -870,26 +871,37 @@ int DrawVehiclePurchaseInfo(int left, int right, int y, EngineID engine_number)
|
||||
*/
|
||||
void DrawEngineList(VehicleType type, int l, int r, int y, const GUIEngineList *eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count, GroupID selected_group)
|
||||
{
|
||||
static const int sprite_widths[] = { 60, 60, 76, 67 };
|
||||
static const int sprite_y_offsets[] = { -1, -1, -2, -2 };
|
||||
|
||||
/* Obligatory sanity checks! */
|
||||
assert((uint)type < lengthof(sprite_widths));
|
||||
assert_compile(lengthof(sprite_y_offsets) == lengthof(sprite_widths));
|
||||
assert(max <= eng_list->Length());
|
||||
|
||||
bool rtl = _current_text_dir == TD_RTL;
|
||||
int step_size = GetEngineListHeight(type);
|
||||
int sprite_width = sprite_widths[type];
|
||||
int sprite_left = GetVehicleImageCellSize(type, EIT_PURCHASE).extend_left;
|
||||
int sprite_right = GetVehicleImageCellSize(type, EIT_PURCHASE).extend_right;
|
||||
int sprite_width = sprite_left + sprite_right;
|
||||
|
||||
int sprite_x = (rtl ? r - sprite_width / 2 : l + sprite_width / 2) - 1;
|
||||
int sprite_x = rtl ? r - sprite_right - 1 : l + sprite_left + 1;
|
||||
int sprite_y_offset = sprite_y_offsets[type] + step_size / 2;
|
||||
|
||||
int text_left = l + (rtl ? WD_FRAMERECT_LEFT : sprite_width);
|
||||
int text_right = r - (rtl ? sprite_width : WD_FRAMERECT_RIGHT);
|
||||
Dimension replace_icon = {0, 0};
|
||||
int count_width = 0;
|
||||
if (show_count) {
|
||||
replace_icon = GetSpriteSize(SPR_GROUP_REPLACE_ACTIVE);
|
||||
SetDParamMaxDigits(0, 3);
|
||||
count_width = GetStringBoundingBox(STR_TINY_BLACK_COMA).width;
|
||||
}
|
||||
|
||||
int text_left = l + (rtl ? WD_FRAMERECT_LEFT + replace_icon.width + 8 + count_width : sprite_width + WD_FRAMETEXT_LEFT);
|
||||
int text_right = r - (rtl ? sprite_width + WD_FRAMETEXT_RIGHT : WD_FRAMERECT_RIGHT + replace_icon.width + 8 + count_width);
|
||||
int replace_icon_left = rtl ? l + WD_FRAMERECT_LEFT : r - WD_FRAMERECT_RIGHT - replace_icon.width;
|
||||
int count_left = l;
|
||||
int count_right = rtl ? text_left : r - WD_FRAMERECT_RIGHT - replace_icon.width - 8;
|
||||
|
||||
int normal_text_y_offset = (step_size - FONT_HEIGHT_NORMAL) / 2;
|
||||
int small_text_y_offset = step_size - FONT_HEIGHT_SMALL - WD_FRAMERECT_BOTTOM - 1;
|
||||
int replace_icon_y_offset = (step_size - replace_icon.height) / 2 - 1;
|
||||
|
||||
for (; min < max; min++, y += step_size) {
|
||||
const EngineID engine = (*eng_list)[min];
|
||||
@@ -897,11 +909,12 @@ void DrawEngineList(VehicleType type, int l, int r, int y, const GUIEngineList *
|
||||
const uint num_engines = GetGroupNumEngines(_local_company, selected_group, engine);
|
||||
|
||||
SetDParam(0, engine);
|
||||
DrawString(text_left, text_right, y + normal_text_y_offset, STR_ENGINE_NAME, engine == selected_id ? TC_WHITE : TC_BLACK);
|
||||
DrawString(text_left, text_right, y + normal_text_y_offset, STR_ENGINE_NAME, engine == selected_id ? TC_WHITE : TC_BLACK, SA_STRIP | (rtl ? SA_RIGHT : SA_LEFT));
|
||||
DrawVehicleEngine(l, r, sprite_x, y + sprite_y_offset, engine, (show_count && num_engines == 0) ? PALETTE_CRASH : GetEnginePalette(engine, _local_company), EIT_PURCHASE);
|
||||
if (show_count) {
|
||||
SetDParam(0, num_engines);
|
||||
DrawString(text_left, text_right, y + small_text_y_offset, STR_TINY_BLACK_COMA, TC_FROMSTRING, SA_RIGHT);
|
||||
DrawString(count_left, count_right, y + small_text_y_offset, STR_TINY_BLACK_COMA, TC_FROMSTRING, SA_RIGHT | SA_FORCE);
|
||||
if (EngineHasReplacementForCompany(Company::Get(_local_company), engine, selected_group)) DrawSprite(SPR_GROUP_REPLACE_ACTIVE, num_engines == 0 ? PALETTE_CRASH : PAL_NONE, replace_icon_left, y + replace_icon_y_offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1086,7 +1099,7 @@ struct BuildVehicleWindow : Window {
|
||||
|
||||
this->sel_engine = sel_id;
|
||||
|
||||
/* make engines first, and then wagons, sorted by ListPositionOfEngine() */
|
||||
/* make engines first, and then wagons, sorted by selected sort_criteria */
|
||||
_internal_sort_order = false;
|
||||
EngList_Sort(&this->eng_list, TrainEnginesThenWagonsSorter);
|
||||
|
||||
@@ -1394,7 +1407,7 @@ struct BuildVehicleWindow : Window {
|
||||
static const WindowDesc _build_vehicle_desc(
|
||||
WDP_AUTO, 240, 268,
|
||||
WC_BUILD_VEHICLE, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS | WDF_CONSTRUCTION,
|
||||
WDF_CONSTRUCTION,
|
||||
_nested_build_vehicle_widgets, lengthof(_nested_build_vehicle_widgets)
|
||||
);
|
||||
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
/* $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 cargomonitor.cpp Implementation of the cargo transport monitoring. */
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "cargomonitor.h"
|
||||
#include "station_base.h"
|
||||
|
||||
CargoMonitorMap _cargo_pickups; ///< Map of monitored pick-ups to the amount since last query/activation.
|
||||
CargoMonitorMap _cargo_deliveries; ///< Map of monitored deliveries to the amount since last query/activation.
|
||||
|
||||
/** Clear all pick-up cargo monitors. */
|
||||
void ClearCargoPickupMonitoring()
|
||||
{
|
||||
_cargo_pickups.clear();
|
||||
}
|
||||
|
||||
/** Clear all delivery cargo monitors. */
|
||||
void ClearCargoDeliveryMonitoring()
|
||||
{
|
||||
_cargo_deliveries.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get and reset the amount associated with a cargo monitor.
|
||||
* @param[in,out] monitor_map Monitoring map to search (and reset for the queried entry).
|
||||
* @oaram monitor Cargo monitor to query/reset.
|
||||
* @param keep_monitoring After returning from this call, continue monitoring.
|
||||
* @return Amount collected since last query/activation for the monitored combination.
|
||||
*/
|
||||
static uint32 GetAmount(CargoMonitorMap &monitor_map, CargoMonitorID monitor, bool keep_monitoring)
|
||||
{
|
||||
CargoMonitorMap::iterator iter = monitor_map.find(monitor);
|
||||
if (iter == monitor_map.end()) {
|
||||
if (keep_monitoring) {
|
||||
std::pair<CargoMonitorID, uint32> p(monitor, 0);
|
||||
monitor_map.insert(p);
|
||||
}
|
||||
return 0;
|
||||
} else {
|
||||
uint32 result = iter->second;
|
||||
iter->second = 0;
|
||||
if (!keep_monitoring) monitor_map.erase(iter);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the amount of cargo delivered for the given cargo monitor since activation or last query.
|
||||
* @param monitor Cargo monitor to query.
|
||||
* @param keep_monitoring After returning from this call, continue monitoring.
|
||||
* @return Amount of delivered cargo for the monitored combination.
|
||||
*/
|
||||
uint32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring)
|
||||
{
|
||||
return GetAmount(_cargo_deliveries, monitor, keep_monitoring);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the amount of cargo picked up for the given cargo monitor since activation or last query.
|
||||
* @param monitor Monitoring number to query.
|
||||
* @param keep_monitoring After returning from this call, continue monitoring.
|
||||
* @return Amount of picked up cargo for the monitored combination.
|
||||
* @note Cargo pick up is counted on final delivery, to prevent users getting credit for picking up cargo without delivering it.
|
||||
*/
|
||||
uint32 GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring)
|
||||
{
|
||||
return GetAmount(_cargo_pickups, monitor, keep_monitoring);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cargo was delivered to its final destination, update the pickup and delivery maps.
|
||||
* @param cargo_type type of cargo.
|
||||
* @param company company delivering the cargo.
|
||||
* @param amount Amount of cargo delivered.
|
||||
* @param src_type type of \a src.
|
||||
* @param src index of source.
|
||||
* @param st station where the cargo is delivered to.
|
||||
*/
|
||||
void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st)
|
||||
{
|
||||
if (amount == 0) return;
|
||||
|
||||
if (src != INVALID_SOURCE) {
|
||||
/* Handle pickup update. */
|
||||
switch (src_type) {
|
||||
case ST_INDUSTRY: {
|
||||
CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, src);
|
||||
CargoMonitorMap::iterator iter = _cargo_pickups.find(num);
|
||||
if (iter != _cargo_pickups.end()) iter->second += amount;
|
||||
break;
|
||||
}
|
||||
case ST_TOWN: {
|
||||
CargoMonitorID num = EncodeCargoTownMonitor(company, cargo_type, src);
|
||||
CargoMonitorMap::iterator iter = _cargo_pickups.find(num);
|
||||
if (iter != _cargo_pickups.end()) iter->second += amount;
|
||||
break;
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle delivery.
|
||||
* Note that delivery in the right area is sufficient to prevent trouble with neighbouring industries or houses. */
|
||||
|
||||
/* Town delivery. */
|
||||
CargoMonitorID num = EncodeCargoTownMonitor(company, cargo_type, st->town->index);
|
||||
CargoMonitorMap::iterator iter = _cargo_deliveries.find(num);
|
||||
if (iter != _cargo_deliveries.end()) iter->second += amount;
|
||||
|
||||
/* Industry delivery. */
|
||||
for (const Industry * const *ip = st->industries_near.Begin(); ip != st->industries_near.End(); ip++) {
|
||||
CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, (*ip)->index);
|
||||
CargoMonitorMap::iterator iter = _cargo_deliveries.find(num);
|
||||
if (iter != _cargo_deliveries.end()) iter->second += amount;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,148 @@
|
||||
/* $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 cargomonitor.h Cargo transport monitoring declarations. */
|
||||
|
||||
#ifndef CARGOMONITOR_H
|
||||
#define CARGOMONITOR_H
|
||||
|
||||
#include "cargo_type.h"
|
||||
#include "company_func.h"
|
||||
#include "industry.h"
|
||||
#include "town.h"
|
||||
#include <map>
|
||||
|
||||
struct Station;
|
||||
|
||||
/**
|
||||
* Unique number for a company / cargo type / (town or industry).
|
||||
* Encoding is as follows:
|
||||
* - bits 0-15 town or industry number
|
||||
* - bit 16 is set if it is an industry number (else it is a town number).
|
||||
* - bits 19-23 Cargo type.
|
||||
* - bits 24-31 %Company number.
|
||||
*/
|
||||
typedef uint32 CargoMonitorID; ///< Type of the cargo monitor number.
|
||||
|
||||
/** Map type for storing and updating active cargo monitor numbers and their amounts. */
|
||||
typedef std::map<CargoMonitorID, uint32> CargoMonitorMap;
|
||||
|
||||
extern CargoMonitorMap _cargo_pickups;
|
||||
extern CargoMonitorMap _cargo_deliveries;
|
||||
|
||||
|
||||
/** Constants for encoding and extracting cargo monitors. */
|
||||
enum CargoCompanyBits {
|
||||
CCB_TOWN_IND_NUMBER_START = 0, ///< Start bit of the town or industry number.
|
||||
CCB_TOWN_IND_NUMBER_LENGTH = 16, ///< Number of bits of the town or industry number.
|
||||
CCB_IS_INDUSTRY_BIT = 16, ///< Bit indicating the town/industry number is an industry.
|
||||
CCB_IS_INDUSTRY_BIT_VALUE = 1ul << CCB_IS_INDUSTRY_BIT, ///< Value of the #CCB_IS_INDUSTRY_BIT bit.
|
||||
CCB_CARGO_TYPE_START = 19, ///< Start bit of the cargo type field.
|
||||
CCB_CARGO_TYPE_LENGTH = 5, ///< Number of bits of the cargo type field.
|
||||
CCB_COMPANY_START = 24, ///< Start bit of the company field.
|
||||
CCB_COMPANY_LENGTH = 8, ///< Number of bits of the company field.
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Encode a cargo monitor for pickup or delivery at an industry.
|
||||
* @param company Company performing the transport.
|
||||
* @param ctype Cargo type being transported.
|
||||
* @param ind %Industry providing or accepting the cargo.
|
||||
* @return The encoded cargo/company/industry number.
|
||||
*/
|
||||
static inline CargoMonitorID EncodeCargoIndustryMonitor(CompanyID company, CargoID ctype, IndustryID ind)
|
||||
{
|
||||
assert(ctype < (1 << CCB_CARGO_TYPE_LENGTH));
|
||||
|
||||
uint32 ret = 0;
|
||||
SB(ret, CCB_TOWN_IND_NUMBER_START, CCB_TOWN_IND_NUMBER_LENGTH, ind);
|
||||
SetBit(ret, CCB_IS_INDUSTRY_BIT);
|
||||
SB(ret, CCB_CARGO_TYPE_START, CCB_CARGO_TYPE_LENGTH, ctype);
|
||||
SB(ret, CCB_COMPANY_START, CCB_COMPANY_LENGTH, company);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode a cargo monitoring number for pickup or delivery at a town.
|
||||
* @param company %Company performing the transport.
|
||||
* @param ctype Cargo type being transported.
|
||||
* @param town %Town providing or accepting the cargo.
|
||||
* @return The encoded cargo/company/town number.
|
||||
*/
|
||||
static inline CargoMonitorID EncodeCargoTownMonitor(CompanyID company, CargoID ctype, TownID town)
|
||||
{
|
||||
assert(ctype < (1 << CCB_CARGO_TYPE_LENGTH));
|
||||
|
||||
uint32 ret = 0;
|
||||
SB(ret, CCB_TOWN_IND_NUMBER_START, CCB_TOWN_IND_NUMBER_LENGTH, town);
|
||||
SB(ret, CCB_CARGO_TYPE_START, CCB_CARGO_TYPE_LENGTH, ctype);
|
||||
SB(ret, CCB_COMPANY_START, CCB_COMPANY_LENGTH, company);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the company from the cargo monitor.
|
||||
* @param num Cargo monitoring number to decode.
|
||||
* @return The extracted company id.
|
||||
*/
|
||||
static inline CompanyID DecodeMonitorCompany(CargoMonitorID num)
|
||||
{
|
||||
return static_cast<CompanyID>(GB(num, CCB_COMPANY_START, CCB_COMPANY_LENGTH));
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the cargo type from the cargo monitor.
|
||||
* @param num Cargo monitoring number to decode.
|
||||
* @return The extracted cargo type.
|
||||
*/
|
||||
static inline CargoID DecodeMonitorCargoType(CargoMonitorID num)
|
||||
{
|
||||
return GB(num, CCB_CARGO_TYPE_START, CCB_CARGO_TYPE_LENGTH);
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the cargo number monitor an industry or a town?
|
||||
* @param num Cargo monitoring number to decode.
|
||||
* @return true if monitoring an industry, false if monitoring a town.
|
||||
*/
|
||||
static inline bool MonitorMonitorsIndustry(CargoMonitorID num)
|
||||
{
|
||||
return HasBit(num, CCB_IS_INDUSTRY_BIT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the industry number from the cargo monitor.
|
||||
* @param num Cargo monitoring number to decode.
|
||||
* @return The extracted industry id, or #INVALID_INDUSTRY if the number does not monitor an industry.
|
||||
*/
|
||||
static inline IndustryID DecodeMonitorIndustry(CargoMonitorID num)
|
||||
{
|
||||
if (!MonitorMonitorsIndustry(num)) return INVALID_INDUSTRY;
|
||||
return GB(num, CCB_TOWN_IND_NUMBER_START, CCB_TOWN_IND_NUMBER_LENGTH);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the town number from the cargo monitor.
|
||||
* @param num Cargo monitoring number to decode.
|
||||
* @return The extracted town id, or #INVALID_TOWN if the number does not monitor a town.
|
||||
*/
|
||||
static inline TownID DecodeMonitorTown(CargoMonitorID num)
|
||||
{
|
||||
if (MonitorMonitorsIndustry(num)) return INVALID_TOWN;
|
||||
return GB(num, CCB_TOWN_IND_NUMBER_START, CCB_TOWN_IND_NUMBER_LENGTH);
|
||||
}
|
||||
|
||||
void ClearCargoPickupMonitoring();
|
||||
void ClearCargoDeliveryMonitoring();
|
||||
uint32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring);
|
||||
uint32 GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring);
|
||||
void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st);
|
||||
|
||||
#endif /* CARGOMONITOR_H */
|
||||
+9
-1
@@ -23,11 +23,16 @@
|
||||
CargoSpec CargoSpec::array[NUM_CARGO];
|
||||
|
||||
/**
|
||||
* Bitmask of cargo types available.
|
||||
* Bitmask of cargo types available. This includes phony cargoes like regearing cargoes.
|
||||
* Initialized during a call to #SetupCargoForClimate.
|
||||
*/
|
||||
uint32 _cargo_mask;
|
||||
|
||||
/**
|
||||
* Bitmask of real cargo types available. Phony cargoes like regearing cargoes are excluded.
|
||||
*/
|
||||
uint32 _standard_cargo_mask;
|
||||
|
||||
/**
|
||||
* Set up the default cargo types for the given landscape type.
|
||||
* @param l Landscape
|
||||
@@ -176,10 +181,13 @@ void InitializeSortedCargoSpecs()
|
||||
/* Sort cargo specifications by cargo class and name. */
|
||||
QSortT(_sorted_cargo_specs, _sorted_cargo_specs_size, &CargoSpecClassSorter);
|
||||
|
||||
_standard_cargo_mask = 0;
|
||||
|
||||
_sorted_standard_cargo_specs_size = 0;
|
||||
FOR_ALL_SORTED_CARGOSPECS(cargo) {
|
||||
if (cargo->classes & CC_SPECIAL) break;
|
||||
_sorted_standard_cargo_specs_size++;
|
||||
SetBit(_standard_cargo_mask, cargo->Index());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -130,6 +130,7 @@ private:
|
||||
};
|
||||
|
||||
extern uint32 _cargo_mask;
|
||||
extern uint32 _standard_cargo_mask;
|
||||
|
||||
void SetupCargoForClimate(LandscapeID l);
|
||||
CargoID GetCargoIDByLabel(CargoLabel cl);
|
||||
@@ -157,8 +158,18 @@ static inline bool IsCargoInClass(CargoID c, CargoClass cc)
|
||||
|
||||
#define FOR_EACH_SET_CARGO_ID(var, cargo_bits) FOR_EACH_SET_BIT_EX(CargoID, var, uint, cargo_bits)
|
||||
|
||||
/**
|
||||
* Loop header for iterating over cargoes, sorted by name. This includes phony cargoes like regearing cargoes.
|
||||
* @param var Reference getting the cargospec.
|
||||
* @see CargoSpec
|
||||
*/
|
||||
#define FOR_ALL_SORTED_CARGOSPECS(var) for (uint8 index = 0; var = _sorted_cargo_specs[index], index < _sorted_cargo_specs_size; index++)
|
||||
|
||||
/**
|
||||
* Loop header for iterating over 'real' cargoes, sorted by name. Phony cargoes like regearing cargoes are skipped.
|
||||
* @param var Reference getting the cargospec.
|
||||
* @see CargoSpec
|
||||
*/
|
||||
#define FOR_ALL_SORTED_STANDARD_CARGOSPECS(var) for (uint8 index = 0; var = _sorted_cargo_specs[index], index < _sorted_standard_cargo_specs_size; index++)
|
||||
|
||||
#endif /* CARGOTYPE_H */
|
||||
|
||||
+10
-10
@@ -22,7 +22,7 @@
|
||||
#include "strings_func.h"
|
||||
#include "window_func.h"
|
||||
#include "rail_gui.h"
|
||||
#include "gui.h"
|
||||
#include "settings_gui.h"
|
||||
#include "company_gui.h"
|
||||
|
||||
#include "widgets/cheat_widget.h"
|
||||
@@ -184,9 +184,9 @@ struct CheatWindow : Window {
|
||||
|
||||
bool rtl = _current_text_dir == TD_RTL;
|
||||
uint box_left = rtl ? r.right - 12 : r.left + 5;
|
||||
uint button_left = rtl ? r.right - 40 : r.left + 20;
|
||||
uint text_left = r.left + (rtl ? WD_FRAMERECT_LEFT: 50);
|
||||
uint text_right = r.right - (rtl ? 50 : WD_FRAMERECT_RIGHT);
|
||||
uint button_left = rtl ? r.right - 20 - SETTING_BUTTON_WIDTH : r.left + 20;
|
||||
uint text_left = r.left + (rtl ? WD_FRAMERECT_LEFT : 30 + SETTING_BUTTON_WIDTH);
|
||||
uint text_right = r.right - (rtl ? 30 + SETTING_BUTTON_WIDTH : WD_FRAMERECT_RIGHT);
|
||||
|
||||
for (int i = 0; i != lengthof(_cheats_ui); i++) {
|
||||
const CheatEntry *ce = &_cheats_ui[i];
|
||||
@@ -259,7 +259,7 @@ struct CheatWindow : Window {
|
||||
|
||||
/* Draw coloured flag for change company cheat */
|
||||
case STR_CHEAT_CHANGE_COMPANY:
|
||||
SetDParam(0, 15);
|
||||
SetDParamMaxValue(0, MAX_COMPANIES);
|
||||
width = max(width, GetStringBoundingBox(ce->str).width + 10 + 10);
|
||||
break;
|
||||
|
||||
@@ -291,7 +291,7 @@ struct CheatWindow : Window {
|
||||
int value = (int32)ReadValue(ce->variable, ce->type);
|
||||
int oldvalue = value;
|
||||
|
||||
if (btn == CHT_CHANGE_DATE && x >= 40) {
|
||||
if (btn == CHT_CHANGE_DATE && x >= 20 + SETTING_BUTTON_WIDTH) {
|
||||
/* Click at the date text directly. */
|
||||
SetDParam(0, value);
|
||||
ShowQueryString(STR_JUST_INT, STR_CHEAT_CHANGE_DATE_QUERY_CAPT, 8, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED);
|
||||
@@ -299,7 +299,7 @@ struct CheatWindow : Window {
|
||||
}
|
||||
|
||||
/* Not clicking a button? */
|
||||
if (!IsInsideMM(x, 20, 40)) return;
|
||||
if (!IsInsideMM(x, 20, 20 + SETTING_BUTTON_WIDTH)) return;
|
||||
|
||||
*ce->been_used = true;
|
||||
|
||||
@@ -311,10 +311,10 @@ struct CheatWindow : Window {
|
||||
|
||||
default:
|
||||
/* Take whatever the function returns */
|
||||
value = ce->proc(value + ((x >= 30) ? 1 : -1), (x >= 30) ? 1 : -1);
|
||||
value = ce->proc(value + ((x >= 20 + SETTING_BUTTON_WIDTH / 2) ? 1 : -1), (x >= 20 + SETTING_BUTTON_WIDTH / 2) ? 1 : -1);
|
||||
|
||||
/* The first cheat (money), doesn't return a different value. */
|
||||
if (value != oldvalue || btn == CHT_MONEY) this->clicked = btn * 2 + 1 + ((x >= 30) != rtl ? 1 : 0);
|
||||
if (value != oldvalue || btn == CHT_MONEY) this->clicked = btn * 2 + 1 + ((x >= 20 + SETTING_BUTTON_WIDTH / 2) != rtl ? 1 : 0);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -351,7 +351,7 @@ struct CheatWindow : Window {
|
||||
static const WindowDesc _cheats_desc(
|
||||
WDP_AUTO, 0, 0,
|
||||
WC_CHEATS, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
0,
|
||||
_nested_cheat_widgets, lengthof(_nested_cheat_widgets)
|
||||
);
|
||||
|
||||
|
||||
+5
-1
@@ -181,6 +181,8 @@ CommandProc CmdSetVehicleOnTime;
|
||||
CommandProc CmdAutofillTimetable;
|
||||
CommandProc CmdSetTimetableStart;
|
||||
|
||||
CommandProc CmdOpenCloseAirport;
|
||||
|
||||
#define DEF_CMD(proc, flags, type) {proc, #proc, (CommandFlags)flags, type}
|
||||
|
||||
/**
|
||||
@@ -240,7 +242,7 @@ static const Command _command_proc_table[] = {
|
||||
|
||||
DEF_CMD(CmdChangeServiceInt, 0, CMDT_VEHICLE_MANAGEMENT ), // CMD_CHANGE_SERVICE_INT
|
||||
|
||||
DEF_CMD(CmdBuildIndustry, 0, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_INDUSTRY
|
||||
DEF_CMD(CmdBuildIndustry, CMD_DEITY, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_INDUSTRY
|
||||
DEF_CMD(CmdSetCompanyManagerFace, 0, CMDT_OTHER_MANAGEMENT ), // CMD_SET_COMPANY_MANAGER_FACE
|
||||
DEF_CMD(CmdSetCompanyColour, 0, CMDT_OTHER_MANAGEMENT ), // CMD_SET_COMPANY_COLOUR
|
||||
|
||||
@@ -322,6 +324,8 @@ static const Command _command_proc_table[] = {
|
||||
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
|
||||
};
|
||||
|
||||
/*!
|
||||
|
||||
@@ -91,6 +91,7 @@ CommandCallback CcGame;
|
||||
|
||||
/* group_gui.cpp */
|
||||
CommandCallback CcCreateGroup;
|
||||
CommandCallback CcAddVehicleNewGroup;
|
||||
|
||||
/* industry_gui.cpp */
|
||||
CommandCallback CcBuildIndustry;
|
||||
|
||||
@@ -302,6 +302,8 @@ enum Commands {
|
||||
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)
|
||||
};
|
||||
|
||||
|
||||
+2
-1
@@ -78,13 +78,14 @@ struct CompanyProperties {
|
||||
|
||||
Year inaugurated_year; ///< Year of starting the company.
|
||||
|
||||
byte quarters_of_bankruptcy; ///< Number of quarters (a quarter is 3 months) that the company has a negative balance.
|
||||
byte months_of_bankruptcy; ///< Number of months that the company is unable to pay its debts
|
||||
CompanyMask bankrupt_asked; ///< which companies were asked about buying it?
|
||||
int16 bankrupt_timeout; ///< If bigger than \c 0, amount of time to wait for an answer on an offer to buy this company.
|
||||
Money bankrupt_value;
|
||||
|
||||
uint32 terraform_limit; ///< Amount of tileheights we can (still) terraform (times 65536).
|
||||
uint32 clear_limit; ///< Amount of tiles we can (still) clear (times 65536).
|
||||
uint32 tree_limit; ///< Amount of trees we can (still) plant (times 65536).
|
||||
|
||||
/**
|
||||
* If \c true, the company is (also) controlled by the computer (a NoAI program).
|
||||
|
||||
+6
-4
@@ -59,6 +59,7 @@ Company::Company(uint16 name_1, bool is_ai)
|
||||
this->is_ai = is_ai;
|
||||
this->terraform_limit = _settings_game.construction.terraform_frame_burst << 16;
|
||||
this->clear_limit = _settings_game.construction.clear_frame_burst << 16;
|
||||
this->tree_limit = _settings_game.construction.tree_frame_burst << 16;
|
||||
|
||||
for (uint j = 0; j < 4; j++) this->share_owners[j] = COMPANY_SPECTATOR;
|
||||
InvalidateWindowData(WC_PERFORMANCE_DETAIL, 0, INVALID_COMPANY);
|
||||
@@ -260,6 +261,7 @@ void UpdateLandscapingLimits()
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
c->terraform_limit = min(c->terraform_limit + _settings_game.construction.terraform_per_64k_frames, (uint32)_settings_game.construction.terraform_frame_burst << 16);
|
||||
c->clear_limit = min(c->clear_limit + _settings_game.construction.clear_per_64k_frames, (uint32)_settings_game.construction.clear_frame_burst << 16);
|
||||
c->tree_limit = min(c->tree_limit + _settings_game.construction.tree_per_64k_frames, (uint32)_settings_game.construction.tree_frame_burst << 16);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -373,7 +375,7 @@ set_name:;
|
||||
SetDParam(1, STR_NEWS_COMPANY_LAUNCH_DESCRIPTION);
|
||||
SetDParamStr(2, cni->company_name);
|
||||
SetDParam(3, t->index);
|
||||
AddNewsItem(STR_MESSAGE_NEWS_FORMAT, NS_COMPANY_NEW, NR_TILE, c->last_build_coordinate, NR_NONE, UINT32_MAX, cni);
|
||||
AddNewsItem(STR_MESSAGE_NEWS_FORMAT, NT_COMPANY_INFO, NF_COMPANY, NR_TILE, c->last_build_coordinate, NR_NONE, UINT32_MAX, cni);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -723,9 +725,9 @@ void CompaniesYearlyLoop()
|
||||
ShowCompanyFinances(_local_company);
|
||||
c = Company::Get(_local_company);
|
||||
if (c->num_valid_stat_ent > 5 && c->old_economy[0].performance_history < c->old_economy[4].performance_history) {
|
||||
SndPlayFx(SND_01_BAD_YEAR);
|
||||
if (_settings_client.sound.new_year) SndPlayFx(SND_01_BAD_YEAR);
|
||||
} else {
|
||||
SndPlayFx(SND_00_GOOD_YEAR);
|
||||
if (_settings_client.sound.new_year) SndPlayFx(SND_00_GOOD_YEAR);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -919,7 +921,7 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
||||
SetDParam(0, STR_NEWS_COMPANY_BANKRUPT_TITLE);
|
||||
SetDParam(1, STR_NEWS_COMPANY_BANKRUPT_DESCRIPTION);
|
||||
SetDParamStr(2, cni->company_name);
|
||||
AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, NS_COMPANY_BANKRUPT, cni);
|
||||
AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, cni);
|
||||
|
||||
/* Remove the company */
|
||||
ChangeOwnershipOfCompanyItems(c->index, INVALID_OWNER);
|
||||
|
||||
+14
-17
@@ -319,7 +319,7 @@ struct CompanyFinancesWindow : Window {
|
||||
case WID_CF_BALANCE_VALUE:
|
||||
case WID_CF_LOAN_VALUE:
|
||||
case WID_CF_TOTAL_VALUE:
|
||||
SetDParam(0, CompanyFinancesWindow::max_money);
|
||||
SetDParamMaxValue(0, CompanyFinancesWindow::max_money);
|
||||
size->width = max(GetStringBoundingBox(STR_FINANCES_NEGATIVE_INCOME).width, GetStringBoundingBox(STR_FINANCES_POSITIVE_INCOME).width) + padding.width;
|
||||
break;
|
||||
|
||||
@@ -466,7 +466,7 @@ Money CompanyFinancesWindow::max_money = INT32_MAX;
|
||||
static const WindowDesc _company_finances_desc(
|
||||
WDP_AUTO, 0, 0,
|
||||
WC_FINANCES, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
0,
|
||||
_nested_company_finances_widgets, lengthof(_nested_company_finances_widgets)
|
||||
);
|
||||
|
||||
@@ -781,7 +781,8 @@ public:
|
||||
virtual void OnDropdownSelect(int widget, int index)
|
||||
{
|
||||
for (LiveryScheme scheme = LS_DEFAULT; scheme < LS_END; scheme++) {
|
||||
if (HasBit(this->sel, scheme)) {
|
||||
/* Changed colour for the selected scheme, or all visible schemes if CTRL is pressed. */
|
||||
if (HasBit(this->sel, scheme) || (_ctrl_pressed && _livery_class[scheme] == this->livery_class && HasBit(_loaded_newgrf_features.used_liveries, scheme))) {
|
||||
DoCommandP(0, scheme | (widget == WID_SCL_PRI_COL_DROPDOWN ? 0 : 256), index, CMD_SET_COMPANY_COLOUR);
|
||||
}
|
||||
}
|
||||
@@ -1280,11 +1281,7 @@ public:
|
||||
break;
|
||||
|
||||
case WID_SCMF_TIE_EARRING:
|
||||
if (this->is_female) { // Only for female faces
|
||||
this->DrawFaceStringLabel(WID_SCMF_TIE_EARRING, GetCompanyManagerFaceBits(this->face, CMFV_TIE_EARRING, this->ge), false);
|
||||
} else { // Only for male faces
|
||||
this->DrawFaceStringLabel(WID_SCMF_TIE_EARRING, GetCompanyManagerFaceBits(this->face, CMFV_TIE_EARRING, this->ge), false);
|
||||
}
|
||||
this->DrawFaceStringLabel(WID_SCMF_TIE_EARRING, GetCompanyManagerFaceBits(this->face, CMFV_TIE_EARRING, this->ge), false);
|
||||
break;
|
||||
|
||||
case WID_SCMF_LIPS_MOUSTACHE:
|
||||
@@ -1485,7 +1482,7 @@ const StringID SelectCompanyManagerFaceWindow::PART_TEXTS[] = {
|
||||
static const WindowDesc _select_company_manager_face_desc(
|
||||
WDP_AUTO, 0, 0,
|
||||
WC_COMPANY_MANAGER_FACE, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS | WDF_CONSTRUCTION,
|
||||
WDF_CONSTRUCTION,
|
||||
_nested_select_company_manager_face_widgets, lengthof(_nested_select_company_manager_face_widgets)
|
||||
);
|
||||
|
||||
@@ -1694,12 +1691,12 @@ struct CompanyInfrastructureWindow : Window
|
||||
max_val = max(max_val, c->infrastructure.airport);
|
||||
max_cost = max(max_cost, AirportMaintenanceCost(c->index));
|
||||
|
||||
SetDParam(0, max_val);
|
||||
SetDParam(1, max_cost * 12); // Convert to per year
|
||||
SetDParamMaxValue(0, max_val);
|
||||
SetDParamMaxValue(1, max_cost * 12); // Convert to per year
|
||||
size->width = max(size->width, GetStringBoundingBox(_settings_game.economy.infrastructure_maintenance ? STR_COMPANY_INFRASTRUCTURE_VIEW_COST : STR_WHITE_COMMA).width + 20); // Reserve some wiggle room.
|
||||
|
||||
if (_settings_game.economy.infrastructure_maintenance) {
|
||||
SetDParam(0, this->GetTotalMaintenanceCost() * 12); // Convert to per year
|
||||
SetDParamMaxValue(0, this->GetTotalMaintenanceCost() * 12); // Convert to per year
|
||||
this->total_width = GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL).width + 20;
|
||||
size->width = max(size->width, this->total_width);
|
||||
}
|
||||
@@ -1839,7 +1836,7 @@ struct CompanyInfrastructureWindow : Window
|
||||
static const WindowDesc _company_infrastructure_desc(
|
||||
WDP_AUTO, 0, 0,
|
||||
WC_COMPANY_INFRASTRUCTURE, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
0,
|
||||
_nested_company_infrastructure_widgets, lengthof(_nested_company_infrastructure_widgets)
|
||||
);
|
||||
|
||||
@@ -2098,14 +2095,14 @@ struct CompanyWindow : Window
|
||||
break;
|
||||
|
||||
case WID_C_DESC_VEHICLE_COUNTS:
|
||||
SetDParam(0, 5000); // Maximum number of vehicles
|
||||
SetDParamMaxValue(0, 5000); // Maximum number of vehicles
|
||||
for (uint i = 0; i < lengthof(_company_view_vehicle_count_strings); i++) {
|
||||
size->width = max(size->width, GetStringBoundingBox(_company_view_vehicle_count_strings[i]).width);
|
||||
}
|
||||
break;
|
||||
|
||||
case WID_C_DESC_INFRASTRUCTURE_COUNTS:
|
||||
SetDParam(0, UINT_MAX);
|
||||
SetDParamMaxValue(0, UINT_MAX);
|
||||
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_INFRASTRUCTURE_RAIL).width);
|
||||
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_INFRASTRUCTURE_ROAD).width);
|
||||
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_INFRASTRUCTURE_WATER).width);
|
||||
@@ -2118,7 +2115,7 @@ struct CompanyWindow : Window
|
||||
const Company *c2;
|
||||
|
||||
FOR_ALL_COMPANIES(c2) {
|
||||
SetDParam(0, 25);
|
||||
SetDParamMaxValue(0, 75);
|
||||
SetDParam(1, c2->index);
|
||||
|
||||
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_SHARES_OWNED_BY).width);
|
||||
@@ -2404,7 +2401,7 @@ struct CompanyWindow : Window
|
||||
static const WindowDesc _company_desc(
|
||||
WDP_AUTO, 0, 0,
|
||||
WC_COMPANY, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
0,
|
||||
_nested_company_widgets, lengthof(_nested_company_widgets)
|
||||
);
|
||||
|
||||
|
||||
+46
-39
@@ -38,10 +38,7 @@
|
||||
#include "console_func.h"
|
||||
#include "engine_base.h"
|
||||
#include "game/game.hpp"
|
||||
|
||||
#ifdef ENABLE_NETWORK
|
||||
#include "table/strings.h"
|
||||
#endif /* ENABLE_NETWORK */
|
||||
#include "table/strings.h"
|
||||
|
||||
/* scriptfile handling */
|
||||
static bool _script_running; ///< Script is running (used to abort execution when #ConReturn is encountered).
|
||||
@@ -1531,6 +1528,45 @@ DEF_CONSOLE_CMD(ConListAliases)
|
||||
return true;
|
||||
}
|
||||
|
||||
DEF_CONSOLE_CMD(ConCompanies)
|
||||
{
|
||||
if (argc == 0) {
|
||||
IConsoleHelp("List the details of all companies in the game. Usage 'companies'");
|
||||
return true;
|
||||
}
|
||||
|
||||
Company *c;
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
/* Grab the company name */
|
||||
char company_name[512];
|
||||
SetDParam(0, c->index);
|
||||
GetString(company_name, STR_COMPANY_NAME, lastof(company_name));
|
||||
|
||||
const char *password_state = "";
|
||||
if (c->is_ai) {
|
||||
password_state = "AI";
|
||||
}
|
||||
#ifdef ENABLE_NETWORK
|
||||
else if (_network_server) {
|
||||
password_state = StrEmpty(_network_company_states[c->index].password) ? "unprotected" : "protected";
|
||||
}
|
||||
#endif
|
||||
|
||||
char colour[512];
|
||||
GetString(colour, STR_COLOUR_DARK_BLUE + _company_colours[c->index], lastof(colour));
|
||||
IConsolePrintF(CC_INFO, "#:%d(%s) Company Name: '%s' Year Founded: %d Money: " OTTD_PRINTF64 " Loan: " OTTD_PRINTF64 " Value: " OTTD_PRINTF64 " (T:%d, R:%d, P:%d, S:%d) %s",
|
||||
c->index + 1, colour, company_name,
|
||||
c->inaugurated_year, (int64)c->money, (int64)c->current_loan, (int64)CalculateCompanyValue(c),
|
||||
c->group_all[VEH_TRAIN].num_vehicle,
|
||||
c->group_all[VEH_ROAD].num_vehicle,
|
||||
c->group_all[VEH_AIRCRAFT].num_vehicle,
|
||||
c->group_all[VEH_SHIP].num_vehicle,
|
||||
password_state);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_NETWORK
|
||||
|
||||
DEF_CONSOLE_CMD(ConSay)
|
||||
@@ -1552,38 +1588,6 @@ DEF_CONSOLE_CMD(ConSay)
|
||||
return true;
|
||||
}
|
||||
|
||||
DEF_CONSOLE_CMD(ConCompanies)
|
||||
{
|
||||
if (argc == 0) {
|
||||
IConsoleHelp("List the in-game details of all clients connected to the server. Usage 'companies'");
|
||||
return true;
|
||||
}
|
||||
NetworkCompanyStats company_stats[MAX_COMPANIES];
|
||||
NetworkPopulateCompanyStats(company_stats);
|
||||
|
||||
Company *c;
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
/* Grab the company name */
|
||||
char company_name[NETWORK_COMPANY_NAME_LENGTH];
|
||||
SetDParam(0, c->index);
|
||||
GetString(company_name, STR_COMPANY_NAME, lastof(company_name));
|
||||
|
||||
char buffer[512];
|
||||
const NetworkCompanyStats *stats = &company_stats[c->index];
|
||||
|
||||
GetString(buffer, STR_COLOUR_DARK_BLUE + _company_colours[c->index], lastof(buffer));
|
||||
IConsolePrintF(CC_INFO, "#:%d(%s) Company Name: '%s' Year Founded: %d Money: " OTTD_PRINTF64 " Loan: " OTTD_PRINTF64 " Value: " OTTD_PRINTF64 " (T:%d, R:%d, P:%d, S:%d) %sprotected",
|
||||
c->index + 1, buffer, company_name, c->inaugurated_year, (int64)c->money, (int64)c->current_loan, (int64)CalculateCompanyValue(c),
|
||||
/* trains */ stats->num_vehicle[0],
|
||||
/* lorry + bus */ stats->num_vehicle[1] + stats->num_vehicle[2],
|
||||
/* planes */ stats->num_vehicle[3],
|
||||
/* ships */ stats->num_vehicle[4],
|
||||
/* protected */ StrEmpty(_network_company_states[c->index].password) ? "un" : "");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
DEF_CONSOLE_CMD(ConSayCompany)
|
||||
{
|
||||
if (argc == 0) {
|
||||
@@ -1776,7 +1780,9 @@ DEF_CONSOLE_CMD(ConContent)
|
||||
static const TextColour state_to_colour[] = { CC_COMMAND, CC_INFO, CC_INFO, CC_WHITE, CC_ERROR };
|
||||
|
||||
const ContentInfo *ci = *iter;
|
||||
IConsolePrintF(state_to_colour[ci->state], "%d, %s, %s, %s", ci->id, types[ci->type - 1], states[ci->state], ci->name);
|
||||
char buf[sizeof(ci->md5sum) * 2 + 1];
|
||||
md5sumToString(buf, lastof(buf), ci->md5sum);
|
||||
IConsolePrintF(state_to_colour[ci->state], "%d, %s, %s, %s, %08X, %s", ci->id, types[ci->type - 1], states[ci->state], ci->name, ci->unique_id, buf);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -1937,6 +1943,9 @@ void IConsoleStdLibRegister()
|
||||
IConsoleCmdRegister("list_game_libs", ConListGameLibs);
|
||||
IConsoleCmdRegister("rescan_game", ConRescanGame);
|
||||
|
||||
IConsoleCmdRegister("companies", ConCompanies);
|
||||
IConsoleAliasRegister("players", "companies");
|
||||
|
||||
/* networking functions */
|
||||
#ifdef ENABLE_NETWORK
|
||||
/* Content downloading is only available with ZLIB */
|
||||
@@ -1946,8 +1955,6 @@ void IConsoleStdLibRegister()
|
||||
|
||||
/*** Networking commands ***/
|
||||
IConsoleCmdRegister("say", ConSay, ConHookNeedNetwork);
|
||||
IConsoleCmdRegister("companies", ConCompanies, ConHookServerOnly);
|
||||
IConsoleAliasRegister("players", "companies");
|
||||
IConsoleCmdRegister("say_company", ConSayCompany, ConHookNeedNetwork);
|
||||
IConsoleAliasRegister("say_player", "say_company %+");
|
||||
IConsoleCmdRegister("say_client", ConSayClient, ConHookNeedNetwork);
|
||||
|
||||
+10
-16
@@ -10,7 +10,7 @@
|
||||
/** @file console_gui.cpp Handling the GUI of the in-game console. */
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "textbuf_gui.h"
|
||||
#include "textbuf_type.h"
|
||||
#include "window_gui.h"
|
||||
#include "console_gui.h"
|
||||
#include "console_internal.h"
|
||||
@@ -126,7 +126,7 @@ struct IConsoleLine {
|
||||
|
||||
|
||||
/* ** main console cmd buffer ** */
|
||||
static Textbuf _iconsole_cmdline;
|
||||
static Textbuf _iconsole_cmdline(ICON_CMDLN_SIZE);
|
||||
static char *_iconsole_history[ICON_HISTORY_SIZE];
|
||||
static int _iconsole_historypos;
|
||||
IConsoleModes _iconsole_mode;
|
||||
@@ -233,7 +233,7 @@ struct IConsoleWindow : Window
|
||||
|
||||
virtual void OnMouseLoop()
|
||||
{
|
||||
if (HandleCaret(&_iconsole_cmdline)) this->SetDirty();
|
||||
if (_iconsole_cmdline.HandleCaret()) this->SetDirty();
|
||||
}
|
||||
|
||||
virtual EventState OnKeyPress(uint16 key, uint16 keycode)
|
||||
@@ -294,7 +294,7 @@ struct IConsoleWindow : Window
|
||||
case (WKC_META | 'V'):
|
||||
#endif
|
||||
case (WKC_CTRL | 'V'):
|
||||
if (InsertTextBufferClipboard(&_iconsole_cmdline)) {
|
||||
if (_iconsole_cmdline.InsertClipboard()) {
|
||||
IConsoleResetHistoryPos();
|
||||
this->SetDirty();
|
||||
}
|
||||
@@ -308,19 +308,19 @@ struct IConsoleWindow : Window
|
||||
case (WKC_META | 'U'):
|
||||
#endif
|
||||
case (WKC_CTRL | 'U'):
|
||||
DeleteTextBufferAll(&_iconsole_cmdline);
|
||||
_iconsole_cmdline.DeleteAll();
|
||||
this->SetDirty();
|
||||
break;
|
||||
|
||||
case WKC_BACKSPACE: case WKC_DELETE:
|
||||
if (DeleteTextBufferChar(&_iconsole_cmdline, keycode)) {
|
||||
if (_iconsole_cmdline.DeleteChar(keycode)) {
|
||||
IConsoleResetHistoryPos();
|
||||
this->SetDirty();
|
||||
}
|
||||
break;
|
||||
|
||||
case WKC_LEFT: case WKC_RIGHT: case WKC_END: case WKC_HOME:
|
||||
if (MoveTextBufferPos(&_iconsole_cmdline, keycode)) {
|
||||
if (_iconsole_cmdline.MovePos(keycode)) {
|
||||
IConsoleResetHistoryPos();
|
||||
this->SetDirty();
|
||||
}
|
||||
@@ -329,7 +329,7 @@ struct IConsoleWindow : Window
|
||||
default:
|
||||
if (IsValidChar(key, CS_ALPHANUMERAL)) {
|
||||
IConsoleWindow::scroll = 0;
|
||||
InsertTextBufferChar(&_iconsole_cmdline, key);
|
||||
_iconsole_cmdline.InsertChar(key);
|
||||
IConsoleResetHistoryPos();
|
||||
this->SetDirty();
|
||||
} else {
|
||||
@@ -356,10 +356,6 @@ void IConsoleGUIInit()
|
||||
IConsoleLine::Reset();
|
||||
memset(_iconsole_history, 0, sizeof(_iconsole_history));
|
||||
|
||||
_iconsole_cmdline.buf = CallocT<char>(ICON_CMDLN_SIZE); // create buffer and zero it
|
||||
_iconsole_cmdline.max_bytes = ICON_CMDLN_SIZE;
|
||||
_iconsole_cmdline.max_chars = ICON_CMDLN_SIZE;
|
||||
|
||||
IConsolePrintF(CC_WARNING, "OpenTTD Game Console Revision 7 - %s", _openttd_revision);
|
||||
IConsolePrint(CC_WHITE, "------------------------------------");
|
||||
IConsolePrint(CC_WHITE, "use \"help\" for more information");
|
||||
@@ -374,7 +370,6 @@ void IConsoleClearBuffer()
|
||||
|
||||
void IConsoleGUIFree()
|
||||
{
|
||||
free(_iconsole_cmdline.buf);
|
||||
IConsoleClearBuffer();
|
||||
}
|
||||
|
||||
@@ -456,11 +451,10 @@ static void IConsoleHistoryNavigate(int direction)
|
||||
if (direction > 0 && _iconsole_history[_iconsole_historypos] == NULL) _iconsole_historypos--;
|
||||
|
||||
if (_iconsole_historypos == -1) {
|
||||
*_iconsole_cmdline.buf = '\0';
|
||||
_iconsole_cmdline.DeleteAll();
|
||||
} else {
|
||||
ttd_strlcpy(_iconsole_cmdline.buf, _iconsole_history[_iconsole_historypos], _iconsole_cmdline.max_bytes);
|
||||
_iconsole_cmdline.Assign(_iconsole_history[_iconsole_historypos]);
|
||||
}
|
||||
UpdateTextBufferSize(&_iconsole_cmdline);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+20
-20
@@ -13,18 +13,18 @@
|
||||
#define BITMATH_FUNC_HPP
|
||||
|
||||
/**
|
||||
* Fetch n bits from x, started at bit s.
|
||||
* Fetch \a n bits from \a x, started at bit \a s.
|
||||
*
|
||||
* This function can be used to fetch n bits from the value x. The
|
||||
* s value set the startposition to read. The startposition is
|
||||
* count from the LSB and starts at 0. The result starts at a
|
||||
* This function can be used to fetch \a n bits from the value \a x. The
|
||||
* \a s value set the start position to read. The start position is
|
||||
* count from the LSB and starts at \c 0. The result starts at a
|
||||
* LSB, as this isn't just an and-bitmask but also some
|
||||
* bit-shifting operations. GB(0xFF, 2, 1) will so
|
||||
* return 0x01 (0000 0001) instead of
|
||||
* 0x04 (0000 0100).
|
||||
*
|
||||
* @param x The value to read some bits.
|
||||
* @param s The startposition to read some bits.
|
||||
* @param s The start position to read some bits.
|
||||
* @param n The number of bits to read.
|
||||
* @return The selected bits, aligned to a LSB.
|
||||
*/
|
||||
@@ -44,10 +44,10 @@ static inline uint GB(const T x, const uint8 s, const uint8 n)
|
||||
* This is not a bug, its a feature.
|
||||
*
|
||||
* @note Parameter \a x must be a variable as the result is saved there.
|
||||
* @note To avoid unexpecting results the value of \a d should not use more
|
||||
* @note To avoid unexpected results the value of \a d should not use more
|
||||
* space as the provided space of \a n bits (log2)
|
||||
* @param x The variable to change some bits
|
||||
* @param s The startposition for the new bits
|
||||
* @param s The start position for the new bits
|
||||
* @param n The size/window for the new bits
|
||||
* @param d The actually new bits to save in the defined position.
|
||||
* @return The new value of \a x
|
||||
@@ -61,19 +61,19 @@ static inline T SB(T &x, const uint8 s, const uint8 n, const U d)
|
||||
}
|
||||
|
||||
/**
|
||||
* Add i to n bits of x starting at bit s.
|
||||
* Add \a i to \a n bits of \a x starting at bit \a s.
|
||||
*
|
||||
* This add the value of i on n bits of x starting at bit s. The parameters x,
|
||||
* s, i are similar to #GB besides x must be a variable as the result are
|
||||
* This adds the value of \a i on \a n bits of \a x starting at bit \a s. The parameters \a x,
|
||||
* \a s, \a i are similar to #GB. Besides, \ a x must be a variable as the result are
|
||||
* saved there. An overflow does not affect the following bits of the given
|
||||
* bit window and is simply ignored.
|
||||
*
|
||||
* @note Parameter x must be a variable as the result is saved there.
|
||||
* @param x The variable to add some bits at some position
|
||||
* @param s The startposition of the addition
|
||||
* @param s The start position of the addition
|
||||
* @param n The size/window for the addition
|
||||
* @param i The value to add at the given startposition in the given window.
|
||||
* @return The new value of x
|
||||
* @param i The value to add at the given start position in the given window.
|
||||
* @return The new value of \a x
|
||||
*/
|
||||
template <typename T, typename U>
|
||||
static inline T AB(T &x, const uint8 s, const uint8 n, const U i)
|
||||
@@ -87,8 +87,8 @@ static inline T AB(T &x, const uint8 s, const uint8 n, const U i)
|
||||
* Checks if a bit in a value is set.
|
||||
*
|
||||
* This function checks if a bit inside a value is set or not.
|
||||
* The y value specific the position of the bit, started at the
|
||||
* LSB and count from 0.
|
||||
* The \a y value specific the position of the bit, started at the
|
||||
* LSB and count from \c 0.
|
||||
*
|
||||
* @param x The value to check
|
||||
* @param y The position of the bit to check, started from the LSB
|
||||
@@ -165,7 +165,7 @@ static inline T ClrBit(T &x, const uint8 y)
|
||||
* changed and the value is also returned. Parameter y defines the bit
|
||||
* to toggle and starts at the LSB with 0.
|
||||
*
|
||||
* @param x The varliable to toggle the bit
|
||||
* @param x The variable to toggle the bit
|
||||
* @param y The bit position to toggle
|
||||
* @return The new value of the old value with the bit toggled
|
||||
*/
|
||||
@@ -281,11 +281,11 @@ static inline bool HasAtMostOneBit(T value)
|
||||
}
|
||||
|
||||
/**
|
||||
* ROtate x Left by n
|
||||
* ROtate \a x Left by \a n
|
||||
*
|
||||
* @note Assumes a byte has 8 bits
|
||||
* @param x The value which we want to rotate
|
||||
* @param n The number how many we waht to rotate
|
||||
* @param n The number how many we want to rotate
|
||||
* @return A bit rotated number
|
||||
*/
|
||||
template <typename T>
|
||||
@@ -295,11 +295,11 @@ static inline T ROL(const T x, const uint8 n)
|
||||
}
|
||||
|
||||
/**
|
||||
* ROtate x Right by n
|
||||
* ROtate \a x Right by \a n
|
||||
*
|
||||
* @note Assumes a byte has 8 bits
|
||||
* @param x The value which we want to rotate
|
||||
* @param n The number how many we waht to rotate
|
||||
* @param n The number how many we want to rotate
|
||||
* @return A bit rotated number
|
||||
*/
|
||||
template <typename T>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
/**
|
||||
* Overflow safe template for integers, i.e. integers that will never overflow
|
||||
* you multiply the maximum value with 2, or add 2, or substract somethng from
|
||||
* you multiply the maximum value with 2, or add 2, or subtract something from
|
||||
* the minimum value, etc.
|
||||
* @param T the type these integers are stored with.
|
||||
* @param T_MAX the maximum value for the integers.
|
||||
@@ -54,7 +54,7 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
/* Operators for addition and substraction */
|
||||
/* Operators for addition and subtraction */
|
||||
inline OverflowSafeInt operator + (const OverflowSafeInt& other) const { OverflowSafeInt result = *this; result += other; return result; }
|
||||
inline OverflowSafeInt operator + (const int other) const { OverflowSafeInt result = *this; result += (int64)other; return result; }
|
||||
inline OverflowSafeInt operator + (const uint other) const { OverflowSafeInt result = *this; result += (int64)other; return result; }
|
||||
|
||||
@@ -135,7 +135,7 @@ static inline bool Chance16(const uint a, const uint b)
|
||||
* This function uses the same parameters as Chance16. The third parameter
|
||||
* must be a variable the randomize-number from Random() is saved in.
|
||||
*
|
||||
* The low 16 bits of r will already be used and can therefor not be passed to
|
||||
* The low 16 bits of r will already be used and can therefore not be passed to
|
||||
* Chance16I. One can only send the high 16 bits to Chance16I.
|
||||
*
|
||||
* @see Chance16I()
|
||||
|
||||
@@ -49,6 +49,19 @@ struct SmallMap : SmallVector<SmallPair<T, U>, S> {
|
||||
/** Data are freed in SmallVector destructor */
|
||||
inline ~SmallMap() { }
|
||||
|
||||
/**
|
||||
* Finds given key in this map
|
||||
* @param key key to find
|
||||
* @return &Pair(key, data) if found, this->End() if not
|
||||
*/
|
||||
inline const Pair *Find(const T &key) const
|
||||
{
|
||||
for (uint i = 0; i < this->items; i++) {
|
||||
if (key == this->data[i].first) return &this->data[i];
|
||||
}
|
||||
return this->End();
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds given key in this map
|
||||
* @param key key to find
|
||||
@@ -67,7 +80,7 @@ struct SmallMap : SmallVector<SmallPair<T, U>, S> {
|
||||
* @param key key to test
|
||||
* @return true iff the item is present
|
||||
*/
|
||||
inline bool Contains(const T &key)
|
||||
inline bool Contains(const T &key) const
|
||||
{
|
||||
return this->Find(key) != this->End();
|
||||
}
|
||||
|
||||
@@ -39,21 +39,39 @@ public:
|
||||
* Copy constructor.
|
||||
* @param other The other vector to copy.
|
||||
*/
|
||||
SmallVector(const SmallVector &other) : data(NULL), items(0), capacity(0)
|
||||
{
|
||||
this->Assign(other);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generic copy constructor.
|
||||
* @param other The other vector to copy.
|
||||
*/
|
||||
template <uint X>
|
||||
SmallVector(const SmallVector<T, X> &other) : data(NULL), items(0), capacity(0)
|
||||
{
|
||||
MemCpyT<T>(this->Append(other.Length()), other.Begin(), other.Length());
|
||||
this->Assign(other);
|
||||
}
|
||||
|
||||
/**
|
||||
* Assignment.
|
||||
* @param other The new vector that.
|
||||
* @param other The other vector to assign.
|
||||
*/
|
||||
SmallVector &operator=(const SmallVector &other)
|
||||
{
|
||||
this->Assign(other);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generic assignment.
|
||||
* @param other The other vector to assign.
|
||||
*/
|
||||
template <uint X>
|
||||
SmallVector &operator=(const SmallVector<T, X> &other)
|
||||
{
|
||||
this->Reset();
|
||||
MemCpyT<T>(this->Append(other.Length()), other.Begin(), other.Length());
|
||||
this->Assign(other);
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -62,6 +80,18 @@ public:
|
||||
free(this->data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Assign items from other vector.
|
||||
*/
|
||||
template <uint X>
|
||||
inline void Assign(const SmallVector<T, X> &other)
|
||||
{
|
||||
if ((const void *)&other == (void *)this) return;
|
||||
|
||||
this->Clear();
|
||||
if (other.Length() > 0) MemCpyT<T>(this->Append(other.Length()), other.Begin(), other.Length());
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove all items from the list.
|
||||
*/
|
||||
@@ -148,10 +178,10 @@ public:
|
||||
* @param item Item to search for
|
||||
* @return The position of the item, or -1 when not present
|
||||
*/
|
||||
inline int FindIndex(const T &item)
|
||||
inline int FindIndex(const T &item) const
|
||||
{
|
||||
int index = 0;
|
||||
T *pos = this->Begin();
|
||||
const T *pos = this->Begin();
|
||||
const T *end = this->End();
|
||||
while (pos != end && *pos != item) {
|
||||
pos++;
|
||||
|
||||
+1
-1
@@ -388,7 +388,7 @@ bool CrashLog::WriteScreenshot(char *filename, const char *filename_last) const
|
||||
/* Don't draw when we have invalid screen size */
|
||||
if (_screen.width < 1 || _screen.height < 1 || _screen.dst_ptr == NULL) return false;
|
||||
|
||||
bool res = MakeScreenshot(SC_RAW, "crash");
|
||||
bool res = MakeScreenshot(SC_CRASHLOG, "crash");
|
||||
if (res) strecpy(filename, _full_screenshot_name, filename_last);
|
||||
return res;
|
||||
}
|
||||
|
||||
+5
-1
@@ -52,6 +52,9 @@ static const CurrencySpec origin_currency_specs[NUM_CURRENCY] = {
|
||||
{ 60, "", 2009, "", NBSP "Sk", 1, STR_GAME_OPTIONS_CURRENCY_SKK }, ///< slovak koruna
|
||||
{ 4, "", CF_NOEURO, "R$" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_BRL }, ///< brazil real
|
||||
{ 31, "", 2011, "", NBSP "EEK", 1, STR_GAME_OPTIONS_CURRENCY_EEK }, ///< estonian krooni
|
||||
{ 4, "", 2014, "", NBSP "Lt", 1, STR_GAME_OPTIONS_CURRENCY_LTL }, ///< lithuanian litas
|
||||
{ 1850, "", CF_NOEURO, "\xE2\x82\xA9", "", 0, STR_GAME_OPTIONS_CURRENCY_KRW }, ///< south korean won
|
||||
{ 13, "", CF_NOEURO, "R" NBSP, "", 0, STR_GAME_OPTIONS_CURRENCY_ZAR }, ///< south african rand
|
||||
{ 1, "", CF_NOEURO, "", "", 2, STR_GAME_OPTIONS_CURRENCY_CUSTOM }, ///< custom currency
|
||||
};
|
||||
|
||||
@@ -93,6 +96,7 @@ enum Currencies {
|
||||
CURR_SKK,
|
||||
CURR_BRL,
|
||||
CURR_EEK,
|
||||
CURR_LTL,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -166,7 +170,7 @@ void CheckSwitchToEuro()
|
||||
_currency_specs[_settings_game.locale.currency].to_euro != CF_ISEURO &&
|
||||
_cur_year >= _currency_specs[_settings_game.locale.currency].to_euro) {
|
||||
_settings_game.locale.currency = 2; // this is the index of euro above.
|
||||
AddNewsItem(STR_NEWS_EURO_INTRODUCTION, NS_ECONOMY);
|
||||
AddNewsItem(STR_NEWS_EURO_INTRODUCTION, NT_ECONOMY, NF_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@
|
||||
|
||||
static const int CF_NOEURO = 0; ///< Currency never switches to the Euro (as far as known).
|
||||
static const int CF_ISEURO = 1; ///< Currency _is_ the Euro.
|
||||
static const uint NUM_CURRENCY = 29; ///< Number of currencies.
|
||||
static const uint NUM_CURRENCY = 32; ///< Number of currencies.
|
||||
static const int CUSTOM_CURRENCY_ID = NUM_CURRENCY - 1; ///< Index of the custom currency.
|
||||
|
||||
/** Specification of a currency. */
|
||||
|
||||
+15
-11
@@ -277,24 +277,28 @@ void IncreaseDate()
|
||||
if (_date_fract < DAY_TICKS) return;
|
||||
_date_fract = 0;
|
||||
|
||||
/* increase day counter and call various daily loops */
|
||||
/* increase day counter */
|
||||
_date++;
|
||||
OnNewDay();
|
||||
|
||||
YearMonthDay ymd;
|
||||
ConvertDateToYMD(_date, &ymd);
|
||||
|
||||
/* check if we entered a new month? */
|
||||
ConvertDateToYMD(_date, &ymd);
|
||||
if (ymd.month == _cur_month) return;
|
||||
|
||||
/* yes, call various monthly loops */
|
||||
_cur_month = ymd.month;
|
||||
OnNewMonth();
|
||||
bool new_month = ymd.month != _cur_month;
|
||||
|
||||
/* check if we entered a new year? */
|
||||
if (ymd.year == _cur_year) return;
|
||||
bool new_year = ymd.year != _cur_year;
|
||||
|
||||
/* update internal variables before calling the daily/monthly/yearly loops */
|
||||
_cur_month = ymd.month;
|
||||
_cur_year = ymd.year;
|
||||
|
||||
/* yes, call various daily loops */
|
||||
OnNewDay();
|
||||
|
||||
/* yes, call various monthly loops */
|
||||
if (new_month) OnNewMonth();
|
||||
|
||||
/* yes, call various yearly loops */
|
||||
_cur_year = ymd.year;
|
||||
OnNewYear();
|
||||
if (new_year) OnNewYear();
|
||||
}
|
||||
|
||||
+3
-5
@@ -117,10 +117,8 @@ struct SetDateWindow : Window {
|
||||
break;
|
||||
|
||||
case WID_SD_YEAR:
|
||||
for (Year i = this->min_year; i <= this->max_year; i++) {
|
||||
SetDParam(0, i);
|
||||
d = maxdim(d, GetStringBoundingBox(STR_JUST_INT));
|
||||
}
|
||||
SetDParamMaxValue(0, this->max_year);
|
||||
d = maxdim(d, GetStringBoundingBox(STR_JUST_INT));
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -199,7 +197,7 @@ static const NWidgetPart _nested_set_date_widgets[] = {
|
||||
static const WindowDesc _set_date_desc(
|
||||
WDP_CENTER, 0, 0,
|
||||
WC_SET_DATE, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
0,
|
||||
_nested_set_date_widgets, lengthof(_nested_set_date_widgets)
|
||||
);
|
||||
|
||||
|
||||
@@ -73,6 +73,31 @@ struct DebugLevel {
|
||||
};
|
||||
#undef DEBUG_LEVEL
|
||||
|
||||
/**
|
||||
* Dump the available debug facility names in the help text.
|
||||
* @param buf Start address for storing the output.
|
||||
* @param last Last valid address for storing the output.
|
||||
* @return Next free position in the output.
|
||||
*/
|
||||
char *DumpDebugFacilityNames(char *buf, char *last)
|
||||
{
|
||||
size_t length = 0;
|
||||
for (const DebugLevel *i = debug_level; i != endof(debug_level); ++i) {
|
||||
if (length == 0) {
|
||||
buf = strecpy(buf, "List of debug facility names:\n", last);
|
||||
} else {
|
||||
buf = strecpy(buf, ", ", last);
|
||||
length += 2;
|
||||
}
|
||||
buf = strecpy(buf, i->name, last);
|
||||
length += strlen(i->name);
|
||||
}
|
||||
if (length > 0) {
|
||||
buf = strecpy(buf, "\n\n", last);
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
#if !defined(NO_DEBUG_MESSAGES)
|
||||
|
||||
/**
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
void CDECL debug(const char *dbg, const char *format, ...) WARN_FORMAT(2, 3);
|
||||
#endif /* NO_DEBUG_MESSAGES */
|
||||
|
||||
char *DumpDebugFacilityNames(char *buf, char *last);
|
||||
void SetDebugString(const char *s);
|
||||
const char *GetDebugString();
|
||||
|
||||
|
||||
@@ -910,7 +910,10 @@ int main(int argc, char *argv[])
|
||||
size = ftell(src);
|
||||
rewind(src);
|
||||
content = (char*)malloc(size * sizeof(*content));
|
||||
fread(content, 1, size, src);
|
||||
if (fread(content, 1, size, src) != (size_t)size) {
|
||||
fprintf(stderr, "Could not read %s\n", filename);
|
||||
exit(-2);
|
||||
}
|
||||
fclose(src);
|
||||
}
|
||||
|
||||
@@ -919,7 +922,10 @@ int main(int argc, char *argv[])
|
||||
|
||||
if (size != 0) {
|
||||
src = fopen(backup, "wb");
|
||||
fwrite(content, 1, size, src);
|
||||
if (fwrite(content, 1, size, src) != (size_t)size) {
|
||||
fprintf(stderr, "Could not write %s\n", filename);
|
||||
exit(-2);
|
||||
}
|
||||
fclose(src);
|
||||
|
||||
/* Then append it to the real file. */
|
||||
|
||||
+57
-36
@@ -11,6 +11,7 @@
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "train.h"
|
||||
#include "roadveh.h"
|
||||
#include "ship.h"
|
||||
#include "aircraft.h"
|
||||
#include "gui.h"
|
||||
@@ -80,28 +81,28 @@ static const NWidgetPart _nested_train_depot_widgets[] = {
|
||||
static const WindowDesc _train_depot_desc(
|
||||
WDP_AUTO, 362, 123,
|
||||
WC_VEHICLE_DEPOT, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
0,
|
||||
_nested_train_depot_widgets, lengthof(_nested_train_depot_widgets)
|
||||
);
|
||||
|
||||
static const WindowDesc _road_depot_desc(
|
||||
WDP_AUTO, 316, 97,
|
||||
WC_VEHICLE_DEPOT, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
0,
|
||||
_nested_train_depot_widgets, lengthof(_nested_train_depot_widgets)
|
||||
);
|
||||
|
||||
static const WindowDesc _ship_depot_desc(
|
||||
WDP_AUTO, 306, 99,
|
||||
WC_VEHICLE_DEPOT, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
0,
|
||||
_nested_train_depot_widgets, lengthof(_nested_train_depot_widgets)
|
||||
);
|
||||
|
||||
static const WindowDesc _aircraft_depot_desc(
|
||||
WDP_AUTO, 332, 99,
|
||||
WC_VEHICLE_DEPOT, WC_NONE,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
0,
|
||||
_nested_train_depot_widgets, lengthof(_nested_train_depot_widgets)
|
||||
);
|
||||
|
||||
@@ -141,41 +142,63 @@ static void TrainDepotMoveVehicle(const Vehicle *wagon, VehicleID sel, const Veh
|
||||
DoCommandP(v->tile, v->index | (_ctrl_pressed ? 1 : 0) << 20, wagon == NULL ? INVALID_VEHICLE : wagon->index, CMD_MOVE_RAIL_VEHICLE | CMD_MSG(STR_ERROR_CAN_T_MOVE_VEHICLE));
|
||||
}
|
||||
|
||||
/**
|
||||
* Array containing the cell size in pixels of the #WID_D_MATRIX widget for each vehicle type.
|
||||
* @note The train vehicle type uses the entire row for each train.
|
||||
*/
|
||||
static Dimension _base_block_sizes[4];
|
||||
static VehicleCellSize _base_block_sizes_depot[VEH_COMPANY_END]; ///< Cell size for vehicle images in the depot view.
|
||||
static VehicleCellSize _base_block_sizes_purchase[VEH_COMPANY_END]; ///< Cell size for vehicle images in the purchase list.
|
||||
|
||||
static void InitBlocksizeForShipAircraft(VehicleType type)
|
||||
/**
|
||||
* Get the GUI cell size for a vehicle image.
|
||||
* @param type Vehicle type to get the size for.
|
||||
* @param image_type Image type to get size for.
|
||||
* @pre image_type == EIT_IN_DEPOT || image_type == EIT_PURCHASE
|
||||
* @return Cell dimensions for the vehicle and image type.
|
||||
*/
|
||||
VehicleCellSize GetVehicleImageCellSize(VehicleType type, EngineImageType image_type)
|
||||
{
|
||||
uint max_width = 0;
|
||||
switch (image_type) {
|
||||
case EIT_IN_DEPOT: return _base_block_sizes_depot[type];
|
||||
case EIT_PURCHASE: return _base_block_sizes_purchase[type];
|
||||
default: NOT_REACHED();
|
||||
}
|
||||
}
|
||||
|
||||
static void InitBlocksizeForVehicles(VehicleType type, EngineImageType image_type)
|
||||
{
|
||||
int max_extend_left = 0;
|
||||
int max_extend_right = 0;
|
||||
uint max_height = 0;
|
||||
|
||||
const Engine *e;
|
||||
FOR_ALL_ENGINES_OF_TYPE(e, type) {
|
||||
EngineID eid = e->index;
|
||||
uint x, y;
|
||||
int x_offs, y_offs;
|
||||
|
||||
switch (type) {
|
||||
default: NOT_REACHED();
|
||||
case VEH_SHIP: GetShipSpriteSize( eid, x, y, EIT_IN_DEPOT); break;
|
||||
case VEH_AIRCRAFT: GetAircraftSpriteSize(eid, x, y, EIT_IN_DEPOT); break;
|
||||
case VEH_TRAIN: GetTrainSpriteSize( eid, x, y, x_offs, y_offs, image_type); break;
|
||||
case VEH_ROAD: GetRoadVehSpriteSize( eid, x, y, x_offs, y_offs, image_type); break;
|
||||
case VEH_SHIP: GetShipSpriteSize( eid, x, y, x_offs, y_offs, image_type); break;
|
||||
case VEH_AIRCRAFT: GetAircraftSpriteSize(eid, x, y, x_offs, y_offs, image_type); break;
|
||||
}
|
||||
if (x > max_width) max_width = x;
|
||||
if (y > max_height) max_height = y;
|
||||
if (-x_offs > max_extend_left) max_extend_left = -x_offs;
|
||||
if ((int)x + x_offs > max_extend_right) max_extend_right = x + x_offs;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
switch (image_type) {
|
||||
case EIT_IN_DEPOT:
|
||||
_base_block_sizes_depot[type].height = max(GetVehicleHeight(type), max_height);
|
||||
_base_block_sizes_depot[type].extend_left = Clamp(max_extend_left, 16, 98);
|
||||
_base_block_sizes_depot[type].extend_right = Clamp(max_extend_right, 16, 98);
|
||||
break;
|
||||
case EIT_PURCHASE:
|
||||
_base_block_sizes_purchase[type].height = max(GetVehicleHeight(type), max_height);
|
||||
_base_block_sizes_purchase[type].extend_left = Clamp(max_extend_left, 16, 98);
|
||||
_base_block_sizes_purchase[type].extend_right = Clamp(max_extend_right, 16, 98);
|
||||
break;
|
||||
|
||||
default: NOT_REACHED();
|
||||
case VEH_SHIP:
|
||||
_base_block_sizes[VEH_SHIP].width = max(76U, max_width);
|
||||
break;
|
||||
case VEH_AIRCRAFT:
|
||||
_base_block_sizes[VEH_AIRCRAFT].width = max(67U, max_width);
|
||||
break;
|
||||
}
|
||||
_base_block_sizes[type].height = max(GetVehicleHeight(type), max_height);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -184,14 +207,10 @@ static void InitBlocksizeForShipAircraft(VehicleType type)
|
||||
*/
|
||||
void InitDepotWindowBlockSizes()
|
||||
{
|
||||
_base_block_sizes[VEH_TRAIN].width = 0;
|
||||
_base_block_sizes[VEH_TRAIN].height = GetVehicleHeight(VEH_TRAIN);
|
||||
|
||||
_base_block_sizes[VEH_ROAD].width = 32;
|
||||
_base_block_sizes[VEH_ROAD].height = GetVehicleHeight(VEH_ROAD);
|
||||
|
||||
InitBlocksizeForShipAircraft(VEH_SHIP);
|
||||
InitBlocksizeForShipAircraft(VEH_AIRCRAFT);
|
||||
for (VehicleType vt = VEH_BEGIN; vt < VEH_COMPANY_END; vt++) {
|
||||
InitBlocksizeForVehicles(vt, EIT_IN_DEPOT);
|
||||
InitBlocksizeForVehicles(vt, EIT_PURCHASE);
|
||||
}
|
||||
}
|
||||
|
||||
static void DepotSellAllConfirmationCallback(Window *w, bool confirmed);
|
||||
@@ -480,13 +499,14 @@ struct DepotWindow : Window {
|
||||
this->sel = INVALID_VEHICLE;
|
||||
TrainDepotMoveVehicle(v, sel, gdvp.head);
|
||||
} else if (v != NULL) {
|
||||
int image = v->GetImage(_current_text_dir == TD_RTL ? DIR_E : DIR_W, EIT_IN_DEPOT);
|
||||
bool rtl = _current_text_dir == TD_RTL;
|
||||
int image = v->GetImage(rtl ? DIR_E : DIR_W, EIT_IN_DEPOT);
|
||||
SetObjectToPlaceWnd(image, GetVehiclePalette(v), HT_DRAG, this);
|
||||
|
||||
this->sel = v->index;
|
||||
this->SetDirty();
|
||||
|
||||
_cursor.short_vehicle_offset = v->IsGroundVehicle() ? 16 - v->GetGroundVehicleCache()->cached_veh_length * 2 : 0;
|
||||
_cursor.short_vehicle_offset = v->IsGroundVehicle() ? (16 - v->GetGroundVehicleCache()->cached_veh_length * 2) * (rtl ? -1 : 1) : 0;
|
||||
_cursor.vehchain = _ctrl_pressed;
|
||||
}
|
||||
break;
|
||||
@@ -578,7 +598,7 @@ struct DepotWindow : Window {
|
||||
uint min_height = 0;
|
||||
|
||||
if (this->type == VEH_TRAIN) {
|
||||
SetDParam(0, 1000);
|
||||
SetDParamMaxValue(0, 1000);
|
||||
SetDParam(1, 1);
|
||||
this->count_width = GetStringBoundingBox(STR_TINY_BLACK_DECIMAL).width + WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT;
|
||||
} else {
|
||||
@@ -599,13 +619,13 @@ struct DepotWindow : Window {
|
||||
}
|
||||
int base_width = this->count_width + this->header_width;
|
||||
|
||||
resize->height = max(_base_block_sizes[this->type].height, min_height);
|
||||
resize->height = max<uint>(GetVehicleImageCellSize(this->type, EIT_IN_DEPOT).height, min_height);
|
||||
if (this->type == VEH_TRAIN) {
|
||||
resize->width = 1;
|
||||
size->width = base_width + 2 * 29; // about 2 parts
|
||||
size->height = resize->height * 6;
|
||||
} else {
|
||||
resize->width = base_width + _base_block_sizes[this->type].width;
|
||||
resize->width = base_width + GetVehicleImageCellSize(this->type, EIT_IN_DEPOT).extend_left + GetVehicleImageCellSize(this->type, EIT_IN_DEPOT).extend_right;
|
||||
size->width = resize->width * (this->type == VEH_ROAD ? 5 : 3);
|
||||
size->height = resize->height * (this->type == VEH_ROAD ? 5 : 3);
|
||||
}
|
||||
@@ -820,7 +840,8 @@ struct DepotWindow : Window {
|
||||
*/
|
||||
virtual bool OnVehicleSelect(const Vehicle *v)
|
||||
{
|
||||
if (DoCommandP(this->window_number, v->index, _ctrl_pressed ? 1 : 0, CMD_CLONE_VEHICLE | CMD_MSG(STR_ERROR_CAN_T_BUY_TRAIN + v->type), CcCloneVehicle)) {
|
||||
/* Suppress the vehicle GUI when share-cloning. There is no point to it, starting vehicles can also be done via the depot GUI. */
|
||||
if (DoCommandP(this->window_number, v->index, _ctrl_pressed ? 1 : 0, CMD_CLONE_VEHICLE | CMD_MSG(STR_ERROR_CAN_T_BUY_TRAIN + v->type), _ctrl_pressed ? NULL : CcCloneVehicle)) {
|
||||
ResetObjectToPlace();
|
||||
}
|
||||
return true;
|
||||
|
||||
+9
-17
@@ -218,9 +218,7 @@ static bool DisasterTick_Zeppeliner(DisasterVehicle *v)
|
||||
v->age = 0;
|
||||
|
||||
SetDParam(0, GetStationIndex(v->tile));
|
||||
AddVehicleNewsItem(STR_NEWS_DISASTER_ZEPPELIN,
|
||||
NS_ACCIDENT,
|
||||
v->index); // Delete the news, when the zeppelin is gone
|
||||
AddVehicleNewsItem(STR_NEWS_DISASTER_ZEPPELIN, NT_ACCIDENT, v->index); // Delete the news, when the zeppelin is gone
|
||||
AI::NewEvent(GetTileOwner(v->tile), new ScriptEventDisasterZeppelinerCrashed(GetStationIndex(v->tile)));
|
||||
}
|
||||
}
|
||||
@@ -255,7 +253,7 @@ static bool DisasterTick_Zeppeliner(DisasterVehicle *v)
|
||||
|
||||
if (++v->age == 1) {
|
||||
CreateEffectVehicleRel(v, 0, 7, 8, EV_EXPLOSION_LARGE);
|
||||
SndPlayVehicleFx(SND_12_EXPLOSION, v);
|
||||
if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v);
|
||||
v->image_override = SPR_BLIMP_CRASHING;
|
||||
} else if (v->age == 70) {
|
||||
v->image_override = SPR_BLIMP_CRASHED;
|
||||
@@ -353,9 +351,7 @@ static bool DisasterTick_Ufo(DisasterVehicle *v)
|
||||
if (u->crashed_ctr == 0) {
|
||||
u->Crash();
|
||||
|
||||
AddVehicleNewsItem(STR_NEWS_DISASTER_SMALL_UFO,
|
||||
NS_ACCIDENT,
|
||||
u->index); // delete the news, when the roadvehicle is gone
|
||||
AddVehicleNewsItem(STR_NEWS_DISASTER_SMALL_UFO, NT_ACCIDENT, u->index); // delete the news, when the roadvehicle is gone
|
||||
|
||||
AI::NewEvent(u->owner, new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO));
|
||||
Game::NewEvent(new ScriptEventVehicleCrashed(u->index, u->tile, ScriptEventVehicleCrashed::CRASH_RV_UFO));
|
||||
@@ -365,7 +361,7 @@ static bool DisasterTick_Ufo(DisasterVehicle *v)
|
||||
/* Destroy? */
|
||||
if (v->age > 50) {
|
||||
CreateEffectVehicleRel(v, 0, 7, 8, EV_EXPLOSION_LARGE);
|
||||
SndPlayVehicleFx(SND_12_EXPLOSION, v);
|
||||
if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v);
|
||||
delete v;
|
||||
return false;
|
||||
}
|
||||
@@ -434,8 +430,8 @@ static bool DisasterTick_Aircraft(DisasterVehicle *v, uint16 image_override, boo
|
||||
DestructIndustry(i);
|
||||
|
||||
SetDParam(0, i->town->index);
|
||||
AddIndustryNewsItem(news_message, NS_ACCIDENT, i->index); // delete the news, when the industry closes
|
||||
SndPlayTileFx(SND_12_EXPLOSION, i->location.tile);
|
||||
AddIndustryNewsItem(news_message, NT_ACCIDENT, i->index); // delete the news, when the industry closes
|
||||
if (_settings_client.sound.disaster) SndPlayTileFx(SND_12_EXPLOSION, i->location.tile);
|
||||
}
|
||||
} else if (v->current_order.GetDestination() == 0) {
|
||||
int x = v->x_pos + ((leave_at_top ? -15 : 15) * TILE_SIZE);
|
||||
@@ -530,10 +526,7 @@ static bool DisasterTick_Big_Ufo(DisasterVehicle *v)
|
||||
|
||||
Town *t = ClosestTownFromTile(v->dest_tile, UINT_MAX);
|
||||
SetDParam(0, t->index);
|
||||
AddNewsItem(STR_NEWS_DISASTER_BIG_UFO,
|
||||
NS_ACCIDENT,
|
||||
NR_TILE,
|
||||
v->tile);
|
||||
AddTileNewsItem(STR_NEWS_DISASTER_BIG_UFO, NT_ACCIDENT, v->tile);
|
||||
|
||||
if (!Vehicle::CanAllocateItem(2)) {
|
||||
delete v;
|
||||
@@ -603,7 +596,7 @@ static bool DisasterTick_Big_Ufo_Destroyer(DisasterVehicle *v)
|
||||
v->current_order.SetDestination(1);
|
||||
|
||||
CreateEffectVehicleRel(u, 0, 7, 8, EV_EXPLOSION_LARGE);
|
||||
SndPlayVehicleFx(SND_12_EXPLOSION, u);
|
||||
if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, u);
|
||||
|
||||
delete u;
|
||||
|
||||
@@ -878,8 +871,7 @@ static void Disaster_CoalMine_Init()
|
||||
FOR_ALL_INDUSTRIES(i) {
|
||||
if ((GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_CAN_SUBSIDENCE) && --index < 0) {
|
||||
SetDParam(0, i->town->index);
|
||||
AddNewsItem(STR_NEWS_DISASTER_COAL_MINE_SUBSIDENCE,
|
||||
NS_ACCIDENT, NR_TILE, i->location.tile + TileDiffXY(1, 1)); // keep the news, even when the mine closes
|
||||
AddTileNewsItem(STR_NEWS_DISASTER_COAL_MINE_SUBSIDENCE, NT_ACCIDENT, i->location.tile + TileDiffXY(1, 1)); // keep the news, even when the mine closes
|
||||
|
||||
{
|
||||
TileIndex tile = i->location.tile;
|
||||
|
||||
+4
-4
@@ -40,13 +40,13 @@ void CcBuildDocks(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p
|
||||
{
|
||||
if (result.Failed()) return;
|
||||
|
||||
SndPlayTileFx(SND_02_SPLAT, tile);
|
||||
if (_settings_client.sound.confirm) SndPlayTileFx(SND_02_SPLAT, tile);
|
||||
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
|
||||
}
|
||||
|
||||
void CcBuildCanal(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
|
||||
{
|
||||
if (result.Succeeded()) SndPlayTileFx(SND_02_SPLAT, tile);
|
||||
if (result.Succeeded() && _settings_client.sound.confirm) SndPlayTileFx(SND_02_SPLAT, tile);
|
||||
}
|
||||
|
||||
|
||||
@@ -436,7 +436,7 @@ public:
|
||||
this->RaiseWidget(_settings_client.gui.station_show_coverage + BDSW_LT_OFF);
|
||||
_settings_client.gui.station_show_coverage = (widget != BDSW_LT_OFF);
|
||||
this->LowerWidget(_settings_client.gui.station_show_coverage + BDSW_LT_OFF);
|
||||
SndPlayFx(SND_15_BEEP);
|
||||
if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
|
||||
this->SetDirty();
|
||||
break;
|
||||
}
|
||||
@@ -514,7 +514,7 @@ public:
|
||||
this->RaiseWidget(_ship_depot_direction + WID_BDD_X);
|
||||
_ship_depot_direction = (widget == WID_BDD_X ? AXIS_X : AXIS_Y);
|
||||
this->LowerWidget(_ship_depot_direction + WID_BDD_X);
|
||||
SndPlayFx(SND_15_BEEP);
|
||||
if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
|
||||
UpdateDocksDirection();
|
||||
this->SetDirty();
|
||||
break;
|
||||
|
||||
+118
-31
@@ -44,6 +44,7 @@
|
||||
#include "core/backup_type.hpp"
|
||||
#include "water.h"
|
||||
#include "game/game.hpp"
|
||||
#include "cargomonitor.h"
|
||||
|
||||
#include "table/strings.h"
|
||||
#include "table/pricebase.h"
|
||||
@@ -360,7 +361,7 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
|
||||
}
|
||||
if (new_owner == INVALID_OWNER) RebuildSubsidisedSourceAndDestinationCache();
|
||||
|
||||
/* Take care of rating in towns */
|
||||
/* Take care of rating and transport rights in towns */
|
||||
FOR_ALL_TOWNS(t) {
|
||||
/* If a company takes over, give the ratings to that company. */
|
||||
if (new_owner != INVALID_OWNER) {
|
||||
@@ -378,6 +379,16 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
|
||||
/* Reset the ratings for the old owner */
|
||||
t->ratings[old_owner] = RATING_INITIAL;
|
||||
ClrBit(t->have_ratings, old_owner);
|
||||
|
||||
/* Transfer exclusive rights */
|
||||
if (t->exclusive_counter > 0 && t->exclusivity == old_owner) {
|
||||
if (new_owner != INVALID_OWNER) {
|
||||
t->exclusivity = new_owner;
|
||||
} else {
|
||||
t->exclusive_counter = 0;
|
||||
t->exclusivity = INVALID_COMPANY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
@@ -512,33 +523,44 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
|
||||
static void CompanyCheckBankrupt(Company *c)
|
||||
{
|
||||
/* If the company has money again, it does not go bankrupt */
|
||||
if (c->money >= 0) {
|
||||
c->quarters_of_bankruptcy = 0;
|
||||
if (c->money - c->current_loan >= -_economy.max_loan) {
|
||||
c->months_of_bankruptcy = 0;
|
||||
c->bankrupt_asked = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
c->quarters_of_bankruptcy++;
|
||||
c->months_of_bankruptcy++;
|
||||
|
||||
switch (c->quarters_of_bankruptcy) {
|
||||
switch (c->months_of_bankruptcy) {
|
||||
/* All the boring cases (months) with a bad balance where no action is taken */
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
|
||||
case 5:
|
||||
case 6:
|
||||
|
||||
case 8:
|
||||
case 9:
|
||||
break;
|
||||
|
||||
case 2: {
|
||||
/* Warn about bancruptcy after 3 months */
|
||||
case 4: {
|
||||
CompanyNewsInformation *cni = MallocT<CompanyNewsInformation>(1);
|
||||
cni->FillData(c);
|
||||
SetDParam(0, STR_NEWS_COMPANY_IN_TROUBLE_TITLE);
|
||||
SetDParam(1, STR_NEWS_COMPANY_IN_TROUBLE_DESCRIPTION);
|
||||
SetDParamStr(2, cni->company_name);
|
||||
AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, NS_COMPANY_TROUBLE, cni);
|
||||
AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, cni);
|
||||
AI::BroadcastNewEvent(new ScriptEventCompanyInTrouble(c->index));
|
||||
Game::NewEvent(new ScriptEventCompanyInTrouble(c->index));
|
||||
break;
|
||||
}
|
||||
|
||||
case 3: {
|
||||
/* Check if the company has any value.. if not, declare it bankrupt
|
||||
/* Offer company for sale after 6 months */
|
||||
case 7: {
|
||||
/* Check if the company has any value. If not, declare it bankrupt
|
||||
* right now */
|
||||
Money val = CalculateCompanyValue(c, false);
|
||||
if (val > 0) {
|
||||
@@ -547,10 +569,13 @@ static void CompanyCheckBankrupt(Company *c)
|
||||
c->bankrupt_timeout = 0;
|
||||
break;
|
||||
}
|
||||
/* FALL THROUGH to case 4... */
|
||||
/* FALL THROUGH to case 10 */
|
||||
}
|
||||
|
||||
/* Bancrupt company after 6 months (if the company has no value) or latest
|
||||
* after 9 months (if it still had value after 6 months) */
|
||||
default:
|
||||
case 4:
|
||||
case 10: {
|
||||
if (!_networking && _local_company == c->index) {
|
||||
/* If we are in offline mode, leave the company playing. Eg. there
|
||||
* is no THE-END, otherwise mark the client as spectator to make sure
|
||||
@@ -571,6 +596,7 @@ static void CompanyCheckBankrupt(Company *c)
|
||||
* company and thus we won't be moved. */
|
||||
if (!_networking || _network_server) DoCommandP(0, 2 | (c->index << 16), CRR_BANKRUPT, CMD_COMPANY_CTRL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -614,6 +640,11 @@ static void CompaniesGenStatistics()
|
||||
}
|
||||
cur_company.Restore();
|
||||
|
||||
/* Check for bankruptcy each month */
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
CompanyCheckBankrupt(c);
|
||||
}
|
||||
|
||||
/* Only run the economic statics and update company stats every 3rd month (1st of quarter). */
|
||||
if (!HasBit(1 << 0 | 1 << 3 | 1 << 6 | 1 << 9, _cur_month)) return;
|
||||
|
||||
@@ -626,7 +657,6 @@ static void CompaniesGenStatistics()
|
||||
|
||||
UpdateCompanyRatingAndValue(c, true);
|
||||
if (c->block_preview != 0) c->block_preview--;
|
||||
CompanyCheckBankrupt(c);
|
||||
}
|
||||
|
||||
SetWindowDirty(WC_INCOME_GRAPH, 0);
|
||||
@@ -640,8 +670,9 @@ static void CompaniesGenStatistics()
|
||||
/**
|
||||
* Add monthly inflation
|
||||
* @param check_year Shall the inflation get stopped after 170 years?
|
||||
* @return true if inflation is maxed and nothing was changed
|
||||
*/
|
||||
void AddInflation(bool check_year)
|
||||
bool AddInflation(bool check_year)
|
||||
{
|
||||
/* The cargo payment inflation differs from the normal inflation, so the
|
||||
* relative amount of money you make with a transport decreases slowly over
|
||||
@@ -658,15 +689,22 @@ void AddInflation(bool check_year)
|
||||
* inflation doesn't add anything after that either; it even makes playing
|
||||
* it impossible due to the diverging cost and income rates.
|
||||
*/
|
||||
if (check_year && (_cur_year - _settings_game.game_creation.starting_year) >= (ORIGINAL_MAX_YEAR - ORIGINAL_BASE_YEAR)) return;
|
||||
if (check_year && (_cur_year - _settings_game.game_creation.starting_year) >= (ORIGINAL_MAX_YEAR - ORIGINAL_BASE_YEAR)) return true;
|
||||
|
||||
if (_economy.inflation_prices == MAX_INFLATION || _economy.inflation_payment == MAX_INFLATION) return true;
|
||||
|
||||
/* Approximation for (100 + infl_amount)% ** (1 / 12) - 100%
|
||||
* scaled by 65536
|
||||
* 12 -> months per year
|
||||
* This is only a good approxiamtion for small values
|
||||
*/
|
||||
_economy.inflation_prices += min((_economy.inflation_prices * _economy.infl_amount * 54) >> 16, MAX_INFLATION);
|
||||
_economy.inflation_payment += min((_economy.inflation_payment * _economy.infl_amount_pr * 54) >> 16, MAX_INFLATION);
|
||||
_economy.inflation_prices += (_economy.inflation_prices * _economy.infl_amount * 54) >> 16;
|
||||
_economy.inflation_payment += (_economy.inflation_payment * _economy.infl_amount_pr * 54) >> 16;
|
||||
|
||||
if (_economy.inflation_prices > MAX_INFLATION) _economy.inflation_prices = MAX_INFLATION;
|
||||
if (_economy.inflation_payment > MAX_INFLATION) _economy.inflation_payment = MAX_INFLATION;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -755,8 +793,14 @@ static void CompaniesPayInterest()
|
||||
* what (total) should have been paid up to this month and you subtract
|
||||
* whatever has been paid in the previous months. This will mean one month
|
||||
* it'll be a bit more and the other it'll be a bit less than the average
|
||||
* monthly fee, but on average it will be exact. */
|
||||
* monthly fee, but on average it will be exact.
|
||||
* In order to prevent cheating or abuse (just not paying interest by not
|
||||
* taking a loan we make companies pay interest on negative cash as well
|
||||
*/
|
||||
Money yearly_fee = c->current_loan * _economy.interest_rate / 100;
|
||||
if (c->money < 0) {
|
||||
yearly_fee += -c->money *_economy.interest_rate / 100;
|
||||
}
|
||||
Money up_to_previous_month = yearly_fee * _cur_month / 12;
|
||||
Money up_to_this_month = yearly_fee * (_cur_month + 1) / 12;
|
||||
|
||||
@@ -782,10 +826,10 @@ static void HandleEconomyFluctuations()
|
||||
|
||||
if (_economy.fluct == 0) {
|
||||
_economy.fluct = -(int)GB(Random(), 0, 2);
|
||||
AddNewsItem(STR_NEWS_BEGIN_OF_RECESSION, NS_ECONOMY);
|
||||
AddNewsItem(STR_NEWS_BEGIN_OF_RECESSION, NT_ECONOMY, NF_NORMAL);
|
||||
} else if (_economy.fluct == -12) {
|
||||
_economy.fluct = GB(Random(), 0, 8) + 312;
|
||||
AddNewsItem(STR_NEWS_END_OF_RECESSION, NS_ECONOMY);
|
||||
AddNewsItem(STR_NEWS_END_OF_RECESSION, NT_ECONOMY, NF_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -852,6 +896,8 @@ void StartupEconomy()
|
||||
void InitializeEconomy()
|
||||
{
|
||||
_economy.inflation_prices = _economy.inflation_payment = 1 << 16;
|
||||
ClearCargoPickupMonitoring();
|
||||
ClearCargoDeliveryMonitoring();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1017,6 +1063,9 @@ static Money DeliverGoods(int num_pieces, CargoID cargo_type, StationID dest, Ti
|
||||
/* Determine profit */
|
||||
Money profit = GetTransportedGoodsIncome(accepted, DistanceManhattan(source_tile, st->xy), days_in_transit, cargo_type);
|
||||
|
||||
/* Update the cargo monitor. */
|
||||
AddCargoDelivery(cargo_type, company->index, accepted, src_type, src, st);
|
||||
|
||||
/* Modify profit if a subsidy is in effect */
|
||||
if (CheckSubsidised(cargo_type, company->index, src_type, src, st)) {
|
||||
switch (_settings_game.difficulty.subsidy_multiplier) {
|
||||
@@ -1220,6 +1269,16 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
return;
|
||||
}
|
||||
|
||||
bool use_autorefit = front->current_order.IsRefit() && front->current_order.GetRefitCargo() == CT_AUTO_REFIT;
|
||||
CargoArray consist_capleft;
|
||||
if (use_autorefit) {
|
||||
/* Sum cargo, that can be loaded without refitting */
|
||||
for (Vehicle *v = front; v != NULL; v = v->Next()) {
|
||||
int cap_left = v->cargo_cap - v->cargo.Count();
|
||||
if (cap_left > 0) consist_capleft[v->cargo_type] += cap_left;
|
||||
}
|
||||
}
|
||||
|
||||
int unloading_time = 0;
|
||||
bool dirty_vehicle = false;
|
||||
bool dirty_station = false;
|
||||
@@ -1292,8 +1351,8 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
if ((front->current_order.GetUnloadType() & (OUFB_UNLOAD | OUFB_TRANSFER)) && (!accepted || v->cargo.Count() == cargo_count)) {
|
||||
remaining = v->cargo.MoveTo(&ge->cargo, amount_unloaded, front->current_order.GetUnloadType() & OUFB_TRANSFER ? VehicleCargoList::MTA_TRANSFER : VehicleCargoList::MTA_UNLOAD, payment);
|
||||
if (!HasBit(ge->acceptance_pickup, GoodsEntry::GES_PICKUP)) {
|
||||
InvalidateWindowData(WC_STATION_LIST, last_visited);
|
||||
SetBit(ge->acceptance_pickup, GoodsEntry::GES_PICKUP);
|
||||
InvalidateWindowData(WC_STATION_LIST, last_visited);
|
||||
}
|
||||
|
||||
dirty_vehicle = dirty_station = true;
|
||||
@@ -1336,6 +1395,13 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
CargoID new_cid = front->current_order.GetRefitCargo();
|
||||
byte new_subtype = front->current_order.GetRefitSubtype();
|
||||
|
||||
/* Remove old capacity from consist capacity */
|
||||
consist_capleft[v_start->cargo_type] -= v_start->cargo_cap;
|
||||
for (Vehicle *w = v_start; w->HasArticulatedPart(); ) {
|
||||
w = w->GetNextArticulatedPart();
|
||||
consist_capleft[w->cargo_type] -= w->cargo_cap;
|
||||
}
|
||||
|
||||
Backup<CompanyByte> cur_company(_current_company, front->owner, FILE_LINE);
|
||||
|
||||
/* Check if all articulated parts are empty and collect refit mask. */
|
||||
@@ -1352,13 +1418,15 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
int amount = 0;
|
||||
CargoID cid;
|
||||
FOR_EACH_SET_CARGO_ID(cid, refit_mask) {
|
||||
if (cargo_left[cid] > amount) {
|
||||
/* Consider refitting to this cargo, if other vehicles of the consist cannot
|
||||
* already take the cargo without refitting */
|
||||
if (cargo_left[cid] > (int)consist_capleft[cid] + amount) {
|
||||
/* Try to find out if auto-refitting would succeed. In case the refit is allowed,
|
||||
* the returned refit capacity will be greater than zero. */
|
||||
new_subtype = GetBestFittingSubType(v, v, cid);
|
||||
DoCommand(v_start->tile, v_start->index, cid | 1U << 6 | new_subtype << 8 | 1U << 16, DC_QUERY_COST, GetCmdRefitVeh(v_start)); // Auto-refit and only this vehicle including artic parts.
|
||||
if (_returned_refit_capacity > 0) {
|
||||
amount = cargo_left[cid];
|
||||
amount = cargo_left[cid] - consist_capleft[cid];
|
||||
new_cid = cid;
|
||||
}
|
||||
}
|
||||
@@ -1372,6 +1440,13 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
ge = &st->goods[v->cargo_type];
|
||||
}
|
||||
|
||||
/* Add new capacity to consist capacity */
|
||||
consist_capleft[v_start->cargo_type] += v_start->cargo_cap;
|
||||
for (Vehicle *w = v_start; w->HasArticulatedPart(); ) {
|
||||
w = w->GetNextArticulatedPart();
|
||||
consist_capleft[w->cargo_type] += w->cargo_cap;
|
||||
}
|
||||
|
||||
cur_company.Restore();
|
||||
}
|
||||
|
||||
@@ -1396,8 +1471,8 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
|
||||
/* if last speed is 0, we treat that as if no vehicle has ever visited the station. */
|
||||
ge->last_speed = min(t, 255);
|
||||
ge->last_age = _cur_year - front->build_year;
|
||||
ge->days_since_pickup = 0;
|
||||
ge->last_age = min(_cur_year - front->build_year, 255);
|
||||
ge->time_since_pickup = 0;
|
||||
|
||||
/* If there's goods waiting at the station, and the vehicle
|
||||
* has capacity for it, load it on the vehicle. */
|
||||
@@ -1422,7 +1497,17 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
/* Don't load stuff that is already 'reserved' for other vehicles */
|
||||
cap = min((uint)cargo_left[v->cargo_type], cap);
|
||||
count = cargo_left[v->cargo_type];
|
||||
cargo_left[v->cargo_type] -= cap;
|
||||
if (use_autorefit) {
|
||||
/* When using autorefit, reserve all cargo for this wagon to prevent other wagons
|
||||
* from feeling the need to refit. */
|
||||
int total_cap_left = v->cargo_cap - v->cargo.Count();
|
||||
cargo_left[v->cargo_type] -= total_cap_left;
|
||||
consist_capleft[v->cargo_type] -= total_cap_left;
|
||||
} else {
|
||||
/* Update cargo left; but don't reserve everything yet, so other wagons
|
||||
* of the same consist load in parallel. */
|
||||
cargo_left[v->cargo_type] -= cap;
|
||||
}
|
||||
}
|
||||
|
||||
/* Store whether the maximum possible load amount was loaded or not.*/
|
||||
@@ -1473,11 +1558,13 @@ static void LoadUnloadVehicle(Vehicle *front, int *cargo_left)
|
||||
/* Only set completely_emptied, if we just unloaded all remaining cargo */
|
||||
completely_emptied &= anything_unloaded;
|
||||
|
||||
/* We update these variables here, so gradual loading still fills
|
||||
* all wagons at the same time instead of using the same 'improved'
|
||||
* loading algorithm for the wagons (only fill wagon when there is
|
||||
* enough to fill the previous wagons) */
|
||||
if (_settings_game.order.improved_load && (front->current_order.GetLoadType() & OLFB_FULL_LOAD)) {
|
||||
/* For consists without autorefit-order we adjust the reserved cargo at the station after loading,
|
||||
* so that all wagons start loading if the consist is the first consist.
|
||||
*
|
||||
* If we use autorefit otoh, we only want to load/refit a vehicle if the other wagons cannot already hold the cargo,
|
||||
* to keep the option to still refit the vehicle when new cargo of different type shows up.
|
||||
*/
|
||||
if (_settings_game.order.improved_load && (front->current_order.GetLoadType() & OLFB_FULL_LOAD) && !use_autorefit) {
|
||||
/* Update left cargo */
|
||||
for (Vehicle *v = front; v != NULL; v = v->Next()) {
|
||||
int cap_left = v->cargo_cap - v->cargo.Count();
|
||||
@@ -1640,7 +1727,7 @@ static void DoAcquireCompany(Company *c)
|
||||
SetDParamStr(2, cni->company_name);
|
||||
SetDParamStr(3, cni->other_company_name);
|
||||
SetDParam(4, c->bankrupt_value);
|
||||
AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, NS_COMPANY_MERGER, cni);
|
||||
AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, cni);
|
||||
AI::BroadcastNewEvent(new ScriptEventCompanyMerger(ci, _current_company));
|
||||
Game::NewEvent(new ScriptEventCompanyMerger(ci, _current_company));
|
||||
|
||||
|
||||
+1
-1
@@ -40,7 +40,7 @@ Money GetPrice(Price index, uint cost_factor, const struct GRFFile *grf_file, in
|
||||
|
||||
void InitializeEconomy();
|
||||
void RecomputePrices();
|
||||
void AddInflation(bool check_year = true);
|
||||
bool AddInflation(bool check_year = true);
|
||||
|
||||
/**
|
||||
* Is the economy in recession?
|
||||
|
||||
@@ -498,7 +498,7 @@ static bool BubbleTick(EffectVehicle *v)
|
||||
if (b->y == 4 && b->x == 1) {
|
||||
if (v->z_pos > 180 || Chance16I(1, 96, Random())) {
|
||||
v->spritenum = 5;
|
||||
SndPlayVehicleFx(SND_2F_POP, v);
|
||||
if (_settings_client.sound.ambient) SndPlayVehicleFx(SND_2F_POP, v);
|
||||
}
|
||||
anim_state = 0;
|
||||
}
|
||||
@@ -507,7 +507,7 @@ static bool BubbleTick(EffectVehicle *v)
|
||||
TileIndex tile;
|
||||
|
||||
anim_state++;
|
||||
SndPlayVehicleFx(SND_31_EXTRACT, v);
|
||||
if (_settings_client.sound.ambient) SndPlayVehicleFx(SND_31_EXTRACT, v);
|
||||
|
||||
tile = TileVirtXY(v->x_pos, v->y_pos);
|
||||
if (IsTileType(tile, MP_INDUSTRY) && GetIndustryGfx(tile) == GFX_BUBBLE_CATCHER) AddAnimatedTile(tile);
|
||||
|
||||
+16
-6
@@ -111,7 +111,6 @@ static TrackBits GetRailTrackBitsUniversal(TileIndex t, byte *override)
|
||||
case MP_STATION:
|
||||
if (!HasStationRail(t)) return TRACK_BIT_NONE;
|
||||
if (!HasCatenary(GetRailType(t))) return TRACK_BIT_NONE;
|
||||
if (!IsStationTileElectrifiable(t)) return TRACK_BIT_NONE;
|
||||
return TrackToTrackBits(GetRailStationTrack(t));
|
||||
|
||||
default:
|
||||
@@ -130,9 +129,13 @@ static TrackBits MaskWireBits(TileIndex t, TrackBits tracks)
|
||||
for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; d++) {
|
||||
/* If the neighbor tile is either not electrified or has no tracks that can be reached
|
||||
* from this tile, mark all trackdirs that can be reached from the neighbour tile
|
||||
* as needing no catenary. */
|
||||
RailType rt = GetTileRailType(TileAddByDiagDir(t, d));
|
||||
if (rt == INVALID_RAILTYPE || !HasCatenary(rt) || (TrackStatusToTrackBits(GetTileTrackStatus(TileAddByDiagDir(t, d), TRANSPORT_RAIL, 0)) & DiagdirReachesTracks(d)) == TRACK_BIT_NONE) {
|
||||
* as needing no catenary. We make an exception for blocked station tiles with a matching
|
||||
* axis that still display wires to preserve visual continuity. */
|
||||
TileIndex next_tile = TileAddByDiagDir(t, d);
|
||||
RailType rt = GetTileRailType(next_tile);
|
||||
if (rt == INVALID_RAILTYPE || !HasCatenary(rt) ||
|
||||
((TrackStatusToTrackBits(GetTileTrackStatus(next_tile, TRANSPORT_RAIL, 0)) & DiagdirReachesTracks(d)) == TRACK_BIT_NONE &&
|
||||
(!HasStationTileRail(next_tile) || GetRailStationAxis(next_tile) != DiagDirToAxis(d) || !CanStationTileHaveWires(next_tile)))) {
|
||||
neighbour_tdb |= DiagdirReachesTrackdirs(ReverseDiagDir(d));
|
||||
}
|
||||
}
|
||||
@@ -324,6 +327,9 @@ static void DrawCatenaryRailway(const TileInfo *ti)
|
||||
wireconfig[TS_NEIGHBOUR] = MaskWireBits(neighbour, trackconfig[TS_NEIGHBOUR]);
|
||||
if (IsTunnelTile(neighbour) && i != GetTunnelBridgeDirection(neighbour)) wireconfig[TS_NEIGHBOUR] = trackconfig[TS_NEIGHBOUR] = TRACK_BIT_NONE;
|
||||
|
||||
/* Ignore station tiles that allow neither wires nor pylons. */
|
||||
if (IsRailStationTile(neighbour) && !CanStationTileHavePylons(neighbour) && !CanStationTileHaveWires(neighbour)) wireconfig[TS_NEIGHBOUR] = trackconfig[TS_NEIGHBOUR] = TRACK_BIT_NONE;
|
||||
|
||||
/* If the neighboured tile does not smoothly connect to the current tile (because of a foundation),
|
||||
* we have to draw all pillars on the current tile. */
|
||||
if (elevation != GetPCPElevation(neighbour, ReverseDiagDir(i))) wireconfig[TS_NEIGHBOUR] = trackconfig[TS_NEIGHBOUR] = TRACK_BIT_NONE;
|
||||
@@ -409,7 +415,8 @@ static void DrawCatenaryRailway(const TileInfo *ti)
|
||||
}
|
||||
}
|
||||
|
||||
if (PPPallowed[i] != 0 && HasBit(PCPstatus, i) && !HasBit(OverridePCP, i)) {
|
||||
if (PPPallowed[i] != 0 && HasBit(PCPstatus, i) && !HasBit(OverridePCP, i) &&
|
||||
(!IsRailStationTile(ti->tile) || CanStationTileHavePylons(ti->tile))) {
|
||||
for (Direction k = DIR_BEGIN; k < DIR_END; k++) {
|
||||
byte temp = PPPorder[i][GetTLG(ti->tile)][k];
|
||||
|
||||
@@ -437,12 +444,15 @@ static void DrawCatenaryRailway(const TileInfo *ti)
|
||||
if (IsTunnelTile(ti->tile)) return;
|
||||
|
||||
/* Don't draw a wire under a low bridge */
|
||||
if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && !IsTransparencySet(TO_CATENARY)) {
|
||||
if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && !IsTransparencySet(TO_BRIDGES)) {
|
||||
int height = GetBridgeHeight(GetNorthernBridgeEnd(ti->tile));
|
||||
|
||||
if (height <= GetTileMaxZ(ti->tile) + 1) return;
|
||||
}
|
||||
|
||||
/* Don't draw a wire if the station tile does not want any */
|
||||
if (IsRailStationTile(ti->tile) && !CanStationTileHaveWires(ti->tile)) return;
|
||||
|
||||
SpriteID wire_normal = GetWireBase(ti->tile);
|
||||
SpriteID wire_halftile = (halftile_corner != CORNER_INVALID) ? GetWireBase(ti->tile, TCX_UPPER_HALFTILE) : wire_normal;
|
||||
Track halftile_track;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user