Compare commits
966 Commits
12.0-beta1
...
13.4
Author | SHA1 | Date | |
---|---|---|---|
|
7e457a367e | ||
|
132098d723 | ||
|
ba86e1115c | ||
|
eedd9fb150 | ||
|
60fe3fc0df | ||
|
64db854632 | ||
|
ad29d242ed | ||
|
dbcf165b2f | ||
|
7cc3bc0e53 | ||
|
80ed387c37 | ||
|
9e05fa31e2 | ||
31913d02b8 | |||
|
5150f3bb66 | ||
|
a19826247e | ||
|
6dc5c4fff5 | ||
1e1f1fada5 | |||
5cd9c6d9a0 | |||
|
d854bb82e5 | ||
|
5cc06f5dbe | ||
|
69168078d8 | ||
|
7cdb8c92e0 | ||
|
402baa63f2 | ||
|
e80cb487e6 | ||
|
ee6e30ead9 | ||
|
4b7fcaca0f | ||
|
d4df692a70 | ||
|
9580aef49c | ||
4aded39db6 | |||
|
ed9895dbb5 | ||
ab0924f14e | |||
|
dea0f7e894 | ||
4949bd8cd5 | |||
|
374a51c766 | ||
|
57946c8507 | ||
|
0f81c20ee2 | ||
|
46d30aa970 | ||
|
4a7d93b2a6 | ||
|
2a0e2f1658 | ||
|
83a857afb6 | ||
b5a38cb14d | |||
|
00bcda7e33 | ||
|
6f7d44c3f4 | ||
|
045e81809a | ||
|
b8d66fc783 | ||
|
2ce9f640ef | ||
220b08b868 | |||
3ae1a80576 | |||
|
532007737e | ||
|
57a6233754 | ||
53709f0bdc | |||
81e5cd23e0 | |||
2d8d9c49c4 | |||
c3815359f1 | |||
|
89259af2e4 | ||
680eb6b516 | |||
|
a75a90b3af | ||
|
7969907116 | ||
|
4cc0c21182 | ||
|
df417168c6 | ||
|
b8eca7ddb1 | ||
|
0569331f6b | ||
|
439ecbc759 | ||
|
85d2f80817 | ||
|
e53caf8f01 | ||
|
b70df6eeda | ||
f895d7e43c | |||
28e845dbaf | |||
|
df1ba20403 | ||
|
4883d386da | ||
|
e16fcb286a | ||
|
ff7e8c284a | ||
|
08a5637f98 | ||
|
da20e0f6e6 | ||
|
78512af02e | ||
f4f35a1f5c | |||
|
7f987c8d3a | ||
|
090913c655 | ||
15a32faece | |||
|
353a6d4bfe | ||
808dfc0672 | |||
67bd6ab0ad | |||
4c756159fd | |||
d510e0baa8 | |||
4a1361b044 | |||
|
eaec433028 | ||
|
86beadc00b | ||
|
261d674866 | ||
f16a1107d2 | |||
4b40e93197 | |||
|
330a823c3b | ||
|
f1fdcd71f4 | ||
|
70d5683e53 | ||
|
430630e774 | ||
|
d78ab6a874 | ||
|
fedb77a56d | ||
|
803c523735 | ||
|
81b53b36c8 | ||
|
381f1ac777 | ||
|
4b7099fa68 | ||
addf30ecdf | |||
|
0604f571e1 | ||
|
617d794af6 | ||
|
da9f226f0b | ||
|
0fb6b3ca07 | ||
|
249141858c | ||
|
144d404f05 | ||
|
cf546c1917 | ||
|
63d607a316 | ||
|
80590af1cb | ||
|
2a787aa8b8 | ||
|
ac31c1043e | ||
|
2ebc601d97 | ||
|
9daec1cb30 | ||
|
6bd2b9c34f | ||
|
292ec1ced7 | ||
|
6b36f07eb8 | ||
|
f6170ec782 | ||
|
32d80d1a57 | ||
|
8aa4173bce | ||
|
ada33a6885 | ||
|
64bd824b48 | ||
|
ce9c4fc31f | ||
|
ff07af905a | ||
|
b5f8fcb280 | ||
|
bac7ad72b1 | ||
0cb3d85a87 | |||
|
05c0295d32 | ||
|
556e9e8434 | ||
|
4fe8d97623 | ||
|
c31195509f | ||
|
aa4cd1012f | ||
|
c9948a4517 | ||
|
d1daf34c91 | ||
|
18c701d274 | ||
|
3357aff494 | ||
|
08ca0746b1 | ||
|
1cb459de3f | ||
7e61264e3c | |||
|
75c37bf7c2 | ||
|
f88766c976 | ||
|
52319891ce | ||
|
0a5dc852bb | ||
5b27cd029f | |||
|
2104849fad | ||
|
25940cdbd1 | ||
|
f37b6cb17f | ||
|
87d74389fb | ||
|
557c5a8583 | ||
|
bd6a95c6b9 | ||
|
6d1331ebcd | ||
680fcb8611 | |||
|
548a9c41d5 | ||
4c6b6c9d33 | |||
c935a58272 | |||
|
88030d781b | ||
7ccfc4b143 | |||
|
f5193aeba2 | ||
|
ed65594868 | ||
|
b211a88b71 | ||
|
2414cf0e8f | ||
|
400addf7af | ||
|
4b123394cf | ||
|
8978f11146 | ||
5e22788664 | |||
|
22035b7eab | ||
|
67f02e20de | ||
|
012fd2be0d | ||
|
ffc1f7ce56 | ||
|
25f247047d | ||
|
f90156f74c | ||
|
918b2cb3ee | ||
|
fe30f66570 | ||
f7e2b6ef12 | |||
|
6caed5f15e | ||
|
7a18631291 | ||
9e56e16147 | |||
961e66df30 | |||
|
3d3ed87d99 | ||
4f26f6b8aa | |||
|
c53f29df53 | ||
|
35d55bd534 | ||
|
4ffe7e0477 | ||
|
8063fcb6e0 | ||
efa20dd969 | |||
cbf48c4dd9 | |||
74180efe7f | |||
3485709f53 | |||
898dadadb2 | |||
85814b29d4 | |||
94167dfd34 | |||
c11db7d593 | |||
d7f561a400 | |||
c8cc61d889 | |||
23eec0b7b3 | |||
|
3451c0a82c | ||
|
04ee86d3ac | ||
|
e6c857cdba | ||
|
af3df959c2 | ||
7b5edba76c | |||
a971eee2e0 | |||
138198e971 | |||
002fe67bef | |||
|
14c1266bbc | ||
|
d4c530904c | ||
f6e7e44169 | |||
|
c179c10048 | ||
|
a857ed8240 | ||
c962c77306 | |||
03c1b5169c | |||
dde15a403c | |||
|
2012998563 | ||
|
e5720325ff | ||
daaa058493 | |||
8599041ce4 | |||
|
888c9172e0 | ||
1eecbd39ed | |||
|
7425660b3e | ||
5eb7e1d3ab | |||
8adc47858d | |||
33eb9688cf | |||
|
c50fabb574 | ||
131b7f5127 | |||
|
0116a422ea | ||
|
d67259334a | ||
|
c7d7658004 | ||
|
1a05e95945 | ||
|
e0cb31ff07 | ||
|
4f9893cc98 | ||
c448eb04d8 | |||
|
2848483810 | ||
|
8db4892f49 | ||
|
ac12028278 | ||
|
7e7e1183cf | ||
|
fd5de3b366 | ||
|
49c121ec29 | ||
daacde4496 | |||
|
2756741575 | ||
|
5cef40591b | ||
|
d5fc423793 | ||
|
985f487065 | ||
53b827c460 | |||
|
13d2d11fa8 | ||
|
2c5eb206d4 | ||
|
ab9d77ebbe | ||
|
1c205b2cda | ||
1131608eb4 | |||
|
644012dea2 | ||
|
a7f78af4aa | ||
485368f607 | |||
|
3100c6e7d0 | ||
387c57b023 | |||
|
41c893dd4e | ||
eaf1e33bd7 | |||
|
978f5b9341 | ||
|
1c82200e0f | ||
a7ffd47c64 | |||
|
35c4af5cb7 | ||
|
8a78fa7121 | ||
|
5e14a20b3b | ||
|
b9ce3de23d | ||
|
b846c574d7 | ||
|
e29547a3a2 | ||
|
d780ca74ed | ||
|
0fc7cdb1e4 | ||
53682b4b6b | |||
|
e85d2603d9 | ||
|
afbad255d3 | ||
|
62125c9e76 | ||
a7adadcf9b | |||
|
a942028803 | ||
a044e8e007 | |||
|
3040efdb10 | ||
60404c3aea | |||
9bf24ec56f | |||
c81c242c5a | |||
6ea3e7e487 | |||
|
bc5cd4eeda | ||
|
d30345edfb | ||
|
cbb2d5303d | ||
|
0d631a6fda | ||
|
adf94d7970 | ||
|
bba1a16836 | ||
|
553e5e6bbe | ||
cea62ef73d | |||
|
89a2d0a605 | ||
|
ced4258969 | ||
dff03124e5 | |||
ecb5393c55 | |||
920e588334 | |||
9666e46739 | |||
13d271217f | |||
ed60c88b0a | |||
062ea68422 | |||
dd90d79e7b | |||
e554fd7808 | |||
890b2666d3 | |||
61da064b82 | |||
123983743f | |||
f0ae111c4a | |||
64a1fc174f | |||
1180c95372 | |||
d35f1d3d06 | |||
23a8222200 | |||
90ce704366 | |||
0bb9a45785 | |||
d0add1e07f | |||
b5693becdc | |||
b6ed595176 | |||
0108e9f387 | |||
68423c40c5 | |||
47f4fc6a70 | |||
dd9f6bc803 | |||
04cbe57d2a | |||
75b222b0d9 | |||
5786d49143 | |||
46a1ab0937 | |||
c9a81fd67b | |||
3ff05321dc | |||
1f1378c129 | |||
cb059fc081 | |||
fea7247072 | |||
6f95e04005 | |||
cb10ed1509 | |||
cd0d5a771d | |||
f5f035a22b | |||
632464a623 | |||
d8e01f8aa5 | |||
17d1fe26c2 | |||
eb4ba1991b | |||
18201dfbc3 | |||
ab55d3e1fa | |||
|
7c3c92f8b8 | ||
|
59645c6733 | ||
|
64b437fa89 | ||
|
0fae0599b7 | ||
|
a962d7476b | ||
|
5d6cdf4385 | ||
|
3f579fa7dc | ||
|
cbac243216 | ||
|
fd4f148c62 | ||
|
27e1d057c5 | ||
|
e2f661b281 | ||
|
0d303d6c3f | ||
|
a8a7f95665 | ||
|
59dbcdb5ba | ||
|
b304c06a4a | ||
|
89cf0d5da8 | ||
|
019dcb7b7b | ||
|
ede0560f9b | ||
|
31d08421ab | ||
|
62a15734fe | ||
|
60ccab3c52 | ||
|
d738cd235f | ||
|
b7abaa55a3 | ||
|
8c4a70e05e | ||
|
b6a899eb2b | ||
|
e931f3061f | ||
|
7711907a6b | ||
22803f997b | |||
|
4dc741a8a0 | ||
|
c294e8b19f | ||
|
0172eb39a2 | ||
|
c719ba560e | ||
|
fea6a34684 | ||
|
21cea308f9 | ||
|
3b3c9c1c3a | ||
|
d48a48b2cf | ||
f24286a1ae | |||
|
accbfd502e | ||
|
0d51460f27 | ||
|
71663bbaee | ||
|
648cd1076b | ||
|
d5aafaee15 | ||
4031894aef | |||
|
35d9cea487 | ||
|
aa06b73137 | ||
|
c19abebf8d | ||
|
c65a2799c9 | ||
|
c4e655b1d4 | ||
|
ac7780af96 | ||
|
b9635c4712 | ||
|
36084684ba | ||
|
bf8dc7b157 | ||
|
191ea087eb | ||
|
8bf56f39f2 | ||
|
f8a7b76675 | ||
|
c5369caa45 | ||
|
25b3ff6423 | ||
|
b0fd51a5ef | ||
|
bfa155eb06 | ||
|
dd44f2139e | ||
|
845174914d | ||
|
0afa6f2424 | ||
|
4052feef1f | ||
b04298f131 | |||
|
3a11a2ed0e | ||
|
1e3e30c096 | ||
ef8322ba25 | |||
|
e7a16f4514 | ||
|
c536bde19e | ||
|
721d98a7d0 | ||
|
a4052ca348 | ||
|
7e7d943526 | ||
|
227626b0b7 | ||
|
a9a21e784d | ||
|
4daad7f348 | ||
|
a394be2780 | ||
|
30ff89cac0 | ||
|
664771d085 | ||
|
520520c11c | ||
|
87d1bd895a | ||
|
8ffe59373f | ||
|
f6530f3c2d | ||
|
864771ca09 | ||
|
7c79a2a767 | ||
|
e660860d4b | ||
|
65530a76f6 | ||
|
93d2d4590f | ||
|
47a998fb0c | ||
|
252111512f | ||
|
35c1aeb6d1 | ||
|
f7eb0ffc37 | ||
|
8e6ed8d5e9 | ||
|
10daaca5ea | ||
|
a0342fb170 | ||
|
3b071f47e4 | ||
|
47456ac672 | ||
|
f9cdb5b610 | ||
|
da1a0d042e | ||
|
c7505539af | ||
|
be7db78767 | ||
|
8d0d45c431 | ||
|
3d45bc4abe | ||
|
bd357656ba | ||
|
e604b76d18 | ||
|
3dda8c9bad | ||
|
45d98f689a | ||
|
bda602f4b0 | ||
|
f4e2a462fe | ||
5cc1a48db7 | |||
ba94efba87 | |||
dc1b84aa1e | |||
0e3400894f | |||
296af146fb | |||
|
db98cedb7e | ||
3e86f337a8 | |||
ccb62c3a55 | |||
edbf99ed17 | |||
33704269bd | |||
686204ff1c | |||
e8edecf6b1 | |||
fc944829e1 | |||
|
887b760c88 | ||
|
9059215b3b | ||
|
24f3022ee0 | ||
|
c482f05616 | ||
|
d0dcb6547e | ||
|
633b903f16 | ||
|
c7f55a058b | ||
af6c4d50ce | |||
8626090b24 | |||
|
f011a559d0 | ||
|
73e5c57e6b | ||
|
f3fd9b5895 | ||
|
d843c8bd48 | ||
|
e5203f3409 | ||
|
bdc17b18e1 | ||
|
faa382beda | ||
|
761105aaa4 | ||
b00e18fe9f | |||
2cdd8b7429 | |||
f6ad8e1c9c | |||
273988551d | |||
0c20a5f39f | |||
|
93b711d70d | ||
|
70d33dc71f | ||
|
2b29f1a181 | ||
d7ceb7efea | |||
69527abb6f | |||
|
1f04cc62d9 | ||
607ef09fa5 | |||
|
548f0496a9 | ||
|
164ec3ac07 | ||
|
07443969f9 | ||
|
6d84b1e108 | ||
|
a4e00c5cb5 | ||
|
5e413c9dcd | ||
|
20f7ff8ac0 | ||
|
0a7ffae0d9 | ||
0bac74ec2b | |||
f59f0195e3 | |||
fa5e2ca276 | |||
8e9ca5ebcb | |||
|
81388d9425 | ||
|
0c8db77154 | ||
|
b38051c9ad | ||
|
984e0b1263 | ||
|
d29289addb | ||
|
57717a20d3 | ||
|
64453cb134 | ||
|
e5643c65c1 | ||
|
129979acf7 | ||
|
039f90d05f | ||
|
e2c46fda3f | ||
|
5c66de860d | ||
|
f7022925d3 | ||
|
a06d323f03 | ||
f279fc5772 | |||
|
0355299639 | ||
|
0c848a9b3b | ||
|
18c210b013 | ||
2d2a5dd966 | |||
8b989d4999 | |||
|
57fa8690df | ||
|
8ac0ab47b0 | ||
|
15f4d7c04c | ||
|
54ac304828 | ||
|
c839950791 | ||
|
9529703cab | ||
|
2fe8a257ac | ||
|
31668b8f94 | ||
|
788b06fe0f | ||
|
3937953f72 | ||
|
5a0dd7e322 | ||
|
4253db28fa | ||
|
db378e746b | ||
|
e6aab701c9 | ||
|
aaab0610eb | ||
|
c6953f13e4 | ||
|
dcdc8d187c | ||
|
acf9d786f1 | ||
|
bba6ad1f4e | ||
|
e9507e7ffa | ||
|
04911822c1 | ||
|
e3968cdf65 | ||
|
882b8f45d9 | ||
|
417f9bb48d | ||
|
88a046a76e | ||
|
be352ce1b6 | ||
|
eb805b77b7 | ||
|
374f0c7d11 | ||
|
6893135fef | ||
|
5a404a17ee | ||
|
6b4fd01eeb | ||
|
b7462934e2 | ||
|
ccb9d99880 | ||
|
e3759931e7 | ||
|
97d79c8e52 | ||
|
d1d7e47896 | ||
|
77a8e3b649 | ||
|
6d154e72dd | ||
|
67608350b6 | ||
|
67331fe946 | ||
|
8f772352ce | ||
|
b199779ad4 | ||
|
77a85e9b4c | ||
|
979704271b | ||
|
055121df80 | ||
|
100aca1848 | ||
|
9957675a66 | ||
|
4651ad94fe | ||
|
6810d09c1b | ||
|
dd93244853 | ||
|
19af139631 | ||
|
f72b9fa767 | ||
|
ffd3c11ba7 | ||
|
68257e0d7d | ||
|
f64cf8679d | ||
|
278c1d06cf | ||
|
79af42e992 | ||
|
4acccc232a | ||
|
814c61a321 | ||
|
470c902bdc | ||
|
2cdb0cb084 | ||
|
0d3756818f | ||
|
8cdf303e72 | ||
|
0a3d5f5ff8 | ||
|
aeeee9f18e | ||
|
675cf7a8ee | ||
|
9fca8af586 | ||
|
a59c19c6c2 | ||
|
5587e439a9 | ||
|
578bb6638f | ||
|
e3a4524133 | ||
|
906613e83a | ||
|
ed1457dca3 | ||
|
992c72c0cb | ||
|
57230c559b | ||
|
d89e7484c8 | ||
|
59f16b1a38 | ||
|
8d8f45f0dd | ||
|
3a2c0531b6 | ||
|
b1e24a0ae3 | ||
|
9d979a6d23 | ||
|
9842e8b762 | ||
|
f8c6034b93 | ||
|
fd1aa154f4 | ||
|
adc76cca54 | ||
|
9bdc1e8f04 | ||
|
19b838dd60 | ||
|
9162ac9d37 | ||
|
2a2f80bb71 | ||
|
33dabc42bb | ||
|
6540948ace | ||
|
fa562ba041 | ||
|
37d318c410 | ||
|
24d7697acc | ||
|
1eed52f294 | ||
|
84aec4fcb8 | ||
|
ebc76a4200 | ||
|
646d160c38 | ||
|
273b33b087 | ||
|
8d51156150 | ||
|
867f6a5964 | ||
|
9c58ea7a37 | ||
|
5e5f864990 | ||
|
0dce7bf85d | ||
|
588fee5473 | ||
|
c6e4fa7df1 | ||
|
146827c458 | ||
|
142321da79 | ||
|
1ed212775c | ||
|
5a6ea11ead | ||
|
5b86bce7b2 | ||
|
345dcd3c7b | ||
|
be72f1e54b | ||
|
b8565d8cac | ||
|
e5c1865e76 | ||
|
7331149dde | ||
|
fb1ac307a4 | ||
|
ec90fb4c99 | ||
|
5ea55f3948 | ||
|
1cfdbb4dea | ||
|
41de69c5b7 | ||
|
f4ca94d3f6 | ||
|
e79724ea22 | ||
|
b3893878bb | ||
|
ed0b0b80d3 | ||
|
4e09dbc86e | ||
|
cc4186410b | ||
|
869b645708 | ||
|
6c161ad18a | ||
|
44713a68ed | ||
|
6204020b6a | ||
|
6cb668955e | ||
|
585e49a597 | ||
|
bcf26f8ec0 | ||
|
98bdf01967 | ||
|
ef4b699f40 | ||
|
a24ba6c264 | ||
|
3cf0e95f6e | ||
|
7c40967c1f | ||
|
385c2f1381 | ||
|
49b8eac2dc | ||
|
1ae34ca62d | ||
|
bd6531d0d0 | ||
|
5dd9400fe2 | ||
|
ee105257ff | ||
|
a6ada35259 | ||
|
c36fc98137 | ||
|
1c580d1612 | ||
|
f92cf38ab5 | ||
|
8537fa7206 | ||
|
148695c571 | ||
|
1bfbcff71e | ||
|
7a97a33598 | ||
|
61c6fd3055 | ||
|
8d54f76539 | ||
|
0d9fdeda8e | ||
|
1a17b6c8f6 | ||
|
08a5478a93 | ||
|
68ec2a7877 | ||
|
d220debc6c | ||
|
fbbc80f79e | ||
|
c73f578e8c | ||
|
2bfceea762 | ||
|
0d8fbf647b | ||
|
acaea776eb | ||
|
1c256a4be7 | ||
|
89dba56782 | ||
|
22f6502b14 | ||
|
36bee83864 | ||
|
e68bf58989 | ||
|
41c40f130b | ||
|
81adc38176 | ||
|
8028794bee | ||
|
a83cd9b4f5 | ||
|
83b6defbfb | ||
|
7f0efbe00e | ||
|
25ae42ae8a | ||
|
b6c5f49379 | ||
|
d9a37c915f | ||
|
09b71c97aa | ||
|
b59acc7e2c | ||
|
4ad6b1e58d | ||
|
30da75941b | ||
|
6ccf020dc2 | ||
|
61abfc9050 | ||
|
9e47df298f | ||
|
b8a8891a86 | ||
|
26ac0c48f0 | ||
|
f6775a2d55 | ||
|
5239018878 | ||
|
15c9191568 | ||
|
8ac3f9a6e1 | ||
|
93e8d4871d | ||
|
ad54d08abd | ||
|
32a4212ef1 | ||
|
8032423bf1 | ||
|
54ce5b28a4 | ||
|
5777649ac4 | ||
|
ffa688a432 | ||
|
d62c5667cf | ||
|
57b992717b | ||
|
69c8ed9965 | ||
|
b351cbe490 | ||
|
f40e82a19d | ||
|
80fc5fb46c | ||
|
4844268d1c | ||
|
21f85cac87 | ||
|
c85557e553 | ||
|
3ed7910cfe | ||
|
a97bce51c2 | ||
|
30d0f06890 | ||
|
f6e6b2c917 | ||
|
afb817fe19 | ||
|
b11bd185e3 | ||
|
9c18236f2c | ||
|
e67124e174 | ||
|
3fede15940 | ||
|
e08a6e2014 | ||
|
e890e7db76 | ||
|
afc3d71fd0 | ||
|
c521b965bd | ||
|
2e39637db2 | ||
|
41fa16f325 | ||
|
57b82e2e99 | ||
|
3e85e833a7 | ||
|
8503854655 | ||
|
d85348b1d1 | ||
|
13528bfcd0 | ||
|
58cff7b081 | ||
|
c6d7b98808 | ||
|
e6e69d5289 | ||
|
1a42a8a5d5 | ||
|
e08b3abe7f | ||
|
46bd2f1ced | ||
|
55170ae703 | ||
|
6fe445e6c0 | ||
|
21675ec7e2 | ||
|
2637c06f88 | ||
|
211c630cbe | ||
|
de45a8729c | ||
|
4f3ea3907e | ||
|
ccefa76a46 | ||
|
6691ee3b96 | ||
|
eab18f06a4 | ||
|
0f64ee5ce1 | ||
|
e740c24eb7 | ||
|
c88b104ec6 | ||
|
996b16de70 | ||
|
a05fd7aa50 | ||
|
b0990fcff7 | ||
|
4fc055d6e9 | ||
|
123c7f99c3 | ||
|
7048e1522f | ||
|
33ca4f2b99 | ||
|
5ddfdc8516 | ||
|
a38bbefe1b | ||
|
549caca39c | ||
|
b6933a2ebd | ||
|
39e8783f4b | ||
|
0c90326ada | ||
|
bc22e9333e | ||
|
762b656b53 | ||
|
ad89601c49 | ||
|
ea4f6bb8b2 | ||
|
9c36c12c85 | ||
|
802ca4e722 | ||
|
6953df7b5e | ||
|
e0a91d7325 | ||
|
ad7bdeb73a | ||
|
20a30825a0 | ||
|
793de48e89 | ||
|
ad90e88ebd | ||
|
54951e39a1 | ||
|
2cb6351af5 | ||
|
0533b666b7 | ||
|
f6886754ff | ||
|
fc58ed9987 | ||
|
cf16f452da | ||
|
0cbe94256e | ||
|
5f6303f985 | ||
|
f8efab4653 | ||
|
2f72eb0657 | ||
|
62795a2e6d | ||
|
4bcbcbc58f | ||
|
7d40cc9291 | ||
|
48c1c7f221 | ||
|
236f71640c | ||
|
0ad40ee868 | ||
|
e9cb9c1135 | ||
|
c38af72978 | ||
|
b4bd7b367e | ||
|
08cb5ba2cd | ||
|
d0655a48ba | ||
|
8c558d74a5 | ||
|
73001ae1a9 | ||
|
95c8467670 | ||
|
6ff0858b38 | ||
|
33ef34189e | ||
|
80e3397f85 | ||
|
9edb75ec0b | ||
|
00a6287f97 | ||
|
ccf70fc4b3 | ||
|
edf7b02ddb | ||
|
488cf26406 | ||
|
4487ad1a5e | ||
|
a0831cec39 | ||
|
279fe11b03 | ||
|
e8bff0ad03 | ||
|
111a47af0d | ||
|
bc984d9af5 | ||
|
bf0210229c | ||
|
b2e83b4da6 | ||
|
08c048e0a1 | ||
|
ae340f415e | ||
|
f2c03a77f0 | ||
|
bc1b84cbbb | ||
|
b043d58b92 | ||
|
eed49d7792 | ||
|
e68a51eced | ||
|
1c0700e0c0 | ||
|
14429bbe8a | ||
|
6289b4dd81 | ||
|
53e17d07d2 | ||
|
5bcdf16dc5 | ||
|
01603d9e47 | ||
|
86c295bb3b | ||
|
e09f251fc6 | ||
|
0853c1979b | ||
|
3b7daca832 | ||
|
78eece71d9 | ||
|
d66dea5d83 | ||
|
4b96244b4d | ||
|
cbe00ec651 | ||
|
207cf7bbdd | ||
|
d0092925c9 | ||
|
7d831be3ab | ||
|
8b157c9bdf | ||
|
d2bc32e94a | ||
|
46123742f5 | ||
|
340a36bf1f | ||
|
3046a6ce39 | ||
|
e404d16929 | ||
|
e4ad632989 | ||
|
2144cd98a3 | ||
|
a53cfeef13 | ||
|
a2cf81e722 | ||
|
585ad9bcab | ||
|
ccd586a736 | ||
|
78d66b7732 | ||
|
41094b6a4a | ||
|
e89be8d97a | ||
|
b4bacff4fe | ||
|
7a48b5597d | ||
|
5e3ed3a05e | ||
|
7aacb2ed8e | ||
|
38a64eb2aa | ||
|
11dece205c | ||
|
14ad424470 | ||
|
9b1651a267 | ||
|
394c749b6b | ||
|
39662aabef | ||
|
66c7d9b8ed | ||
|
4aa63ce8f3 | ||
|
753b1d7e15 | ||
|
16aac9c341 | ||
|
909a83758c | ||
|
7c6b39e189 | ||
|
b5e8b36b5b | ||
|
45edd9f326 | ||
|
31cf9e888b | ||
|
d9f8ed7bdf | ||
7e70ead396 | |||
|
b8f9e24189 | ||
|
0babadfbe4 | ||
|
28d9181d5d | ||
|
cd03bac3dd | ||
|
7acdaaaf2f | ||
|
18247bb3b8 | ||
|
b335b0501c | ||
|
6ce74b2a1b | ||
|
20717ededf | ||
|
6a6dbbaad2 | ||
|
ff6c934916 | ||
|
a53c4f0fb7 | ||
|
19a6513607 | ||
|
a57c2b073a | ||
|
37de878129 | ||
|
c6035158ca | ||
|
c8ab5e58f9 | ||
|
928e6a04e2 | ||
|
d757aa7591 | ||
|
6bd3106681 | ||
|
710b758b81 | ||
|
d4588df9f9 | ||
|
16dca0d7bc | ||
|
ceaff9c9f2 | ||
|
ee57afc285 | ||
|
a8641ea44a | ||
|
9e85f40733 | ||
|
7107e63f8c | ||
|
66620b497b | ||
|
6e3d023e69 | ||
|
7469f00c5b | ||
|
f656b0ae96 | ||
|
9c74dc2468 | ||
|
92559e6f3a | ||
|
63116bd59f | ||
|
2c05412d72 | ||
|
69e9acd702 | ||
|
f87fe395a7 | ||
|
219598a90b | ||
|
80231975e5 | ||
|
d8e870c50c | ||
|
13b53e1290 | ||
|
20ff6fd3f1 | ||
|
8ab267496b | ||
|
8d2162ba2d | ||
|
aa83488fde | ||
|
56d4749ac9 | ||
|
e9f3ddb6ba | ||
|
ef3c4a8737 | ||
|
52d57b17b0 | ||
|
dc5b7b996c | ||
|
e31b5d3870 | ||
|
b2f0491a90 | ||
|
47ce306085 | ||
|
0d26359b5b | ||
|
93fd42b0c3 | ||
|
f939f48cd2 | ||
|
4066a07d8f | ||
|
b83820e723 | ||
|
dd3acccb1b | ||
|
778e196b55 | ||
|
07f98f9234 | ||
|
fff09a4af2 | ||
|
a7fe82c646 | ||
|
cc38a42b07 | ||
|
b38712a302 | ||
|
335a2392e7 | ||
|
c4b700f1b0 | ||
|
996ae28989 | ||
|
5da60cef46 | ||
|
de28817d9f | ||
|
325d031082 | ||
|
5c776f21e7 | ||
|
04e9df47d9 | ||
|
977604ef08 | ||
|
6acf204d14 | ||
|
b531a0c1cf | ||
|
ac4a7d02c7 | ||
|
2e6a77a78a | ||
|
d212505dcf | ||
|
b2eafcc720 |
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -39,6 +39,7 @@ Describe here
|
|||||||
|
|
||||||
Some things are not automated, and forgotten often. This list is a reminder for the reviewers.
|
Some things are not automated, and forgotten often. This list is a reminder for the reviewers.
|
||||||
* The bug fix is important enough to be backported? (label: 'backport requested')
|
* The bug fix is important enough to be backported? (label: 'backport requested')
|
||||||
|
* This PR touches english.txt or translations? Check the [guidelines](https://github.com/OpenTTD/OpenTTD/blob/master/docs/eints.md)
|
||||||
* This PR affects the save game format? (label 'savegame upgrade')
|
* This PR affects the save game format? (label 'savegame upgrade')
|
||||||
* This PR affects the GS/AI API? (label 'needs review: Script API')
|
* This PR affects the GS/AI API? (label 'needs review: Script API')
|
||||||
* ai_changelog.hpp, gs_changelog.hpp need updating.
|
* ai_changelog.hpp, gs_changelog.hpp need updating.
|
||||||
|
4
.github/changelog.sh
vendored
@@ -4,9 +4,9 @@ tag=$(git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null | sed 's@\
|
|||||||
|
|
||||||
# If we are a tag, show the part of the changelog till (but excluding) the last stable
|
# If we are a tag, show the part of the changelog till (but excluding) the last stable
|
||||||
if [ -n "$tag" ]; then
|
if [ -n "$tag" ]; then
|
||||||
grep='^[0-9]\+\.[0-9]\+\.[0-9]\+[^-]'
|
grep='^[0-9]\+\.[0-9]\+[^-]'
|
||||||
next=$(cat changelog.txt | grep '^[0-9]' | awk 'BEGIN { show="false" } // { if (show=="true") print $0; if ($1=="'$tag'") show="true"} ' | grep "$grep" | head -n1 | sed 's/ .*//')
|
next=$(cat changelog.txt | grep '^[0-9]' | awk 'BEGIN { show="false" } // { if (show=="true") print $0; if ($1=="'$tag'") show="true"} ' | grep "$grep" | head -n1 | sed 's/ .*//')
|
||||||
cat changelog.txt | awk 'BEGIN { show="false" } /^[0-9]+.[0-9]+.[0-9]+/ { if ($1=="'$next'") show="false"; if ($1=="'$tag'") show="true";} // { if (show=="true") print $0 }'
|
cat changelog.txt | awk 'BEGIN { show="false" } /^[0-9]+.[0-9]+/ { if ($1=="'$next'") show="false"; if ($1=="'$tag'") show="true";} // { if (show=="true") print $0 }'
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
34
.github/stale.yml
vendored
@@ -1,34 +0,0 @@
|
|||||||
daysUntilClose: 7
|
|
||||||
staleLabel: stale
|
|
||||||
closeComment: false
|
|
||||||
exemptMilestones: true
|
|
||||||
exemptAssignees: true
|
|
||||||
|
|
||||||
issues:
|
|
||||||
daysUntilStale: 60
|
|
||||||
exemptLabels:
|
|
||||||
- pinned
|
|
||||||
- security
|
|
||||||
- "good first issue"
|
|
||||||
- regression
|
|
||||||
markComment: >
|
|
||||||
This issue has been automatically marked as stale because it has not had any activity in the last two months.
|
|
||||||
|
|
||||||
If you believe the issue is still relevant, please test on the latest nightly and report back.
|
|
||||||
|
|
||||||
It will be closed if no further activity occurs within 7 days.
|
|
||||||
|
|
||||||
Thank you for your contributions.
|
|
||||||
|
|
||||||
pulls:
|
|
||||||
daysUntilStale: 30
|
|
||||||
exemptLabels:
|
|
||||||
- pinned
|
|
||||||
markComment: >
|
|
||||||
This pull request has been automatically marked as stale because it has not had any activity in the last month.
|
|
||||||
|
|
||||||
Please feel free to give a status update now, ping for review, or re-open when it's ready.
|
|
||||||
|
|
||||||
It will be closed if no further activity occurs within 7 days.
|
|
||||||
|
|
||||||
Thank you for your contributions.
|
|
221
.github/unused-strings.py
vendored
Normal file
@@ -0,0 +1,221 @@
|
|||||||
|
"""
|
||||||
|
Script to scan the OpenTTD source-tree for STR_ entries that are defined but
|
||||||
|
no longer used.
|
||||||
|
|
||||||
|
This is not completely trivial, as OpenTTD references a lot of strings in
|
||||||
|
relation to another string. The most obvious example of this is a list. OpenTTD
|
||||||
|
only references the first entry in the list, and does "+ <var>" to get to the
|
||||||
|
correct string.
|
||||||
|
|
||||||
|
There are other ways OpenTTD does use relative values. This script tries to
|
||||||
|
account for all of them, to give the best approximation we have for "this
|
||||||
|
string is unused".
|
||||||
|
"""
|
||||||
|
|
||||||
|
import glob
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
LENGTH_NAME_LOOKUP = {
|
||||||
|
"VEHICLE_TYPES": 4,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class SkipType(Enum):
|
||||||
|
NONE = 1
|
||||||
|
LENGTH = 2
|
||||||
|
EXTERNAL = 3
|
||||||
|
ZERO_IS_SPECIAL = 4
|
||||||
|
EXPECT_NEWLINE = 5
|
||||||
|
|
||||||
|
|
||||||
|
def read_language_file(filename, strings_found, errors):
|
||||||
|
strings_defined = []
|
||||||
|
|
||||||
|
skip = SkipType.NONE
|
||||||
|
length = 0
|
||||||
|
common_prefix = ""
|
||||||
|
last_tiny_string = ""
|
||||||
|
|
||||||
|
with open(filename) as fp:
|
||||||
|
for line in fp.readlines():
|
||||||
|
if not line.strip():
|
||||||
|
if skip == SkipType.EXPECT_NEWLINE:
|
||||||
|
skip = SkipType.NONE
|
||||||
|
continue
|
||||||
|
|
||||||
|
line = line.strip()
|
||||||
|
|
||||||
|
if skip == SkipType.EXPECT_NEWLINE:
|
||||||
|
# The only thing allowed after a list, is this next marker, or a newline.
|
||||||
|
if line == "###next-name-looks-similar":
|
||||||
|
# "###next-name-looks-similar"
|
||||||
|
# Indicates the common prefix of the last list has a very
|
||||||
|
# similar name to the next entry, but isn't part of the
|
||||||
|
# list. So do not emit a warning about them looking very
|
||||||
|
# similar.
|
||||||
|
|
||||||
|
if length != 0:
|
||||||
|
errors.append(f"ERROR: list around {name} is shorted than indicated by ###length")
|
||||||
|
|
||||||
|
common_prefix = ""
|
||||||
|
else:
|
||||||
|
errors.append(f"ERROR: expected a newline after a list, but didn't find any around {name}. Did you add an entry to the list without increasing the length?")
|
||||||
|
|
||||||
|
skip = SkipType.NONE
|
||||||
|
|
||||||
|
if line[0] == "#":
|
||||||
|
if line.startswith("###length "):
|
||||||
|
# "###length <count>"
|
||||||
|
# Indicates the next few entries are part of a list. Only
|
||||||
|
# the first entry is possibly referenced, and the rest are
|
||||||
|
# indirectly.
|
||||||
|
|
||||||
|
if length != 0:
|
||||||
|
errors.append(f"ERROR: list around {name} is shorted than indicated by ###length")
|
||||||
|
|
||||||
|
length = line.split(" ")[1].strip()
|
||||||
|
|
||||||
|
if length.isnumeric():
|
||||||
|
length = int(length)
|
||||||
|
else:
|
||||||
|
length = LENGTH_NAME_LOOKUP[length]
|
||||||
|
|
||||||
|
skip = SkipType.LENGTH
|
||||||
|
elif line.startswith("###external "):
|
||||||
|
# "###external <count>"
|
||||||
|
# Indicates the next few entries are used outside the
|
||||||
|
# source and will not be referenced.
|
||||||
|
|
||||||
|
if length != 0:
|
||||||
|
errors.append(f"ERROR: list around {name} is shorted than indicated by ###length")
|
||||||
|
|
||||||
|
length = line.split(" ")[1].strip()
|
||||||
|
length = int(length)
|
||||||
|
|
||||||
|
skip = SkipType.EXTERNAL
|
||||||
|
elif line.startswith("###setting-zero-is-special"):
|
||||||
|
# "###setting-zero-is-special"
|
||||||
|
# Indicates the next entry is part of the "zero is special"
|
||||||
|
# flag of settings. These entries are not referenced
|
||||||
|
# directly in the code.
|
||||||
|
|
||||||
|
if length != 0:
|
||||||
|
errors.append(f"ERROR: list around {name} is shorted than indicated by ###length")
|
||||||
|
|
||||||
|
skip = SkipType.ZERO_IS_SPECIAL
|
||||||
|
|
||||||
|
continue
|
||||||
|
|
||||||
|
name = line.split(":")[0].strip()
|
||||||
|
strings_defined.append(name)
|
||||||
|
|
||||||
|
# If a string ends on _TINY or _SMALL, it can be the {TINY} variant.
|
||||||
|
# Check for this by some fuzzy matching.
|
||||||
|
if name.endswith(("_SMALL", "_TINY")):
|
||||||
|
last_tiny_string = name
|
||||||
|
elif last_tiny_string:
|
||||||
|
matching_name = "_".join(last_tiny_string.split("_")[:-1])
|
||||||
|
if name == matching_name:
|
||||||
|
strings_found.add(last_tiny_string)
|
||||||
|
else:
|
||||||
|
last_tiny_string = ""
|
||||||
|
|
||||||
|
if skip == SkipType.EXTERNAL:
|
||||||
|
strings_found.add(name)
|
||||||
|
skip = SkipType.LENGTH
|
||||||
|
|
||||||
|
if skip == SkipType.LENGTH:
|
||||||
|
skip = SkipType.NONE
|
||||||
|
length -= 1
|
||||||
|
common_prefix = name
|
||||||
|
elif skip == SkipType.ZERO_IS_SPECIAL:
|
||||||
|
strings_found.add(name)
|
||||||
|
elif length > 0:
|
||||||
|
strings_found.add(name)
|
||||||
|
length -= 1
|
||||||
|
|
||||||
|
# Find the common prefix of these strings
|
||||||
|
for i in range(len(common_prefix)):
|
||||||
|
if common_prefix[0 : i + 1] != name[0 : i + 1]:
|
||||||
|
common_prefix = common_prefix[0:i]
|
||||||
|
break
|
||||||
|
|
||||||
|
if length == 0:
|
||||||
|
skip = SkipType.EXPECT_NEWLINE
|
||||||
|
|
||||||
|
if len(common_prefix) < 6:
|
||||||
|
errors.append(f"ERROR: common prefix of block including {name} was reduced to {common_prefix}. This means the names in the list are not consistent.")
|
||||||
|
elif common_prefix:
|
||||||
|
if name.startswith(common_prefix):
|
||||||
|
errors.append(f"ERROR: {name} looks a lot like block above with prefix {common_prefix}. This mostly means that the list length was too short. Use '###next-name-looks-similar' if it is not.")
|
||||||
|
common_prefix = ""
|
||||||
|
|
||||||
|
return strings_defined
|
||||||
|
|
||||||
|
|
||||||
|
def scan_source_files(path, strings_found):
|
||||||
|
for new_path in glob.glob(f"{path}/*"):
|
||||||
|
if os.path.isdir(new_path):
|
||||||
|
scan_source_files(new_path, strings_found)
|
||||||
|
continue
|
||||||
|
|
||||||
|
if not new_path.endswith((".c", ".h", ".cpp", ".hpp", ".ini")):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Most files we can just open, but some use magic, that requires the
|
||||||
|
# G++ preprocessor before we can make sense out of it.
|
||||||
|
if new_path == "src/table/cargo_const.h":
|
||||||
|
p = subprocess.run(["g++", "-E", new_path], stdout=subprocess.PIPE)
|
||||||
|
output = p.stdout.decode()
|
||||||
|
else:
|
||||||
|
with open(new_path) as fp:
|
||||||
|
output = fp.read()
|
||||||
|
|
||||||
|
# Find all the string references.
|
||||||
|
matches = re.findall(r"[^A-Z_](STR_[A-Z0-9_]*)", output)
|
||||||
|
strings_found.update(matches)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
strings_found = set()
|
||||||
|
errors = []
|
||||||
|
|
||||||
|
scan_source_files("src", strings_found)
|
||||||
|
strings_defined = read_language_file("src/lang/english.txt", strings_found, errors)
|
||||||
|
|
||||||
|
# STR_LAST_STRINGID is special, and not really a string.
|
||||||
|
strings_found.remove("STR_LAST_STRINGID")
|
||||||
|
# These are mentioned in comments, not really a string.
|
||||||
|
strings_found.remove("STR_XXX")
|
||||||
|
strings_found.remove("STR_NEWS")
|
||||||
|
strings_found.remove("STR_CONTENT_TYPE_")
|
||||||
|
|
||||||
|
# This string is added for completion, but never used.
|
||||||
|
strings_defined.remove("STR_JUST_DATE_SHORT")
|
||||||
|
|
||||||
|
strings_defined = sorted(strings_defined)
|
||||||
|
strings_found = sorted(list(strings_found))
|
||||||
|
|
||||||
|
for string in strings_found:
|
||||||
|
if string not in strings_defined:
|
||||||
|
errors.append(f"ERROR: {string} found but never defined.")
|
||||||
|
|
||||||
|
for string in strings_defined:
|
||||||
|
if string not in strings_found:
|
||||||
|
errors.append(f"ERROR: {string} is (possibly) no longer needed.")
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
for error in errors:
|
||||||
|
print(error)
|
||||||
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
print("OK")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
46
.github/workflows/ci-build.yml
vendored
@@ -16,17 +16,22 @@ jobs:
|
|||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container:
|
container:
|
||||||
# If you change this version, change the number in the cache step too.
|
# If you change this version, change the number in the cache step too.
|
||||||
image: emscripten/emsdk:2.0.10
|
image: emscripten/emsdk:3.1.28
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Setup cache
|
- name: Setup cache
|
||||||
uses: actions/cache@v2
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: /emsdk/upstream/emscripten/cache
|
path: /emsdk/upstream/emscripten/cache
|
||||||
key: 2.0.10-${{ runner.os }}
|
key: 3.1.28-${{ runner.os }}
|
||||||
|
|
||||||
|
- name: Patch Emscripten to support LZMA
|
||||||
|
run: |
|
||||||
|
cd /emsdk/upstream/emscripten
|
||||||
|
patch -p1 < ${GITHUB_WORKSPACE}/os/emscripten/emsdk-liblzma.patch
|
||||||
|
|
||||||
- name: Build (host tools)
|
- name: Build (host tools)
|
||||||
run: |
|
run: |
|
||||||
@@ -77,7 +82,7 @@ jobs:
|
|||||||
libsdl: libsdl1.2-dev
|
libsdl: libsdl1.2-dev
|
||||||
- compiler: gcc
|
- compiler: gcc
|
||||||
cxxcompiler: g++
|
cxxcompiler: g++
|
||||||
extra-cmake-parameters: -DOPTION_DEDICATED=ON
|
extra-cmake-parameters: -DOPTION_DEDICATED=ON -DCMAKE_CXX_FLAGS_INIT="-DRANDOM_DEBUG"
|
||||||
|
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
env:
|
env:
|
||||||
@@ -86,7 +91,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
@@ -157,19 +162,28 @@ jobs:
|
|||||||
|
|
||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
env:
|
env:
|
||||||
MACOSX_DEPLOYMENT_TARGET: 10.14
|
MACOSX_DEPLOYMENT_TARGET: 10.13
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
env:
|
||||||
|
HOMEBREW_NO_AUTO_UPDATE: 1
|
||||||
|
HOMEBREW_NO_INSTALL_CLEANUP: 1
|
||||||
|
run: |
|
||||||
|
brew install \
|
||||||
|
pkg-config \
|
||||||
|
# EOF
|
||||||
|
|
||||||
- name: Prepare cache key
|
- name: Prepare cache key
|
||||||
id: key
|
id: key
|
||||||
run: |
|
run: |
|
||||||
echo "::set-output name=image::$ImageOS-$ImageVersion"
|
echo "image=$ImageOS-$ImageVersion" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Enable vcpkg cache
|
- name: Enable vcpkg cache
|
||||||
uses: actions/cache@v2
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: /usr/local/share/vcpkg/installed
|
path: /usr/local/share/vcpkg/installed
|
||||||
key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}-0 # Increase the number whenever dependencies are modified
|
key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}-0 # Increase the number whenever dependencies are modified
|
||||||
@@ -232,14 +246,14 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [windows-latest, windows-2016]
|
os: [windows-latest, windows-2019]
|
||||||
arch: [x86, x64]
|
arch: [x86, x64]
|
||||||
|
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Prepare cache key
|
- name: Prepare cache key
|
||||||
id: key
|
id: key
|
||||||
@@ -248,10 +262,10 @@ jobs:
|
|||||||
# Work around caching failure with GNU tar
|
# Work around caching failure with GNU tar
|
||||||
New-Item -Type Junction -Path vcpkg -Target c:\vcpkg
|
New-Item -Type Junction -Path vcpkg -Target c:\vcpkg
|
||||||
|
|
||||||
Write-Output "::set-output name=image::$env:ImageOS-$env:ImageVersion"
|
Write-Output "image=$env:ImageOS-$env:ImageVersion" >> $env:GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Enable vcpkg cache
|
- name: Enable vcpkg cache
|
||||||
uses: actions/cache@v2
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: vcpkg/installed
|
path: vcpkg/installed
|
||||||
key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}-0 # Increase the number whenever dependencies are modified
|
key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}-0 # Increase the number whenever dependencies are modified
|
||||||
@@ -333,7 +347,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Setup MSYS2
|
- name: Setup MSYS2
|
||||||
uses: msys2/setup-msys2@v2
|
uses: msys2/setup-msys2@v2
|
||||||
@@ -403,4 +417,4 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check annotations
|
- name: Check annotations
|
||||||
uses: OpenTTD/actions/annotation-check@v2
|
uses: OpenTTD/actions/annotation-check@v3
|
||||||
|
2
.github/workflows/commit-checker.yml
vendored
@@ -10,7 +10,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 4
|
fetch-depth: 4
|
||||||
|
|
||||||
|
30
.github/workflows/preview_build.yml
vendored
@@ -12,9 +12,7 @@ jobs:
|
|||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container:
|
container:
|
||||||
# If you change this version, change the number in the cache step too.
|
# If you change this version, change the number in the cache step too.
|
||||||
image: emscripten/emsdk:2.0.10
|
image: emscripten/emsdk:3.1.28
|
||||||
# uid=1001(runner) gid=121(docker)
|
|
||||||
options: -u 1001:121
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Update deployment status to in progress
|
- name: Update deployment status to in progress
|
||||||
@@ -33,7 +31,7 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.PREVIEW_GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.client_payload.sha }}
|
ref: ${{ github.event.client_payload.sha }}
|
||||||
|
|
||||||
@@ -43,10 +41,15 @@ jobs:
|
|||||||
git checkout -b ${name}
|
git checkout -b ${name}
|
||||||
|
|
||||||
- name: Setup cache
|
- name: Setup cache
|
||||||
uses: actions/cache@v2
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: /emsdk/upstream/emscripten/cache
|
path: /emsdk/upstream/emscripten/cache
|
||||||
key: 2.0.10-${{ runner.os }}
|
key: 3.1.28-${{ runner.os }}
|
||||||
|
|
||||||
|
- name: Patch Emscripten to support LZMA
|
||||||
|
run: |
|
||||||
|
cd /emsdk/upstream/emscripten
|
||||||
|
patch -p1 < ${GITHUB_WORKSPACE}/os/emscripten/emsdk-liblzma.patch
|
||||||
|
|
||||||
- name: Build (host tools)
|
- name: Build (host tools)
|
||||||
run: |
|
run: |
|
||||||
@@ -73,7 +76,7 @@ jobs:
|
|||||||
echo "::group::CMake"
|
echo "::group::CMake"
|
||||||
emcmake cmake .. \
|
emcmake cmake .. \
|
||||||
-DHOST_BINARY_DIR=../build-host \
|
-DHOST_BINARY_DIR=../build-host \
|
||||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
# EOF
|
# EOF
|
||||||
echo "::endgroup::"
|
echo "::endgroup::"
|
||||||
|
|
||||||
@@ -84,18 +87,15 @@ jobs:
|
|||||||
|
|
||||||
- name: Publish preview
|
- name: Publish preview
|
||||||
run: |
|
run: |
|
||||||
# setuptools is missing in this Docker image, which breaks installing
|
|
||||||
# awscli. So we need to do this in two steps to recover sanity.
|
|
||||||
pip3 install setuptools
|
|
||||||
pip3 install awscli
|
pip3 install awscli
|
||||||
|
|
||||||
~/.local/bin/aws s3 cp --only-show-errors build/openttd.data s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/
|
aws s3 cp --only-show-errors build/openttd.data s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/
|
||||||
~/.local/bin/aws s3 cp --only-show-errors build/openttd.html s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/
|
aws s3 cp --only-show-errors build/openttd.html s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/
|
||||||
~/.local/bin/aws s3 cp --only-show-errors build/openttd.js s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/
|
aws s3 cp --only-show-errors build/openttd.js s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/
|
||||||
~/.local/bin/aws s3 cp --only-show-errors build/openttd.wasm s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/
|
aws s3 cp --only-show-errors build/openttd.wasm s3://${{ secrets.PREVIEW_S3_BUCKET }}/${{ github.event.client_payload.folder }}/
|
||||||
|
|
||||||
# Invalidate the cache of the CloudFront distribution
|
# Invalidate the cache of the CloudFront distribution
|
||||||
~/.local/bin/aws cloudfront create-invalidation --distribution-id ${{ secrets.PREVIEW_CF_DISTRIBUTION_ID }} --paths "/${{ github.event.client_payload.folder }}/*"
|
aws cloudfront create-invalidation --distribution-id ${{ secrets.PREVIEW_CF_DISTRIBUTION_ID }} --paths "/${{ github.event.client_payload.folder }}/*"
|
||||||
env:
|
env:
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
|
2
.github/workflows/preview_label.yml
vendored
@@ -59,7 +59,7 @@ jobs:
|
|||||||
|
|
||||||
- if: steps.core_developer.outcome == 'success'
|
- if: steps.core_developer.outcome == 'success'
|
||||||
name: Trigger 'preview build'
|
name: Trigger 'preview build'
|
||||||
uses: peter-evans/repository-dispatch@v1
|
uses: peter-evans/repository-dispatch@v2
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.PREVIEW_GITHUB_TOKEN }}
|
token: ${{ secrets.PREVIEW_GITHUB_TOKEN }}
|
||||||
event-type: "Preview build #${{ github.event.number }}"
|
event-type: "Preview build #${{ github.event.number }}"
|
||||||
|
2
.github/workflows/preview_push.yml
vendored
@@ -59,7 +59,7 @@ jobs:
|
|||||||
|
|
||||||
- if: toJson(fromJson(steps.earlier_preview.outputs.data)) != '[]' && contains(fromJson(steps.preview_label.outputs.data).*.name, 'preview')
|
- if: toJson(fromJson(steps.earlier_preview.outputs.data)) != '[]' && contains(fromJson(steps.preview_label.outputs.data).*.name, 'preview')
|
||||||
name: Trigger 'preview build'
|
name: Trigger 'preview build'
|
||||||
uses: peter-evans/repository-dispatch@v1
|
uses: peter-evans/repository-dispatch@v2
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.PREVIEW_GITHUB_TOKEN }}
|
token: ${{ secrets.PREVIEW_GITHUB_TOKEN }}
|
||||||
event-type: "Preview build #${{ github.event.number }}"
|
event-type: "Preview build #${{ github.event.number }}"
|
||||||
|
85
.github/workflows/release-docs.yml
vendored
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
name: Release (Docs)
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
docs:
|
||||||
|
name: Docs
|
||||||
|
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Download source
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: internal-source
|
||||||
|
|
||||||
|
- name: Unpack source
|
||||||
|
run: |
|
||||||
|
tar -xf source.tar.gz --strip-components=1
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
echo "::group::Update apt"
|
||||||
|
sudo apt-get update
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Install dependencies"
|
||||||
|
sudo apt-get install -y --no-install-recommends \
|
||||||
|
doxygen \
|
||||||
|
# EOF
|
||||||
|
echo "::endgroup::"
|
||||||
|
env:
|
||||||
|
DEBIAN_FRONTEND: noninteractive
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
mkdir -p ${GITHUB_WORKSPACE}/build
|
||||||
|
cd ${GITHUB_WORKSPACE}/build
|
||||||
|
|
||||||
|
echo "::group::CMake"
|
||||||
|
cmake ${GITHUB_WORKSPACE} \
|
||||||
|
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||||
|
-DOPTION_DOCS_ONLY=ON \
|
||||||
|
# EOF
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Build"
|
||||||
|
cmake --build . --target docs
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
- name: Create bundles
|
||||||
|
run: |
|
||||||
|
BASENAME=openttd-${{ inputs.version }}
|
||||||
|
|
||||||
|
cd ${GITHUB_WORKSPACE}/build
|
||||||
|
|
||||||
|
mv docs/source ${BASENAME}-docs
|
||||||
|
mv docs/ai-api ${BASENAME}-docs-ai
|
||||||
|
mv docs/gs-api ${BASENAME}-docs-gs
|
||||||
|
|
||||||
|
mkdir -p bundles
|
||||||
|
|
||||||
|
echo "::group::Create docs bundle"
|
||||||
|
tar --xz -cf bundles/${BASENAME}-docs.tar.xz ${BASENAME}-docs
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Create AI API docs bundle"
|
||||||
|
tar --xz -cf bundles/${BASENAME}-docs-ai.tar.xz ${BASENAME}-docs-ai
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Create GameScript API docs bundle"
|
||||||
|
tar --xz -cf bundles/${BASENAME}-docs-gs.tar.xz ${BASENAME}-docs-gs
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
- name: Store bundles
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-docs
|
||||||
|
path: build/bundles/*.tar.xz
|
||||||
|
retention-days: 5
|
152
.github/workflows/release-linux.yml
vendored
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
name: Release (Linux)
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
linux:
|
||||||
|
name: Linux (Generic)
|
||||||
|
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
container:
|
||||||
|
# manylinux2014 is based on CentOS 7, but already has a lot of things
|
||||||
|
# installed and preconfigured. It makes it easier to build OpenTTD.
|
||||||
|
image: quay.io/pypa/manylinux2014_x86_64
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Download source
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: internal-source
|
||||||
|
|
||||||
|
- name: Unpack source
|
||||||
|
run: |
|
||||||
|
tar -xf source.tar.gz --strip-components=1
|
||||||
|
|
||||||
|
- name: Enable vcpkg cache
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: /vcpkg/installed
|
||||||
|
key: ubuntu-20.04-vcpkg-release-0 # Increase the number whenever dependencies are modified
|
||||||
|
restore-keys: |
|
||||||
|
ubuntu-20.04-vcpkg-release
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
echo "::group::Install system dependencies"
|
||||||
|
# ICU is used as vcpkg fails to install ICU. Other dependencies
|
||||||
|
# are needed either for vcpkg or for the packages installed with
|
||||||
|
# vcpkg.
|
||||||
|
yum install -y \
|
||||||
|
libicu-devel \
|
||||||
|
perl-IPC-Cmd \
|
||||||
|
wget \
|
||||||
|
zip \
|
||||||
|
# EOF
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
# The yum variant of fluidsynth depends on all possible audio drivers,
|
||||||
|
# like jack, ALSA, pulseaudio, etc. This is not really useful for us,
|
||||||
|
# as we route the output of fluidsynth back via our sound driver, and
|
||||||
|
# as such do not use these audio driver outputs at all.
|
||||||
|
# The vcpkg variant of fluidsynth depends on ALSA. Similar issue here.
|
||||||
|
# So instead, we compile fluidsynth ourselves, with as few
|
||||||
|
# dependencies as possible. We do it before anything else is installed,
|
||||||
|
# to make sure it doesn't pick up on any of the drivers.
|
||||||
|
echo "::group::Install fluidsynth"
|
||||||
|
wget https://github.com/FluidSynth/fluidsynth/archive/v2.3.3.tar.gz
|
||||||
|
tar xf v2.3.3.tar.gz
|
||||||
|
(
|
||||||
|
cd fluidsynth-2.3.3
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr
|
||||||
|
cmake --build . -j $(nproc)
|
||||||
|
cmake --install .
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Install audio drivers"
|
||||||
|
# These audio libs are to make sure the SDL version of vcpkg adds
|
||||||
|
# sound-support; these libraries are not added to the resulting
|
||||||
|
# binary, but the headers are used to enable them in SDL.
|
||||||
|
yum install -y \
|
||||||
|
alsa-lib-devel \
|
||||||
|
jack-audio-connection-kit-devel \
|
||||||
|
pulseaudio-libs-devel \
|
||||||
|
# EOF
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
# We use vcpkg for our dependencies, to get more up-to-date version.
|
||||||
|
echo "::group::Install vcpkg and dependencies"
|
||||||
|
|
||||||
|
# We do a little dance to make sure we copy the cached install folder
|
||||||
|
# into our new clone.
|
||||||
|
git clone --depth=1 https://github.com/microsoft/vcpkg /vcpkg-clone
|
||||||
|
if [ -e /vcpkg/installed ]; then
|
||||||
|
mv /vcpkg/installed /vcpkg-clone/
|
||||||
|
rm -rf /vcpkg
|
||||||
|
fi
|
||||||
|
mv /vcpkg-clone /vcpkg
|
||||||
|
|
||||||
|
(
|
||||||
|
cd /vcpkg
|
||||||
|
./bootstrap-vcpkg.sh -disableMetrics
|
||||||
|
|
||||||
|
# Make Python3 available for other packages.
|
||||||
|
./vcpkg install python3
|
||||||
|
ln -sf $(pwd)/installed/x64-linux/tools/python3/python3.[0-9][0-9] /usr/bin/python3
|
||||||
|
|
||||||
|
./vcpkg install \
|
||||||
|
curl[http2] \
|
||||||
|
fontconfig \
|
||||||
|
freetype \
|
||||||
|
liblzma \
|
||||||
|
libpng \
|
||||||
|
lzo \
|
||||||
|
sdl2 \
|
||||||
|
zlib \
|
||||||
|
# EOF
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
- name: Install GCC problem matcher
|
||||||
|
uses: ammaraskar/gcc-problem-matcher@master
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
mkdir -p build
|
||||||
|
cd build
|
||||||
|
|
||||||
|
echo "::group::CMake"
|
||||||
|
cmake ${GITHUB_WORKSPACE} \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake \
|
||||||
|
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||||
|
-DOPTION_PACKAGE_DEPENDENCIES=ON \
|
||||||
|
# EOF
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Build"
|
||||||
|
echo "Running on $(nproc) cores"
|
||||||
|
cmake --build . -j $(nproc)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
- name: Create bundles
|
||||||
|
run: |
|
||||||
|
cd ${GITHUB_WORKSPACE}/build
|
||||||
|
echo "::group::Run CPack"
|
||||||
|
cpack
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Cleanup"
|
||||||
|
# Remove the sha256 files CPack generates; we will do this ourself at
|
||||||
|
# the end of this workflow.
|
||||||
|
rm -f bundles/*.sha256
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
- name: Store bundles
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-linux-generic
|
||||||
|
path: build/bundles
|
||||||
|
retention-days: 5
|
198
.github/workflows/release-macos.yml
vendored
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
name: Release (MacOS)
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
macos:
|
||||||
|
name: MacOS
|
||||||
|
|
||||||
|
runs-on: macos-11
|
||||||
|
env:
|
||||||
|
MACOSX_DEPLOYMENT_TARGET: 10.13
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Download source
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: internal-source
|
||||||
|
|
||||||
|
- name: Unpack source
|
||||||
|
run: |
|
||||||
|
tar -xf source.tar.gz --strip-components=1
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
env:
|
||||||
|
HOMEBREW_NO_AUTO_UPDATE: 1
|
||||||
|
HOMEBREW_NO_INSTALL_CLEANUP: 1
|
||||||
|
run: |
|
||||||
|
brew install \
|
||||||
|
pandoc \
|
||||||
|
pkg-config \
|
||||||
|
# EOF
|
||||||
|
|
||||||
|
- name: Prepare cache key
|
||||||
|
id: key
|
||||||
|
run: |
|
||||||
|
echo "image=$ImageOS-$ImageVersion" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Enable vcpkg cache
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: /usr/local/share/vcpkg/installed
|
||||||
|
key: ${{ steps.key.outputs.image }}-vcpkg-release-0 # Increase the number whenever dependencies are modified
|
||||||
|
restore-keys: |
|
||||||
|
${{ steps.key.outputs.image }}-vcpkg-release
|
||||||
|
${{ steps.key.outputs.image }}-vcpkg-x64
|
||||||
|
|
||||||
|
- name: Prepare vcpkg
|
||||||
|
run: |
|
||||||
|
vcpkg install \
|
||||||
|
liblzma:x64-osx \
|
||||||
|
liblzma:arm64-osx \
|
||||||
|
libpng:x64-osx \
|
||||||
|
libpng:arm64-osx \
|
||||||
|
lzo:x64-osx \
|
||||||
|
lzo:arm64-osx \
|
||||||
|
zlib:x64-osx \
|
||||||
|
zlib:arm64-osx \
|
||||||
|
# EOF
|
||||||
|
|
||||||
|
- name: Install GCC problem matcher
|
||||||
|
uses: ammaraskar/gcc-problem-matcher@master
|
||||||
|
|
||||||
|
- name: Build tools
|
||||||
|
run: |
|
||||||
|
mkdir build-host
|
||||||
|
cd build-host
|
||||||
|
|
||||||
|
echo "::group::CMake"
|
||||||
|
cmake ${GITHUB_WORKSPACE} \
|
||||||
|
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||||
|
-DOPTION_TOOLS_ONLY=ON \
|
||||||
|
# EOF
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Build tools"
|
||||||
|
echo "Running on $(sysctl -n hw.logicalcpu) cores"
|
||||||
|
cmake --build . -j $(sysctl -n hw.logicalcpu) --target tools
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
- name: Import code signing certificates
|
||||||
|
uses: Apple-Actions/import-codesign-certs@v2
|
||||||
|
with:
|
||||||
|
# The certificates in a PKCS12 file encoded as a base64 string
|
||||||
|
p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }}
|
||||||
|
# The password used to import the PKCS12 file.
|
||||||
|
p12-password: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_PASSWORD }}
|
||||||
|
# If this is run on a fork, there may not be a certificate set up - continue in this case
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
- name: Build arm64
|
||||||
|
run: |
|
||||||
|
mkdir build-arm64
|
||||||
|
cd build-arm64
|
||||||
|
|
||||||
|
echo "::group::CMake"
|
||||||
|
cmake ${GITHUB_WORKSPACE} \
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES=arm64 \
|
||||||
|
-DVCPKG_TARGET_TRIPLET=arm64-osx \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=/usr/local/share/vcpkg/scripts/buildsystems/vcpkg.cmake \
|
||||||
|
-DHOST_BINARY_DIR=${GITHUB_WORKSPACE}/build-host \
|
||||||
|
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||||
|
# EOF
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Build"
|
||||||
|
echo "Running on $(sysctl -n hw.logicalcpu) cores"
|
||||||
|
cmake --build . -j $(sysctl -n hw.logicalcpu)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
- name: Build x64
|
||||||
|
run: |
|
||||||
|
mkdir build-x64
|
||||||
|
cd build-x64
|
||||||
|
|
||||||
|
echo "::group::CMake"
|
||||||
|
cmake ${GITHUB_WORKSPACE} \
|
||||||
|
-DCMAKE_OSX_ARCHITECTURES=x86_64 \
|
||||||
|
-DVCPKG_TARGET_TRIPLET=x64-osx \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=/usr/local/share/vcpkg/scripts/buildsystems/vcpkg.cmake \
|
||||||
|
-DHOST_BINARY_DIR=${GITHUB_WORKSPACE}/build-host \
|
||||||
|
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||||
|
-DCPACK_BUNDLE_APPLE_CERT_APP=${{ secrets.APPLE_DEVELOPER_CERTIFICATE_ID }} \
|
||||||
|
"-DCPACK_BUNDLE_APPLE_CODESIGN_PARAMETER=--deep -f --options runtime" \
|
||||||
|
-DAPPLE_UNIVERSAL_PACKAGE=1 \
|
||||||
|
# EOF
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Build"
|
||||||
|
echo "Running on $(sysctl -n hw.logicalcpu) cores"
|
||||||
|
cmake --build . -j $(sysctl -n hw.logicalcpu)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
- name: Create bundles
|
||||||
|
run: |
|
||||||
|
cd build-x64
|
||||||
|
|
||||||
|
echo "::group::Create universal binary"
|
||||||
|
# Combine the `openttd` binaries from each build into a single file
|
||||||
|
lipo -create -output openttd-universal ../build-*/openttd
|
||||||
|
mv openttd-universal openttd
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Run CPack"
|
||||||
|
cpack
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Cleanup"
|
||||||
|
# Remove the sha256 files CPack generates; we will do this ourself at
|
||||||
|
# the end of this workflow.
|
||||||
|
rm -f bundles/*.sha256
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
- name: Notarize
|
||||||
|
env:
|
||||||
|
AC_USERNAME: ${{ secrets.APPLE_DEVELOPER_APP_USERNAME }}
|
||||||
|
AC_PASSWORD: ${{ secrets.APPLE_DEVELOPER_APP_PASSWORD }}
|
||||||
|
AC_TEAM_ID: ${{ secrets.APPLE_DEVELOPER_TEAM_ID }}
|
||||||
|
run: |
|
||||||
|
if [ -z "${AC_USERNAME}" ]; then
|
||||||
|
# We may be running on a fork that doesn't have notarization secrets set up; skip this step
|
||||||
|
echo No notarization secrets set up, skipping.
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
xcrun notarytool store-credentials --apple-id "${AC_USERNAME}" --password "${AC_PASSWORD}" --team-id "${AC_TEAM_ID}" openttd
|
||||||
|
cd build-x64
|
||||||
|
../os/macosx/notarize.sh
|
||||||
|
|
||||||
|
- name: Build zip
|
||||||
|
run: |
|
||||||
|
cd build-x64
|
||||||
|
|
||||||
|
pushd _CPack_Packages/*/Bundle/openttd-*/
|
||||||
|
|
||||||
|
# Remove the Applications symlink from the staging folder
|
||||||
|
rm -f Applications
|
||||||
|
|
||||||
|
# Remove the original dmg built by CPack to avoid a conflict when resolving
|
||||||
|
# the zip_filename variable below
|
||||||
|
rm -f ../*.dmg
|
||||||
|
|
||||||
|
zip_filename=(../openttd-*)
|
||||||
|
|
||||||
|
# Package up the existing, notarised .app into a zip file
|
||||||
|
zip -r -9 ${zip_filename}.zip OpenTTD.app
|
||||||
|
|
||||||
|
popd
|
||||||
|
|
||||||
|
# Now move it into place to be uploaded
|
||||||
|
mv _CPack_Packages/*/Bundle/openttd-*.zip bundles/
|
||||||
|
|
||||||
|
- name: Store bundles
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-macos-universal
|
||||||
|
path: build-x64/bundles
|
||||||
|
retention-days: 5
|
186
.github/workflows/release-source.yml
vendored
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
name: Release (Source)
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
outputs:
|
||||||
|
version:
|
||||||
|
value: ${{ jobs.source.outputs.version }}
|
||||||
|
is_tag:
|
||||||
|
value: ${{ jobs.source.outputs.is_tag }}
|
||||||
|
trigger_type:
|
||||||
|
value: ${{ jobs.source.outputs.trigger_type }}
|
||||||
|
folder:
|
||||||
|
value: ${{ jobs.source.outputs.folder }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
source:
|
||||||
|
name: Source
|
||||||
|
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
version: ${{ steps.metadata.outputs.version }}
|
||||||
|
is_tag: ${{ steps.metadata.outputs.is_tag }}
|
||||||
|
trigger_type: ${{ steps.metadata.outputs.trigger_type }}
|
||||||
|
folder: ${{ steps.metadata.outputs.folder }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout (Release)
|
||||||
|
if: github.event_name == 'release'
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
# We generate a changelog; for this we need the full git log.
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Checkout (Manual)
|
||||||
|
if: github.event_name == 'workflow_dispatch'
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ref: ${{ github.event.inputs.ref }}
|
||||||
|
# We generate a changelog; for this we need the full git log.
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Checkout (Trigger)
|
||||||
|
if: github.event_name == 'repository_dispatch'
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ref: ${{ github.event.client_payload.ref }}
|
||||||
|
# We generate a changelog; for this we need the full git log.
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Check valid branch name
|
||||||
|
run: |
|
||||||
|
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
||||||
|
REF="${{ github.event.inputs.ref }}"
|
||||||
|
elif [ "${{ github.event_name }}" = "repository_dispatch" ]; then
|
||||||
|
REF="${{ github.event.client_payload.ref }}"
|
||||||
|
else
|
||||||
|
REF="${{ github.ref }}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if we are a tag.
|
||||||
|
if [ -n "$(git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || false)" ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if the checkout caused the branch to be named.
|
||||||
|
if [ "$(git rev-parse --abbrev-ref HEAD)" != "HEAD" ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if this was a pull request.
|
||||||
|
if [ -n "$(echo ${REF} | grep '^refs/pull/[0-9]*')" ]; then
|
||||||
|
PULL=$(echo ${REF} | cut -d/ -f3)
|
||||||
|
git checkout -b pr${PULL}
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Are we still in a detached state? Error out.
|
||||||
|
if [ "$(git rev-parse --abbrev-ref HEAD)" == "HEAD" ]; then
|
||||||
|
echo "The 'ref' given resulted in a checkout of a detached HEAD."
|
||||||
|
echo "We cannot detect the version for these checkout accurate."
|
||||||
|
echo ""
|
||||||
|
echo "If you want to build a Pull Request, make sure you use 'refs/pull/NNN/head'."
|
||||||
|
echo ""
|
||||||
|
echo "Cancelling build, as without a version we cannot store the artifacts."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Generate metadata
|
||||||
|
id: metadata
|
||||||
|
run: |
|
||||||
|
echo "::group::Prepare metadata files"
|
||||||
|
cmake -DGENERATE_OTTDREV=1 -P cmake/scripts/FindVersion.cmake
|
||||||
|
./.github/changelog.sh > .changelog
|
||||||
|
TZ='UTC' date +"%Y-%m-%d %H:%M UTC" > .release_date
|
||||||
|
cat .ottdrev | cut -f 1 -d$'\t' > .version
|
||||||
|
|
||||||
|
if [ $(cat .ottdrev | cut -f 5 -d$'\t') = '1' ]; then
|
||||||
|
# Assume that all tags are always releases. Why else make a tag?
|
||||||
|
IS_TAG="true"
|
||||||
|
|
||||||
|
FOLDER="${{ env.FOLDER_RELEASES }}"
|
||||||
|
TRIGGER_TYPE="new-tag"
|
||||||
|
else
|
||||||
|
IS_TAG="false"
|
||||||
|
|
||||||
|
BRANCH=$(git symbolic-ref -q HEAD | sed 's@.*/@@')
|
||||||
|
if [ -z "${BRANCH}" ]; then
|
||||||
|
echo "Internal error: branch name is empty."
|
||||||
|
echo "An earlier step should have prevented this from happening."
|
||||||
|
echo "Cancelling build, as without a branch name we cannot store the artifacts"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${BRANCH}" = "${{ env.NIGHTLIES_BRANCH }}" ]; then
|
||||||
|
# The "master" branch is special, and we call a nightly.
|
||||||
|
FOLDER="${{ env.FOLDER_NIGHTLIES }}/$(date +%Y)"
|
||||||
|
TRIGGER_TYPE="new-master"
|
||||||
|
else
|
||||||
|
# All other branches, which can be builds of Pull Requests, are
|
||||||
|
# put in their own folder.
|
||||||
|
FOLDER="${{ env.FOLDER_BRANCHES }}/${BRANCH}"
|
||||||
|
TRIGGER_TYPE="new-branch"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p build/bundles
|
||||||
|
cp .changelog build/bundles/changelog.txt
|
||||||
|
cp .release_date build/bundles/released.txt
|
||||||
|
cp README.md build/bundles/README.md
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "Release Date: $(cat .release_date)"
|
||||||
|
echo "Revision: $(cat .ottdrev)"
|
||||||
|
echo "Version: $(cat .version)"
|
||||||
|
echo "Is tag: ${IS_TAG}"
|
||||||
|
echo "Folder on CDN: ${FOLDER}"
|
||||||
|
echo "Workflow trigger: ${TRIGGER_TYPE}"
|
||||||
|
|
||||||
|
echo "version=$(cat .version)" >> $GITHUB_OUTPUT
|
||||||
|
echo "is_tag=${IS_TAG}" >> $GITHUB_OUTPUT
|
||||||
|
echo "folder=${FOLDER}" >> $GITHUB_OUTPUT
|
||||||
|
echo "trigger_type=${TRIGGER_TYPE}" >> $GITHUB_OUTPUT
|
||||||
|
env:
|
||||||
|
NIGHTLIES_BRANCH: master
|
||||||
|
FOLDER_RELEASES: openttd-releases
|
||||||
|
FOLDER_NIGHTLIES: openttd-nightlies
|
||||||
|
FOLDER_BRANCHES: openttd-branches
|
||||||
|
|
||||||
|
- name: Remove VCS information
|
||||||
|
run: |
|
||||||
|
rm -rf .git
|
||||||
|
|
||||||
|
- name: Create bundles
|
||||||
|
run: |
|
||||||
|
FOLDER_NAME=openttd-${{ steps.metadata.outputs.version }}
|
||||||
|
|
||||||
|
# Rename the folder to openttd-NNN
|
||||||
|
mkdir ${FOLDER_NAME}
|
||||||
|
find . -maxdepth 1 -not -name . -not -name build -not -name ${FOLDER_NAME} -exec mv {} ${FOLDER_NAME}/ \;
|
||||||
|
|
||||||
|
echo "::group::Create tarball (xz) bundle"
|
||||||
|
tar --xz -cvf build/bundles/${FOLDER_NAME}-source.tar.xz ${FOLDER_NAME}
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
# This tarball is only to be used within this workflow.
|
||||||
|
echo "::group::Create tarball (gz) bundle"
|
||||||
|
tar --gzip -cvf source.tar.gz ${FOLDER_NAME}
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Create zip bundle"
|
||||||
|
zip -9 -r build/bundles/${FOLDER_NAME}-source.zip ${FOLDER_NAME}
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
- name: Store bundles
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-source
|
||||||
|
path: build/bundles/*
|
||||||
|
retention-days: 5
|
||||||
|
|
||||||
|
- name: Store source (for other jobs)
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: internal-source
|
||||||
|
path: source.tar.gz
|
||||||
|
retention-days: 1
|
192
.github/workflows/release-windows-store.yml
vendored
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
name: Release (Windows Store)
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
windows-store:
|
||||||
|
name: Windows Store
|
||||||
|
|
||||||
|
runs-on: windows-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Download source
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: internal-source
|
||||||
|
|
||||||
|
- name: Unpack source
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
tar -xf source.tar.gz --strip-components=1
|
||||||
|
|
||||||
|
- name: Download x86 build
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-windows-x86
|
||||||
|
|
||||||
|
- name: Download x64 build
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-windows-x64
|
||||||
|
|
||||||
|
- name: Download arm64 build
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-windows-arm64
|
||||||
|
|
||||||
|
- name: Unpack builds
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir builds
|
||||||
|
cd builds
|
||||||
|
|
||||||
|
function extract {
|
||||||
|
mkdir $1
|
||||||
|
|
||||||
|
# Extract the zip version of the release
|
||||||
|
unzip ../openttd-*-windows-$2.zip -d $1
|
||||||
|
|
||||||
|
# Remove the extraneous directory
|
||||||
|
mv $1/openttd-*-windows-$2/* $1/
|
||||||
|
rmdir $1/openttd-*-windows-$2
|
||||||
|
|
||||||
|
# Move the openttd.exe to the '{arch}-binaries' folder
|
||||||
|
mkdir $1-binaries
|
||||||
|
mv $1/openttd.exe $1-binaries/
|
||||||
|
}
|
||||||
|
|
||||||
|
extract x86 win32
|
||||||
|
extract x64 win64
|
||||||
|
extract arm64 arm64
|
||||||
|
|
||||||
|
# Use the "x86" folder as the source of the common binaries (lang files, etc) and remove the others
|
||||||
|
mv x86 common-binaries
|
||||||
|
rm -rf x64 arm64
|
||||||
|
|
||||||
|
- name: Install OpenGFX
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p builds/common-binaries/baseset
|
||||||
|
cd builds/common-binaries/baseset
|
||||||
|
|
||||||
|
echo "::group::Download OpenGFX"
|
||||||
|
curl -L https://cdn.openttd.org/opengfx-releases/7.1/opengfx-7.1-all.zip -o opengfx-all.zip
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Unpack OpenGFX"
|
||||||
|
unzip opengfx-all.zip
|
||||||
|
tar xf opengfx-*.tar
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
rm -f opengfx-all.zip opengfx-*.tar
|
||||||
|
|
||||||
|
- name: Install OpenMSX
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p builds/common-binaries/baseset
|
||||||
|
cd builds/common-binaries/baseset
|
||||||
|
|
||||||
|
echo "::group::Download OpenMSX"
|
||||||
|
curl -L https://cdn.openttd.org/openmsx-releases/0.4.2/openmsx-0.4.2-all.zip -o openmsx-all.zip
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Unpack OpenGFX"
|
||||||
|
unzip openmsx-all.zip
|
||||||
|
tar xf openmsx-*.tar
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
rm -f openmsx-all.zip openmsx-*.tar
|
||||||
|
|
||||||
|
- name: Install OpenSFX
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p builds/common-binaries/baseset/opensfx
|
||||||
|
cd builds/common-binaries/baseset/opensfx
|
||||||
|
|
||||||
|
echo "::group::Download OpenSFX"
|
||||||
|
curl -L https://cdn.openttd.org/opensfx-releases/1.0.3/opensfx-1.0.3-all.zip -o opensfx-all.zip
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Unpack OpenSFX"
|
||||||
|
unzip opensfx-all.zip
|
||||||
|
tar xf opensfx-*.tar
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
rm -f opensfx-all.zip opensfx-*.tar
|
||||||
|
|
||||||
|
- name: Generate signing certificate
|
||||||
|
shell: cmd
|
||||||
|
run: |
|
||||||
|
cd builds
|
||||||
|
|
||||||
|
REM We need to provide a signed .appx to the Windows Store, so generate a certificate with password 'password'
|
||||||
|
call ..\os\windows\winstore\generate-key.bat "CN=78024DA8-4BE4-4C77-B12E-547BBF7359D2" password cert.pfx
|
||||||
|
|
||||||
|
- name: Generate assets
|
||||||
|
shell: cmd
|
||||||
|
run: |
|
||||||
|
cd os\windows\winstore
|
||||||
|
call generate-assets.bat
|
||||||
|
|
||||||
|
- name: Prepare manifests
|
||||||
|
shell: cmd
|
||||||
|
run: |
|
||||||
|
cd builds
|
||||||
|
mkdir manifests
|
||||||
|
|
||||||
|
REM Set the version environment variable
|
||||||
|
call ..\os\windows\winstore\set-version.bat x86-binaries\openttd.exe
|
||||||
|
|
||||||
|
call ..\os\windows\winstore\prepare-manifests.bat manifests "CN=78024DA8-4BE4-4C77-B12E-547BBF7359D2" "57420OpenTTDDevelopers.OpenTTDofficial"
|
||||||
|
|
||||||
|
- name: Prepare binaries
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cd builds
|
||||||
|
|
||||||
|
# Copy the Windows Store assets
|
||||||
|
mkdir common-binaries/Assets
|
||||||
|
cp -R ../os/windows/winstore/assets-common/* common-binaries/Assets/
|
||||||
|
|
||||||
|
mkdir Assets
|
||||||
|
cp -R ../os/windows/winstore/assets/* Assets/
|
||||||
|
|
||||||
|
cp manifests/*.xml .
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
shell: cmd
|
||||||
|
run: |
|
||||||
|
REM Add the Windows SDK tools to the PATH
|
||||||
|
|
||||||
|
echo|set /p="SET VS_INSTALLDIR=" > _vspath.bat
|
||||||
|
vswhere -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath >> _vspath.bat
|
||||||
|
call _vspath.bat
|
||||||
|
call "%VS_INSTALLDIR%\Common7\Tools\VsDevCmd.bat"
|
||||||
|
|
||||||
|
REM Set the version environment variable
|
||||||
|
call os\windows\winstore\set-version.bat builds\x86-binaries\openttd.exe
|
||||||
|
|
||||||
|
cd builds
|
||||||
|
mkdir output
|
||||||
|
|
||||||
|
REM Build and sign the package
|
||||||
|
makeappx build /v /f PackagingLayout.xml /op output\ /bv %OTTD_VERSION% /pv %OTTD_VERSION% /ca
|
||||||
|
SignTool sign /fd sha256 /a /f cert.pfx /p password "output\OpenTTD.appxbundle"
|
||||||
|
|
||||||
|
REM Move resulting files to bundles folder
|
||||||
|
mkdir bundles
|
||||||
|
mkdir bundles\internal
|
||||||
|
move cert.pfx bundles\internal\openttd-${{ inputs.version }}-windows-store.pfx
|
||||||
|
move output\OpenTTD.appxbundle bundles\internal\openttd-${{ inputs.version }}-windows-store.appxbundle
|
||||||
|
|
||||||
|
- name: Store bundles
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-windows-store
|
||||||
|
path: builds/bundles
|
||||||
|
retention-days: 5
|
201
.github/workflows/release-windows.yml
vendored
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
name: Release (Windows)
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
is_tag:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
windows:
|
||||||
|
name: Windows
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- arch: x86
|
||||||
|
host: x86
|
||||||
|
- arch: x64
|
||||||
|
host: x64
|
||||||
|
- arch: arm64
|
||||||
|
host: x64_arm64
|
||||||
|
|
||||||
|
runs-on: windows-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Download source
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: internal-source
|
||||||
|
|
||||||
|
- name: Unpack source
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
tar -xf source.tar.gz --strip-components=1
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
choco install pandoc
|
||||||
|
|
||||||
|
- name: Prepare cache key
|
||||||
|
id: key
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
# Work around caching failure with GNU tar
|
||||||
|
New-Item -Type Junction -Path vcpkg -Target c:\vcpkg
|
||||||
|
|
||||||
|
Write-Output "image=$env:ImageOS-$env:ImageVersion" >> $env:GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Enable vcpkg cache
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: vcpkg/installed
|
||||||
|
key: ${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}-0 # Increase the number whenever dependencies are modified
|
||||||
|
restore-keys: |
|
||||||
|
${{ steps.key.outputs.image }}-vcpkg-${{ matrix.arch }}
|
||||||
|
|
||||||
|
- name: Prepare vcpkg
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
vcpkg install --triplet=${{ matrix.arch }}-windows-static \
|
||||||
|
liblzma \
|
||||||
|
libpng \
|
||||||
|
lzo \
|
||||||
|
zlib \
|
||||||
|
# EOF
|
||||||
|
|
||||||
|
- name: Install MSVC problem matcher
|
||||||
|
uses: ammaraskar/msvc-problem-matcher@master
|
||||||
|
|
||||||
|
- name: Configure developer command prompt for tools
|
||||||
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
|
with:
|
||||||
|
arch: x64
|
||||||
|
|
||||||
|
- name: Build tools
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir build-host
|
||||||
|
cd build-host
|
||||||
|
|
||||||
|
echo "::group::CMake"
|
||||||
|
cmake ${GITHUB_WORKSPACE} \
|
||||||
|
-GNinja \
|
||||||
|
-DOPTION_TOOLS_ONLY=ON \
|
||||||
|
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||||
|
# EOF
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Build"
|
||||||
|
cmake --build . --target tools
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
- name: Configure developer command prompt for ${{ matrix.arch }}
|
||||||
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
|
with:
|
||||||
|
arch: ${{ matrix.host }}
|
||||||
|
|
||||||
|
- name: Import code signing certificate
|
||||||
|
shell: powershell
|
||||||
|
# If this is run on a fork, there may not be a certificate set up - continue in this case
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
$tempFile = [System.IO.Path]::GetTempFileName()
|
||||||
|
$bytes = [System.Convert]::FromBase64String($env:WINDOWS_CERTIFICATE_P12)
|
||||||
|
[IO.File]::WriteAllBytes($tempFile, $bytes)
|
||||||
|
$pwd = ConvertTo-SecureString $env:WINDOWS_CERTIFICATE_PASSWORD -AsPlainText -Force
|
||||||
|
Import-PfxCertificate -FilePath $tempFile -CertStoreLocation Cert:\CurrentUser\My -Password $pwd
|
||||||
|
Remove-Item $tempFile
|
||||||
|
env:
|
||||||
|
WINDOWS_CERTIFICATE_P12: ${{ secrets.WINDOWS_CERTIFICATE_P12 }}
|
||||||
|
WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Build (with installer)
|
||||||
|
if: inputs.is_tag == 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
|
||||||
|
echo "::group::CMake"
|
||||||
|
cmake ${GITHUB_WORKSPACE} \
|
||||||
|
-GNinja \
|
||||||
|
-DVCPKG_TARGET_TRIPLET=${{ matrix.arch }}-windows-static \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE="c:\vcpkg\scripts\buildsystems\vcpkg.cmake" \
|
||||||
|
-DOPTION_USE_NSIS=ON \
|
||||||
|
-DHOST_BINARY_DIR=${GITHUB_WORKSPACE}/build-host \
|
||||||
|
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||||
|
-DWINDOWS_CERTIFICATE_COMMON_NAME="${WINDOWS_CERTIFICATE_COMMON_NAME}" \
|
||||||
|
# EOF
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Build"
|
||||||
|
cmake --build .
|
||||||
|
echo "::endgroup::"
|
||||||
|
env:
|
||||||
|
WINDOWS_CERTIFICATE_COMMON_NAME: ${{ secrets.WINDOWS_CERTIFICATE_COMMON_NAME }}
|
||||||
|
|
||||||
|
- name: Build (without installer)
|
||||||
|
if: inputs.is_tag != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
|
||||||
|
echo "::group::CMake"
|
||||||
|
cmake ${GITHUB_WORKSPACE} \
|
||||||
|
-GNinja \
|
||||||
|
-DVCPKG_TARGET_TRIPLET=${{ matrix.arch }}-windows-static \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE="c:\vcpkg\scripts\buildsystems\vcpkg.cmake" \
|
||||||
|
-DHOST_BINARY_DIR=${GITHUB_WORKSPACE}/build-host \
|
||||||
|
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||||
|
-DWINDOWS_CERTIFICATE_COMMON_NAME="${WINDOWS_CERTIFICATE_COMMON_NAME}" \
|
||||||
|
# EOF
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Build"
|
||||||
|
cmake --build .
|
||||||
|
echo "::endgroup::"
|
||||||
|
env:
|
||||||
|
WINDOWS_CERTIFICATE_COMMON_NAME: ${{ secrets.WINDOWS_CERTIFICATE_COMMON_NAME }}
|
||||||
|
|
||||||
|
- name: Create bundles
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cd ${GITHUB_WORKSPACE}/build
|
||||||
|
echo "::group::Run CPack"
|
||||||
|
cpack
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Prepare PDB to be bundled"
|
||||||
|
PDB=$(ls bundles/*.zip | cut -d/ -f2 | sed 's/.zip$/.pdb/')
|
||||||
|
cp openttd.pdb bundles/${PDB}
|
||||||
|
xz -9 bundles/${PDB}
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Cleanup"
|
||||||
|
# Remove the sha256 files CPack generates; we will do this ourself at
|
||||||
|
# the end of this workflow.
|
||||||
|
rm -f bundles/*.sha256
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
- name: Sign installer
|
||||||
|
if: inputs.is_tag == 'true'
|
||||||
|
shell: bash
|
||||||
|
# If this is run on a fork, there may not be a certificate set up - continue in this case
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
cd ${GITHUB_WORKSPACE}/build/bundles
|
||||||
|
../../os/windows/sign.bat *.exe "${WINDOWS_CERTIFICATE_COMMON_NAME}"
|
||||||
|
env:
|
||||||
|
WINDOWS_CERTIFICATE_COMMON_NAME: ${{ secrets.WINDOWS_CERTIFICATE_COMMON_NAME }}
|
||||||
|
|
||||||
|
- name: Store bundles
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-windows-${{ matrix.arch }}
|
||||||
|
path: build/bundles
|
||||||
|
retention-days: 5
|
972
.github/workflows/release.yml
vendored
18
.github/workflows/unused-strings.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
name: Unused strings
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
unused-strings:
|
||||||
|
name: Unused strings
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Check for unused strings
|
||||||
|
run: |
|
||||||
|
set -ex
|
||||||
|
python3 .github/unused-strings.py
|
103
.github/workflows/upload-cdn.yml
vendored
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
name: Upload (CDN)
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
folder:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
trigger_type:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
prepare:
|
||||||
|
name: Prepare
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Download all bundles
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
|
||||||
|
- name: Calculate checksums
|
||||||
|
run: |
|
||||||
|
echo "::group::Move bundles to a single folder"
|
||||||
|
mkdir bundles
|
||||||
|
mv openttd-*/* bundles/
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
cd bundles
|
||||||
|
for i in $(ls openttd-*); do
|
||||||
|
echo "::group::Calculating checksums for ${i}"
|
||||||
|
openssl dgst -r -md5 -hex $i > $i.md5sum
|
||||||
|
openssl dgst -r -sha1 -hex $i > $i.sha1sum
|
||||||
|
openssl dgst -r -sha256 -hex $i > $i.sha256sum
|
||||||
|
echo "::endgroup::"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Some targets generate files that are meant for our-eyes-only.
|
||||||
|
# They are stored in the "internal" folder, and contains bundles
|
||||||
|
# for targets like Windows Store. No user has a benefit of knowing
|
||||||
|
# they exist, hence: internal.
|
||||||
|
if [ -e internal ]; then
|
||||||
|
cd internal
|
||||||
|
for i in $(ls openttd-*); do
|
||||||
|
echo "::group::Calculating checksums for ${i}"
|
||||||
|
openssl dgst -r -md5 -hex $i > $i.md5sum
|
||||||
|
openssl dgst -r -sha1 -hex $i > $i.sha1sum
|
||||||
|
openssl dgst -r -sha256 -hex $i > $i.sha256sum
|
||||||
|
echo "::endgroup::"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Store bundles
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: cdn-bundles
|
||||||
|
path: bundles/*
|
||||||
|
retention-days: 5
|
||||||
|
|
||||||
|
publish:
|
||||||
|
needs:
|
||||||
|
- prepare
|
||||||
|
|
||||||
|
name: Publish
|
||||||
|
uses: OpenTTD/actions/.github/workflows/rw-cdn-upload.yml@v4
|
||||||
|
secrets:
|
||||||
|
CDN_SIGNING_KEY: ${{ secrets.CDN_SIGNING_KEY }}
|
||||||
|
DEPLOYMENT_APP_ID: ${{ secrets.DEPLOYMENT_APP_ID }}
|
||||||
|
DEPLOYMENT_APP_PRIVATE_KEY: ${{ secrets.DEPLOYMENT_APP_PRIVATE_KEY }}
|
||||||
|
with:
|
||||||
|
artifact-name: cdn-bundles
|
||||||
|
folder: ${{ inputs.folder }}
|
||||||
|
version: ${{ inputs.version }}
|
||||||
|
|
||||||
|
docs:
|
||||||
|
if: ${{ inputs.trigger_type == 'new-master' }}
|
||||||
|
needs:
|
||||||
|
- publish
|
||||||
|
|
||||||
|
name: Publish docs
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Generate access token
|
||||||
|
id: generate_token
|
||||||
|
uses: tibdex/github-app-token@v1
|
||||||
|
with:
|
||||||
|
app_id: ${{ secrets.DEPLOYMENT_APP_ID }}
|
||||||
|
private_key: ${{ secrets.DEPLOYMENT_APP_PRIVATE_KEY }}
|
||||||
|
repository: OpenTTD/workflows
|
||||||
|
|
||||||
|
- name: Trigger 'Publish Docs'
|
||||||
|
uses: peter-evans/repository-dispatch@v2
|
||||||
|
with:
|
||||||
|
token: ${{ steps.generate_token.outputs.token }}
|
||||||
|
repository: OpenTTD/workflows
|
||||||
|
event-type: publish-docs
|
||||||
|
client-payload: '{"version": "${{ inputs.version }}", "folder": "${{ inputs.folder }}"}'
|
151
.github/workflows/upload-gog.yml
vendored
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
name: Upload (GOG)
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
upload:
|
||||||
|
name: Upload (GOG)
|
||||||
|
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Download source
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: internal-source
|
||||||
|
path: internal-source
|
||||||
|
|
||||||
|
- name: Download bundle (Windows x86)
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-windows-x86
|
||||||
|
path: openttd-windows-x86
|
||||||
|
|
||||||
|
- name: Download bundle (Windows x64)
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-windows-x64
|
||||||
|
path: openttd-windows-x64
|
||||||
|
|
||||||
|
- name: Download bundle (MacOS)
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-macos-universal
|
||||||
|
path: openttd-macos-universal
|
||||||
|
|
||||||
|
- name: Download bundle (Linux)
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-linux-generic
|
||||||
|
path: openttd-linux-generic
|
||||||
|
|
||||||
|
- name: Install GOG Galaxy Build Creator
|
||||||
|
run: |
|
||||||
|
wget https://cdn.gog.com/open/galaxy/pipeline/build_creator/gnu-linux/GOGGalaxyBuildCreator-1.4.0.AppImage
|
||||||
|
7z x GOGGalaxyBuildCreator-1.4.0.AppImage
|
||||||
|
chmod +x ./app/GOGGalaxyPipelineBuilder
|
||||||
|
|
||||||
|
- name: Install OpenGFX
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p gog/opengfx/baseset
|
||||||
|
cd gog/opengfx/baseset
|
||||||
|
|
||||||
|
echo "::group::Download OpenGFX"
|
||||||
|
curl -L https://cdn.openttd.org/opengfx-releases/7.1/opengfx-7.1-all.zip -o opengfx-all.zip
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Unpack OpenGFX"
|
||||||
|
unzip opengfx-all.zip
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
rm -f opengfx-all.zip
|
||||||
|
|
||||||
|
- name: Install OpenMSX
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p gog/openmsx/baseset
|
||||||
|
cd gog/openmsx/baseset
|
||||||
|
|
||||||
|
echo "::group::Download OpenMSX"
|
||||||
|
curl -L https://cdn.openttd.org/openmsx-releases/0.4.2/openmsx-0.4.2-all.zip -o openmsx-all.zip
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Unpack OpenGFX"
|
||||||
|
unzip openmsx-all.zip
|
||||||
|
tar xf openmsx-*.tar
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
rm -f openmsx-all.zip openmsx-*.tar
|
||||||
|
|
||||||
|
- name: Install OpenSFX
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p gog/opensfx/baseset
|
||||||
|
cd gog/opensfx/baseset
|
||||||
|
|
||||||
|
echo "::group::Download OpenSFX"
|
||||||
|
curl -L https://cdn.openttd.org/opensfx-releases/1.0.3/opensfx-1.0.3-all.zip -o opensfx-all.zip
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Unpack OpenSFX"
|
||||||
|
unzip opensfx-all.zip
|
||||||
|
tar xf opensfx-*.tar
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
rm -f opensfx-all.zip opensfx-*.tar
|
||||||
|
|
||||||
|
- name: Upload to GOG
|
||||||
|
run: |
|
||||||
|
echo "::group::Extracting source"
|
||||||
|
mkdir source
|
||||||
|
(
|
||||||
|
cd source
|
||||||
|
tar -xf ../internal-source/source.tar.gz --strip-components=1
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
(
|
||||||
|
cd gog
|
||||||
|
|
||||||
|
echo "::group::Prepare Win32"
|
||||||
|
unzip ../openttd-windows-x86/openttd-*-windows-win32.zip
|
||||||
|
mv openttd-*-windows-win32 win32
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Prepare Win64"
|
||||||
|
unzip ../openttd-windows-x64/openttd-*-windows-win64.zip
|
||||||
|
mv openttd-*-windows-win64 win64
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Prepare macOS"
|
||||||
|
mkdir macos
|
||||||
|
(
|
||||||
|
cd macos
|
||||||
|
unzip ../../openttd-macos-universal/openttd-*-macos-universal.zip
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Prepare Linux"
|
||||||
|
tar xvf ../openttd-linux-generic/openttd-*-linux-generic-amd64.tar.xz
|
||||||
|
mv openttd-*-linux-generic-amd64 linux
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Preparing build files"
|
||||||
|
cp ../source/os/gog/*.json .
|
||||||
|
for json in $(ls *.json); do
|
||||||
|
sed -i 's/VERSION/${{ inputs.version }}/g;s/CLIENT_ID/${{ secrets.GOG_CLIENT_ID }}/g;s/CLIENT_SECRET/${{ secrets.GOG_CLIENT_SECRET }}/g' ${json}
|
||||||
|
done
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Upload to GOG"
|
||||||
|
../app/GOGGalaxyPipelineBuilder build-game --username "${{ secrets.GOG_USERNAME }}" --password "${{ secrets.GOG_PASSWORD }}" --branch Testing windows.json
|
||||||
|
../app/GOGGalaxyPipelineBuilder build-game --username "${{ secrets.GOG_USERNAME }}" --password "${{ secrets.GOG_PASSWORD }}" --branch Testing macos.json
|
||||||
|
../app/GOGGalaxyPipelineBuilder build-game --username "${{ secrets.GOG_USERNAME }}" --password "${{ secrets.GOG_PASSWORD }}" --branch Testing linux.json
|
||||||
|
echo "::endgroup::"
|
||||||
|
)
|
109
.github/workflows/upload-steam.yml
vendored
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
name: Upload (Steam)
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
trigger_type:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
upload:
|
||||||
|
name: Upload (Steam)
|
||||||
|
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Download source
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: internal-source
|
||||||
|
path: internal-source
|
||||||
|
|
||||||
|
- name: Download bundle (Windows x86)
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-windows-x86
|
||||||
|
path: openttd-windows-x86
|
||||||
|
|
||||||
|
- name: Download bundle (Windows x64)
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-windows-x64
|
||||||
|
path: openttd-windows-x64
|
||||||
|
|
||||||
|
- name: Download bundle (MacOS)
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-macos-universal
|
||||||
|
path: openttd-macos-universal
|
||||||
|
|
||||||
|
- name: Download bundle (Linux)
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: openttd-linux-generic
|
||||||
|
path: openttd-linux-generic
|
||||||
|
|
||||||
|
- name: Setup steamcmd
|
||||||
|
uses: CyberAndrii/setup-steamcmd@v1
|
||||||
|
|
||||||
|
- name: Generate Steam auth code
|
||||||
|
id: steam-totp
|
||||||
|
uses: CyberAndrii/steam-totp@v1
|
||||||
|
with:
|
||||||
|
shared_secret: ${{ secrets.STEAM_SHARED_SECRET }}
|
||||||
|
|
||||||
|
- name: Upload to Steam
|
||||||
|
run: |
|
||||||
|
echo "::group::Extracting source"
|
||||||
|
mkdir source
|
||||||
|
(
|
||||||
|
cd source
|
||||||
|
tar -xf ../internal-source/source.tar.gz --strip-components=1
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
mkdir steam
|
||||||
|
(
|
||||||
|
cd steam
|
||||||
|
|
||||||
|
echo "::group::Prepare Win32"
|
||||||
|
unzip ../openttd-windows-x86/openttd-*-windows-win32.zip
|
||||||
|
mv openttd-*-windows-win32 steam-win32
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Prepare Win64"
|
||||||
|
unzip ../openttd-windows-x64/openttd-*-windows-win64.zip
|
||||||
|
mv openttd-*-windows-win64 steam-win64
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Prepare macOS"
|
||||||
|
mkdir steam-macos
|
||||||
|
(
|
||||||
|
cd steam-macos
|
||||||
|
unzip ../../openttd-macos-universal/openttd-*-macos-universal.zip
|
||||||
|
)
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Prepare Linux"
|
||||||
|
tar xvf ../openttd-linux-generic/openttd-*-linux-generic-amd64.tar.xz
|
||||||
|
mv openttd-*-linux-generic-amd64 steam-linux
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Preparing build file"
|
||||||
|
if [ "${{ inputs.trigger_type }}" = "new-tag" ]; then
|
||||||
|
BRANCH="testing"
|
||||||
|
else
|
||||||
|
BRANCH="nightly"
|
||||||
|
fi
|
||||||
|
cat ../source/os/steam/release.vdf | sed 's/@@DESCRIPTION@@/openttd-${{ inputs.version }}/;s/@@BRANCH@@/'${BRANCH}'/' > release.vdf
|
||||||
|
cat release.vdf
|
||||||
|
echo "::endgroup::"
|
||||||
|
|
||||||
|
echo "::group::Upload to Steam"
|
||||||
|
steamcmd +login ${{ secrets.STEAM_USERNAME }} ${{ secrets.STEAM_PASSWORD }} ${{ steps.steam-totp.outputs.code }} +run_app_build $(pwd)/release.vdf +quit
|
||||||
|
echo "::endgroup::"
|
||||||
|
)
|
@@ -5,7 +5,7 @@ if(NOT BINARY_NAME)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
project(${BINARY_NAME}
|
project(${BINARY_NAME}
|
||||||
VERSION 12.0
|
VERSION 13.4
|
||||||
)
|
)
|
||||||
|
|
||||||
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
|
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
|
||||||
@@ -22,7 +22,7 @@ if (EMSCRIPTEN)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
|
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
|
||||||
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.14)
|
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.13)
|
||||||
|
|
||||||
# Use GNUInstallDirs to allow customisation
|
# Use GNUInstallDirs to allow customisation
|
||||||
# but set our own default data and bin dir
|
# but set our own default data and bin dir
|
||||||
@@ -280,6 +280,8 @@ if(NOT OPTION_DEDICATED)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
include(CheckAtomic)
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
link_package(Iconv TARGET Iconv::Iconv)
|
link_package(Iconv TARGET Iconv::Iconv)
|
||||||
|
|
||||||
@@ -305,7 +307,7 @@ if(EMSCRIPTEN)
|
|||||||
add_definitions(-s DISABLE_EXCEPTION_CATCHING=0)
|
add_definitions(-s DISABLE_EXCEPTION_CATCHING=0)
|
||||||
|
|
||||||
# Export functions to Javascript.
|
# Export functions to Javascript.
|
||||||
target_link_libraries(WASM::WASM INTERFACE "-s EXPORTED_FUNCTIONS='[\"_main\", \"_em_openttd_add_server\"]' -s EXTRA_EXPORTED_RUNTIME_METHODS='[\"cwrap\"]'")
|
target_link_libraries(WASM::WASM INTERFACE "-s EXPORTED_FUNCTIONS='[\"_main\", \"_em_openttd_add_server\"]' -s EXPORTED_RUNTIME_METHODS='[\"cwrap\"]'")
|
||||||
|
|
||||||
# Preload all the files we generate during build.
|
# Preload all the files we generate during build.
|
||||||
# As we do not compile with FreeType / FontConfig, we also have no way to
|
# As we do not compile with FreeType / FontConfig, we also have no way to
|
||||||
|
@@ -69,7 +69,7 @@ that comes with vcpkg. After that, you can run something similar to this:
|
|||||||
```powershell
|
```powershell
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
cmake.exe .. -G'Visual Studio 16 2019' -DCMAKE_TOOLCHAIN_FILE="<location of vcpkg>\vcpkg\scripts\buildsystems\vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="x64-windows-static"
|
cmake.exe .. -G"Visual Studio 16 2019" -DCMAKE_TOOLCHAIN_FILE="<location of vcpkg>\vcpkg\scripts\buildsystems\vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="x64-windows-static"
|
||||||
```
|
```
|
||||||
|
|
||||||
Change `<location of vcpkg>` to where you have installed vcpkg. After this
|
Change `<location of vcpkg>` to where you have installed vcpkg. After this
|
||||||
|
@@ -94,8 +94,8 @@ Although we really appreciate feedback and ideas, we will close feature requests
|
|||||||
|
|
||||||
Many of those ideas etc do have a place on the [forums](https://www.tt-forums.net); and if enough people like it, someone will stand up and make it.
|
Many of those ideas etc do have a place on the [forums](https://www.tt-forums.net); and if enough people like it, someone will stand up and make it.
|
||||||
|
|
||||||
It's usually best discuss in [irc](https://wiki.openttd.org/en/Development/IRC%20channel) before opening a feature request or working on a large feature in a fork.
|
It's usually best to discuss on [Discord](https://discord.gg/openttd) before opening a feature request or working on a large feature in a fork.
|
||||||
Discussion in irc can take time, but it can be productive and avoid disappointment :)
|
Discussion can take time, but it can be productive and avoid disappointment. :)
|
||||||
|
|
||||||
|
|
||||||
## Pull requests
|
## Pull requests
|
||||||
@@ -137,7 +137,7 @@ git checkout upstream/master -b <topic-branch-name>
|
|||||||
```
|
```
|
||||||
|
|
||||||
4. Commit your changes in logical chunks. Please adhere to these [git commit message guidelines](https://wiki.openttd.org/en/Development/Coding%20style#commit-message) or your code is unlikely to be merged into the main project.
|
4. Commit your changes in logical chunks. Please adhere to these [git commit message guidelines](https://wiki.openttd.org/en/Development/Coding%20style#commit-message) or your code is unlikely to be merged into the main project.
|
||||||
Use Git's [interactive rebase](https://help.github.com/articles/interactive-rebase) feature to tidy up your commits before making them public.
|
Use Git's [interactive rebase](https://docs.github.com/en/get-started/using-git/about-git-rebase) feature to tidy up your commits before making them public.
|
||||||
|
|
||||||
5. Locally rebase the upstream development branch into your topic branch:
|
5. Locally rebase the upstream development branch into your topic branch:
|
||||||
|
|
||||||
@@ -212,8 +212,8 @@ When it comes to gameplay features there are at least these groups of interests:
|
|||||||
- *Control freak:* micromanagement like conditional orders, refitting and loading etc.
|
- *Control freak:* micromanagement like conditional orders, refitting and loading etc.
|
||||||
- *Casual:* automatisation like cargodist, path based signalling etc.
|
- *Casual:* automatisation like cargodist, path based signalling etc.
|
||||||
|
|
||||||
To please everyone, the official branch tries to stay close to the original gameplay; after all, that is what everyone brought here.
|
To please everyone, the official branch tries to stay close to the original gameplay; after all, that is what brought everyone here.
|
||||||
The preferred method to alter and extent the gameplay is via add-ons like NewGRF and GameScripts.
|
The preferred method to alter and extend the gameplay is via add-ons like NewGRF and GameScripts.
|
||||||
|
|
||||||
For a long time, the official branch was also open to features which could be enabled/disabled, but the corner-cases that came with some configurations have rendered some parts of the code very complicated.
|
For a long time, the official branch was also open to features which could be enabled/disabled, but the corner-cases that came with some configurations have rendered some parts of the code very complicated.
|
||||||
Today, new features have to work with all the already existing features, which is not only challenging in corner cases, but also requires spending considerable more work than just "making it work in the game mode that I play".
|
Today, new features have to work with all the already existing features, which is not only challenging in corner cases, but also requires spending considerable more work than just "making it work in the game mode that I play".
|
||||||
@@ -265,5 +265,5 @@ If you would not like to accept this risk, please do either commit anonymously o
|
|||||||
|
|
||||||
### Attribution of this Contributing Guide
|
### Attribution of this Contributing Guide
|
||||||
|
|
||||||
This contributing guide is adapted from [Bootstrap](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md) under the [Creative Commons Attribution 3.0 Unported License](https://github.com/twbs/bootstrap/blob/master/docs/LICENSE) terms for Bootstrap documentation.
|
This contributing guide is adapted from [Bootstrap](https://github.com/twbs/bootstrap/blob/main/.github/CONTRIBUTING.md) under the [Creative Commons Attribution 3.0 Unported License](https://creativecommons.org/licenses/by/3.0/) terms for Bootstrap documentation.
|
||||||
The GDPR notice is adapted from [rsyslog](https://github.com/rsyslog/rsyslog/blob/master/CONTRIBUTING.md) under the [GNU General Public License](https://github.com/rsyslog/rsyslog/blob/master/COPYING).
|
The GDPR notice is adapted from [rsyslog](https://github.com/rsyslog/rsyslog/blob/master/CONTRIBUTING.md) under the [GNU General Public License](https://github.com/rsyslog/rsyslog/blob/master/COPYING).
|
||||||
|
27
CREDITS.md
@@ -1,31 +1,32 @@
|
|||||||
### The OpenTTD team (in alphabetical order):
|
### The OpenTTD team (in alphabetical order):
|
||||||
|
|
||||||
- Grzegorz Duczyński (adf88) - General coding (since 1.7.2)
|
|
||||||
- Albert Hofkamp (Alberth) - GUI expert (since 0.7)
|
|
||||||
- Matthijs Kooijman (blathijs) - Pathfinder-guru, Debian port (since 0.3)
|
- Matthijs Kooijman (blathijs) - Pathfinder-guru, Debian port (since 0.3)
|
||||||
- Ulf Hermann (fonsinchen) - Cargo Distribution (since 1.3)
|
|
||||||
- Christoph Elsenhans (frosch) - General coding (since 0.6)
|
- Christoph Elsenhans (frosch) - General coding (since 0.6)
|
||||||
- Loïc Guilloux (glx) - Windows Expert (since 0.4.5)
|
- Loïc Guilloux (glx) - General / Windows Expert (since 0.4.5)
|
||||||
- Charles Pigott (LordAro) - General / Correctness police (since 1.9)
|
- Charles Pigott (LordAro) - General / Correctness police (since 1.9)
|
||||||
- Michael Lutz (michi_cc) - Path based signals (since 0.7)
|
- Michael Lutz (michi_cc) - General / Path based signals (since 0.7)
|
||||||
- Niels Martin Hansen (nielsm) - Music system, general coding (since 1.9)
|
- Niels Martin Hansen (nielsm) - Music system, general coding (since 1.9)
|
||||||
- Owen Rudge (orudge) - Forum host, OS/2 port (since 0.1)
|
- Owen Rudge (orudge) - Forum host, OS/2 port (since 0.1)
|
||||||
- Peter Nelson (peter1138) - Spiritual descendant from newGRF gods (since 0.4.5)
|
- Peter Nelson (peter1138) - Spiritual descendant from newGRF gods (since 0.4.5)
|
||||||
- Ingo von Borstel (planetmaker) - General coding, Support (since 1.1)
|
- Remko Bijker (Rubidium) - Coder and way more (since 0.4.5)
|
||||||
- Remko Bijker (Rubidium) - Lead coder and way more (since 0.4.5)
|
- Patric Stout (TrueBrain) - NoProgrammer (since 0.3), sys op
|
||||||
- José Soler (Terkhen) - General coding (since 1.0)
|
- Tyler Trahan (2TallTyler) - General coding (since 13)
|
||||||
|
|
||||||
### Inactive Developers:
|
### Inactive Developers:
|
||||||
|
|
||||||
|
- Grzegorz Duczyński (adf88) - General coding (1.7 - 1.8)
|
||||||
|
- Albert Hofkamp (Alberth) - GUI expert (0.7 - 1.9)
|
||||||
- Jean-François Claeys (Belugas) - GUI, newindustries and more (0.4.5 - 1.0)
|
- Jean-François Claeys (Belugas) - GUI, newindustries and more (0.4.5 - 1.0)
|
||||||
- Bjarni Corfitzen (Bjarni) - macOS port, coder and vehicles (0.3 - 0.7)
|
- Bjarni Corfitzen (Bjarni) - macOS port, coder and vehicles (0.3 - 0.7)
|
||||||
- Victor Fischer (Celestar) - Programming everywhere you need him to (0.3 - 0.6)
|
- Victor Fischer (Celestar) - Programming everywhere you need him to (0.3 - 0.6)
|
||||||
|
- Ulf Hermann (fonsinchen) - Cargo Distribution (1.3 - 1.6)
|
||||||
- Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;) (0.4.5 - 0.6)
|
- Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;) (0.4.5 - 0.6)
|
||||||
- Jonathan Coome (Maedhros) - High priest of the NewGRF Temple (0.5 - 0.6)
|
- Jonathan Coome (Maedhros) - High priest of the NewGRF Temple (0.5 - 0.6)
|
||||||
- Attila Bán (MiHaMiX) - WebTranslator 1 and 2 (0.3 - 0.5)
|
- Attila Bán (MiHaMiX) - Developer WebTranslator 1 and 2 (0.3 - 0.5)
|
||||||
|
- Ingo von Borstel (planetmaker) - General coding, Support (1.1 - 1.9)
|
||||||
- Zdeněk Sojka (SmatZ) - Bug finder and fixer (0.6 - 1.3)
|
- Zdeněk Sojka (SmatZ) - Bug finder and fixer (0.6 - 1.3)
|
||||||
|
- José Soler (Terkhen) - General coding (1.0 - 1.4)
|
||||||
- Christoph Mallon (Tron) - Programmer, code correctness police (0.3 - 0.5)
|
- Christoph Mallon (Tron) - Programmer, code correctness police (0.3 - 0.5)
|
||||||
- Patric Stout (TrueBrain) - NoProgrammer (0.3 - 1.2), sys op (active)
|
|
||||||
- Thijs Marinussen (Yexo) - AI Framework, General (0.6 - 1.3)
|
- Thijs Marinussen (Yexo) - AI Framework, General (0.6 - 1.3)
|
||||||
- Leif Linse (Zuu) - AI/Game Script (1.2 - 1.6)
|
- Leif Linse (Zuu) - AI/Game Script (1.2 - 1.6)
|
||||||
|
|
||||||
@@ -33,11 +34,11 @@
|
|||||||
|
|
||||||
- Tamás Faragó (Darkvater) - Ex-Lead coder (0.3 - 0.5)
|
- Tamás Faragó (Darkvater) - Ex-Lead coder (0.3 - 0.5)
|
||||||
- Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3 - 0.3)
|
- Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3 - 0.3)
|
||||||
- Emil Djupfeld (egladil) - macOS port (0.4 - 0.6)
|
- Emil Djupfeld (egladil) - macOS port (0.4.5 - 0.6)
|
||||||
- Simon Sasburg (HackyKid) - Bug fixer (0.4 - 0.4.5)
|
- Simon Sasburg (HackyKid) - Bug fixer (0.4 - 0.4.5)
|
||||||
- Ludvig Strigeus (ludde) - Original author of OpenTTD, main coder (0.1 - 0.3)
|
- Ludvig Strigeus (ludde) - Original author of OpenTTD, main coder (0.1 - 0.3)
|
||||||
- Cian Duffy (MYOB) - BeOS port / manual writing (0.1 - 0.3)
|
- Cian Duffy (MYOB) - BeOS port / manual writing (0.1 - 0.3)
|
||||||
- Petr Baudiš (pasky) - Many patches, newgrf support, etc. (0.3 - 0.3)
|
- Petr Baudiš (pasky) - Many patches, newgrf support (0.3 - 0.3)
|
||||||
- Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker (0.6 - 0.7)
|
- Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker (0.6 - 0.7)
|
||||||
- Serge Paquet (vurlix) - 2nd contributor after ludde (0.1 - 0.3)
|
- Serge Paquet (vurlix) - 2nd contributor after ludde (0.1 - 0.3)
|
||||||
|
|
||||||
@@ -52,7 +53,7 @@
|
|||||||
- Alberto Demichelis - Squirrel scripting language
|
- Alberto Demichelis - Squirrel scripting language
|
||||||
- L. Peter Deutsch - MD5 implementation
|
- L. Peter Deutsch - MD5 implementation
|
||||||
- Michael Blunck - For revolutionizing TTD with awesome graphics
|
- Michael Blunck - For revolutionizing TTD with awesome graphics
|
||||||
- George - Canal graphics
|
- George - Canal/Lock graphics
|
||||||
- Andrew Parkhouse (andythenorth) - River graphics
|
- Andrew Parkhouse (andythenorth) - River graphics
|
||||||
- David Dallaston (Pikka) - Tram tracks
|
- David Dallaston (Pikka) - Tram tracks
|
||||||
- All Translators - For their support to make OpenTTD a truly international game
|
- All Translators - For their support to make OpenTTD a truly international game
|
||||||
|
@@ -41,7 +41,6 @@ INHERIT_DOCS = YES
|
|||||||
SEPARATE_MEMBER_PAGES = NO
|
SEPARATE_MEMBER_PAGES = NO
|
||||||
TAB_SIZE = 2
|
TAB_SIZE = 2
|
||||||
ALIASES =
|
ALIASES =
|
||||||
TCL_SUBST =
|
|
||||||
OPTIMIZE_OUTPUT_FOR_C = YES
|
OPTIMIZE_OUTPUT_FOR_C = YES
|
||||||
OPTIMIZE_OUTPUT_JAVA = NO
|
OPTIMIZE_OUTPUT_JAVA = NO
|
||||||
OPTIMIZE_FOR_FORTRAN = NO
|
OPTIMIZE_FOR_FORTRAN = NO
|
||||||
@@ -155,7 +154,6 @@ VERBATIM_HEADERS = YES
|
|||||||
# Configuration options related to the alphabetical class index
|
# Configuration options related to the alphabetical class index
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
ALPHABETICAL_INDEX = NO
|
ALPHABETICAL_INDEX = NO
|
||||||
COLS_IN_ALPHA_INDEX = 5
|
|
||||||
IGNORE_PREFIX =
|
IGNORE_PREFIX =
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# Configuration options related to the HTML output
|
# Configuration options related to the HTML output
|
||||||
@@ -224,7 +222,7 @@ LATEX_OUTPUT = latex
|
|||||||
LATEX_CMD_NAME = latex
|
LATEX_CMD_NAME = latex
|
||||||
MAKEINDEX_CMD_NAME = makeindex
|
MAKEINDEX_CMD_NAME = makeindex
|
||||||
COMPACT_LATEX = NO
|
COMPACT_LATEX = NO
|
||||||
PAPER_TYPE = a4wide
|
PAPER_TYPE = a4
|
||||||
EXTRA_PACKAGES =
|
EXTRA_PACKAGES =
|
||||||
LATEX_HEADER =
|
LATEX_HEADER =
|
||||||
LATEX_FOOTER =
|
LATEX_FOOTER =
|
||||||
|
38
README.md
@@ -77,9 +77,9 @@ For some platforms, you will need to refer to [the installation guide](https://w
|
|||||||
The free data files, split into OpenGFX for graphics, OpenSFX for sounds and
|
The free data files, split into OpenGFX for graphics, OpenSFX for sounds and
|
||||||
OpenMSX for music can be found at:
|
OpenMSX for music can be found at:
|
||||||
|
|
||||||
- https://www.openttd.org/downloads/opengfx-releases/ for OpenGFX
|
- https://www.openttd.org/downloads/opengfx-releases/latest for OpenGFX
|
||||||
- https://www.openttd.org/downloads/opensfx-releases/ for OpenSFX
|
- https://www.openttd.org/downloads/opensfx-releases/latest for OpenSFX
|
||||||
- https://www.openttd.org/downloads/openmsx-releases/ for OpenMSX
|
- https://www.openttd.org/downloads/openmsx-releases/latest for OpenMSX
|
||||||
|
|
||||||
Please follow the readme of these packages about the installation procedure.
|
Please follow the readme of these packages about the installation procedure.
|
||||||
The Windows installer can optionally download and install these packages.
|
The Windows installer can optionally download and install these packages.
|
||||||
@@ -116,35 +116,6 @@ Most types of add-on content can be downloaded within OpenTTD via the 'Check Onl
|
|||||||
|
|
||||||
Add-on content can also be installed manually, but that's more complicated; the [OpenTTD wiki](https://wiki.openttd.org/) may offer help with that, or the [OpenTTD directory structure guide](./docs/directory_structure.md).
|
Add-on content can also be installed manually, but that's more complicated; the [OpenTTD wiki](https://wiki.openttd.org/) may offer help with that, or the [OpenTTD directory structure guide](./docs/directory_structure.md).
|
||||||
|
|
||||||
### 1.5.1) AI opponents
|
|
||||||
|
|
||||||
OpenTTD comes without AI opponents, 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.
|
|
||||||
|
|
||||||
You can select some AIs that you think are compatible with your playing style.
|
|
||||||
|
|
||||||
AI help and discussions may also be found in the [AI section of the forum](https://www.tt-forums.net/viewforum.php?f=65).
|
|
||||||
|
|
||||||
### 1.5.2) Scenarios and height maps
|
|
||||||
|
|
||||||
Scenarios and heightmaps can be added via the 'Check Online Content' button in the main menu.
|
|
||||||
|
|
||||||
### 1.5.3) NewGRFs
|
|
||||||
|
|
||||||
A wide range of add-content is available as NewGRFs, including vehicles, industries, stations, landscape objects, town names and more.
|
|
||||||
|
|
||||||
NewGRFs can be added via the 'Check Online Content' button in the main menu.
|
|
||||||
|
|
||||||
See also the wiki [guide to NewGRFs](https://wiki.openttd.org/en/Manual/NewGRF) and [the forum graphics development section](https://www.tt-forums.net/viewforum.php?f=66).
|
|
||||||
|
|
||||||
### 1.5.4) Game scripts
|
|
||||||
|
|
||||||
Game scripts can provide additional challenges or changes to the standard OpenTTD gameplay, for example setting transport goals, or changing town growth behaviour.
|
|
||||||
|
|
||||||
Game scripts can be added via the 'Check Online Content' button in the main menu.
|
|
||||||
|
|
||||||
See also the wiki [guide to game scripts](https://wiki.openttd.org/en/Manual/Game%20script) and [the forum graphics game script section](https://www.tt-forums.net/viewforum.php?f=65).
|
|
||||||
|
|
||||||
### 1.6) OpenTTD directories
|
### 1.6) OpenTTD directories
|
||||||
|
|
||||||
@@ -162,8 +133,9 @@ If you want to compile OpenTTD from source, instructions can be found in [COMPIL
|
|||||||
'Official' channels
|
'Official' channels
|
||||||
|
|
||||||
- [OpenTTD website](https://www.openttd.org)
|
- [OpenTTD website](https://www.openttd.org)
|
||||||
|
- [OpenTTD official Discord](https://discord.gg/openttd)
|
||||||
- IRC chat using #openttd on irc.oftc.net [more info about our irc channel](https://wiki.openttd.org/en/Development/IRC%20channel)
|
- IRC chat using #openttd on irc.oftc.net [more info about our irc channel](https://wiki.openttd.org/en/Development/IRC%20channel)
|
||||||
- [OpenTTD on Github](https://github.com/openTTD/) for code repositories and for reporting issues
|
- [OpenTTD on Github](https://github.com/OpenTTD/) for code repositories and for reporting issues
|
||||||
- [forum.openttd.org](https://forum.openttd.org/) - the primary community forum site for discussing OpenTTD and related games
|
- [forum.openttd.org](https://forum.openttd.org/) - the primary community forum site for discussing OpenTTD and related games
|
||||||
- [OpenTTD wiki](https://wiki.openttd.org/) community-maintained wiki, including topics like gameplay guide, detailed explanation of some game mechanics, how to use add-on content (mods) and much more
|
- [OpenTTD wiki](https://wiki.openttd.org/) community-maintained wiki, including topics like gameplay guide, detailed explanation of some game mechanics, how to use add-on content (mods) and much more
|
||||||
|
|
||||||
|
@@ -13,6 +13,7 @@ set(AI_COMPAT_SOURCE_FILES
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/compat_1.10.nut
|
${CMAKE_CURRENT_SOURCE_DIR}/compat_1.10.nut
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/compat_1.11.nut
|
${CMAKE_CURRENT_SOURCE_DIR}/compat_1.11.nut
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/compat_12.nut
|
${CMAKE_CURRENT_SOURCE_DIR}/compat_12.nut
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/compat_13.nut
|
||||||
)
|
)
|
||||||
|
|
||||||
foreach(AI_COMPAT_SOURCE_FILE IN LISTS AI_COMPAT_SOURCE_FILES)
|
foreach(AI_COMPAT_SOURCE_FILE IN LISTS AI_COMPAT_SOURCE_FILES)
|
||||||
|
@@ -379,3 +379,16 @@ AIGroup.CreateGroup <- function(vehicle_type)
|
|||||||
{
|
{
|
||||||
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
AIRoad._HasRoadType <- AIRoad.HasRoadType;
|
||||||
|
AIRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (AIRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -131,3 +131,16 @@ AIGroup.CreateGroup <- function(vehicle_type)
|
|||||||
{
|
{
|
||||||
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
AIRoad._HasRoadType <- AIRoad.HasRoadType;
|
||||||
|
AIRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (AIRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -68,3 +68,16 @@ AIGroup.CreateGroup <- function(vehicle_type)
|
|||||||
{
|
{
|
||||||
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
AIRoad._HasRoadType <- AIRoad.HasRoadType;
|
||||||
|
AIRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (AIRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -6,3 +6,16 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
AILog.Info("1.10 API compatibility in effect.");
|
AILog.Info("1.10 API compatibility in effect.");
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
AIRoad._HasRoadType <- AIRoad.HasRoadType;
|
||||||
|
AIRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (AIRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -6,3 +6,16 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
AILog.Info("1.11 API compatibility in effect.");
|
AILog.Info("1.11 API compatibility in effect.");
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
AIRoad._HasRoadType <- AIRoad.HasRoadType;
|
||||||
|
AIRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (AIRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -20,3 +20,16 @@ AIGroup.CreateGroup <- function(vehicle_type)
|
|||||||
{
|
{
|
||||||
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
AIRoad._HasRoadType <- AIRoad.HasRoadType;
|
||||||
|
AIRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (AIRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -20,3 +20,16 @@ AIGroup.CreateGroup <- function(vehicle_type)
|
|||||||
{
|
{
|
||||||
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
AIRoad._HasRoadType <- AIRoad.HasRoadType;
|
||||||
|
AIRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (AIRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -20,3 +20,16 @@ AIGroup.CreateGroup <- function(vehicle_type)
|
|||||||
{
|
{
|
||||||
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
AIRoad._HasRoadType <- AIRoad.HasRoadType;
|
||||||
|
AIRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (AIRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -20,3 +20,16 @@ AIGroup.CreateGroup <- function(vehicle_type)
|
|||||||
{
|
{
|
||||||
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
AIRoad._HasRoadType <- AIRoad.HasRoadType;
|
||||||
|
AIRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (AIRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -20,3 +20,16 @@ AIGroup.CreateGroup <- function(vehicle_type)
|
|||||||
{
|
{
|
||||||
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
AIRoad._HasRoadType <- AIRoad.HasRoadType;
|
||||||
|
AIRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (AIRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -20,3 +20,16 @@ AIGroup.CreateGroup <- function(vehicle_type)
|
|||||||
{
|
{
|
||||||
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
AIRoad._HasRoadType <- AIRoad.HasRoadType;
|
||||||
|
AIRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (AIRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -20,3 +20,16 @@ AIGroup.CreateGroup <- function(vehicle_type)
|
|||||||
{
|
{
|
||||||
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
AIRoad._HasRoadType <- AIRoad.HasRoadType;
|
||||||
|
AIRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (AIRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -6,3 +6,16 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
AILog.Info("1.9 API compatibility in effect.");
|
AILog.Info("1.9 API compatibility in effect.");
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
AIRoad._HasRoadType <- AIRoad.HasRoadType;
|
||||||
|
AIRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (AIRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -4,3 +4,18 @@
|
|||||||
* 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.
|
* 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/>.
|
* 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("12 API compatibility in effect.");
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
AIRoad._HasRoadType <- AIRoad.HasRoadType;
|
||||||
|
AIRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = AIRoadTypeList(AIRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (AIRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
6
bin/ai/compat_13.nut
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
@@ -10,6 +10,7 @@ set(GS_COMPAT_SOURCE_FILES
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/compat_1.10.nut
|
${CMAKE_CURRENT_SOURCE_DIR}/compat_1.10.nut
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/compat_1.11.nut
|
${CMAKE_CURRENT_SOURCE_DIR}/compat_1.11.nut
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/compat_12.nut
|
${CMAKE_CURRENT_SOURCE_DIR}/compat_12.nut
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/compat_13.nut
|
||||||
)
|
)
|
||||||
|
|
||||||
foreach(GS_COMPAT_SOURCE_FILE IN LISTS GS_COMPAT_SOURCE_FILES)
|
foreach(GS_COMPAT_SOURCE_FILE IN LISTS GS_COMPAT_SOURCE_FILES)
|
||||||
|
@@ -13,3 +13,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
|
|||||||
{
|
{
|
||||||
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
GSRoad._HasRoadType <- GSRoad.HasRoadType;
|
||||||
|
GSRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (GSRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -6,3 +6,16 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
GSLog.Info("1.11 API compatibility in effect.");
|
GSLog.Info("1.11 API compatibility in effect.");
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
GSRoad._HasRoadType <- GSRoad.HasRoadType;
|
||||||
|
GSRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (GSRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -35,3 +35,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
|
|||||||
{
|
{
|
||||||
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
GSRoad._HasRoadType <- GSRoad.HasRoadType;
|
||||||
|
GSRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (GSRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -35,3 +35,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
|
|||||||
{
|
{
|
||||||
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
GSRoad._HasRoadType <- GSRoad.HasRoadType;
|
||||||
|
GSRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (GSRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -28,3 +28,15 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
|
|||||||
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
GSRoad._HasRoadType <- GSRoad.HasRoadType;
|
||||||
|
GSRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (GSRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -20,3 +20,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
|
|||||||
{
|
{
|
||||||
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
GSRoad._HasRoadType <- GSRoad.HasRoadType;
|
||||||
|
GSRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (GSRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -20,3 +20,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
|
|||||||
{
|
{
|
||||||
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
GSRoad._HasRoadType <- GSRoad.HasRoadType;
|
||||||
|
GSRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (GSRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -20,3 +20,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
|
|||||||
{
|
{
|
||||||
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
GSRoad._HasRoadType <- GSRoad.HasRoadType;
|
||||||
|
GSRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (GSRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -20,3 +20,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
|
|||||||
{
|
{
|
||||||
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
GSRoad._HasRoadType <- GSRoad.HasRoadType;
|
||||||
|
GSRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (GSRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -13,3 +13,16 @@ GSCompany.ChangeBankBalance <- function(company, delta, expenses_type)
|
|||||||
{
|
{
|
||||||
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
return GSCompany._ChangeBankBalance(company, delta, expenses_type, GSMap.TILE_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
GSRoad._HasRoadType <- GSRoad.HasRoadType;
|
||||||
|
GSRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (GSRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -4,3 +4,18 @@
|
|||||||
* 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.
|
* 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/>.
|
* 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("12 API compatibility in effect.");
|
||||||
|
|
||||||
|
/* 13 really checks RoadType against RoadType */
|
||||||
|
GSRoad._HasRoadType <- GSRoad.HasRoadType;
|
||||||
|
GSRoad.HasRoadType <- function(tile, road_type)
|
||||||
|
{
|
||||||
|
local list = GSRoadTypeList(GSRoad.GetRoadTramType(road_type));
|
||||||
|
foreach (rt, _ in list) {
|
||||||
|
if (GSRoad._HasRoadType(tile, rt)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
6
bin/game/compat_13.nut
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
375
changelog.txt
@@ -1,3 +1,378 @@
|
|||||||
|
13.4 (2023-07-29)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Fix: Setting tree lines drawn incorrectly for RTL languages (#11070)
|
||||||
|
Fix #11043: Don't choose toolbar dropdown option if focus is lost (#11044)
|
||||||
|
Fix #10917: Pay loan interest before generating statistics (#11040)
|
||||||
|
Fix #11016: Use after free in network invalid packet error path (#11022)
|
||||||
|
Fix #10987: Double-close of dropdown stopped land-info tool working as default (#11000)
|
||||||
|
|
||||||
|
|
||||||
|
13.3 (2023-06-11)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Fix: [Win32] use full monitor resolution for fullscreen (#10985)
|
||||||
|
|
||||||
|
|
||||||
|
13.2 (2023-06-10)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Change: [Win32] position window in center of workspace of primary display (#10942)
|
||||||
|
Change: Automatically disable hardware acceleration when GPU driver crashed the game last attempt (#10928)
|
||||||
|
Change: [Linux] Default scroll mode to non-mouse-lock (#10920)
|
||||||
|
Change: Include font style in font name for Freetype (#10879)
|
||||||
|
Fix: Don't restore backed up vehicle name if it's no longer unique (#10979)
|
||||||
|
Fix #10975: Train name wrongly marked as unique when joining trains (#10976)
|
||||||
|
Fix: Crash when not even a single row fits for dropdowns on low resolution screens (#10934)
|
||||||
|
Fix: Crash with tooltip on low resolution screens (#10933)
|
||||||
|
Fix: Crash when window can't be placed on low resolution screens (#10932)
|
||||||
|
Fix #10502: Apply engine refit before attaching free wagons (#10926)
|
||||||
|
Fix: Wayland crash on startup due to Pango also using FontConfig (#10916)
|
||||||
|
Fix: When syncing width of GUI items, take padding into account (#10915)
|
||||||
|
Fix: Make dropdowns self-close when losing focus (#10912)
|
||||||
|
Fix: Land info window maximum width was not scaled (#10894)
|
||||||
|
Fix: Check max member count in squirrel classes (#10883)
|
||||||
|
Fix: Ask FontConfig for the face index when opening fonts (#10878)
|
||||||
|
Fix #10831: Level crossing parts left barred after crossing tile removal (#10874)
|
||||||
|
Fix: Rail waypoint selection window not closed when parent windows closed (#10873)
|
||||||
|
Fix #10846: [Script] Crash on trying to allocate an excessively large array (#10848)
|
||||||
|
Fix: [Win32] Text line breaking did not properly handle punctuation characters (#10775)
|
||||||
|
Fix: [Emscripten] Crash when saving games (#10758)
|
||||||
|
Fix: [Win32] Wrong multi-line text layout due to incorrect whitespace handling (#10752)
|
||||||
|
Fix #10741: Rail platforms left partially reserved after train crash (#10751)
|
||||||
|
Fix: Shaded engines in purchase list incorrectly shaded (#10736)
|
||||||
|
Fix #10735: [NewGRF] {POP_COLOUR} fails if string is drawn with extra flags (#10736)
|
||||||
|
Fix #8177: Ships with max speed overflow to near-zero speed (#10695)
|
||||||
|
Fix #10289: Don't silently fail when setting timetable start dates (#10690)
|
||||||
|
Fix #8302: Improve "Maintenance intervals are in percents" helptext (#10686)
|
||||||
|
Fix #10665: "No vehicles are available yet" message did not appear correctly on non-temperate climates (#10673)
|
||||||
|
Fix #10630: Don't allow shifting service date earlier than year 0 (#10643)
|
||||||
|
Fix #10637, #10638: Incorrect water infrastructure totals when building certain object types (#10639, #10640)
|
||||||
|
Fix: Abort loading savegame if road vehicle is on invalid road type (#10622)
|
||||||
|
|
||||||
|
|
||||||
|
13.1 (2023-04-10)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Add: [NewGRF] Engine name callback for nested variants. (#10399)
|
||||||
|
Fix: Improve main toolbar tooltips (#10616)
|
||||||
|
Fix: [NewGRF] Additional validation for Action3 (+others) (#10601)
|
||||||
|
Fix: Clear button for editbox didn't take account of padding (#10583)
|
||||||
|
Fix: [Script] Access to enum/consts defined outside of main.nut (#10573)
|
||||||
|
Fix #10568: Bogus warning when loading a save with a NewGRFs on dedicated servers (#10572)
|
||||||
|
Fix #10554: Crash when scrolling in the autoreplace window with collapsed variants (#10555)
|
||||||
|
Fix: Network server highlight invisible with RTL languages. (#10551)
|
||||||
|
Fix: Client name was not being used as company manager name (#10535)
|
||||||
|
Fix: Prevent road vehicles on crossing from crashing into the side of a train (#10496)
|
||||||
|
Fix #10477: [macOS] Calculation for window sizes when using custom fonts was being rounded incorrectly (#10489)
|
||||||
|
Fix #10486: Crash in debug window when GS started before AIs (#10487)
|
||||||
|
Fix #10469: [Script] Negative numbers in League Table window were sorted incorrectly (#10471)
|
||||||
|
Fix #10465: Crash on timeout if user never enters a password for server (#10466)
|
||||||
|
Fix #10280, #10461: Crash on opening town windows as a spectator (#10462)
|
||||||
|
Fix #10059: Script config values stored in the config file could cause crashes (#10444)
|
||||||
|
|
||||||
|
|
||||||
|
13.0 (2023-02-05)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Change #10077: Make maximum loan a positive multiple of the loan interval (#10355)
|
||||||
|
Fix #10361: [Script] Don't try to give saved data to a dead script (#10433)
|
||||||
|
Fix #10419: Water infrastructure accounting when building ship depots and docks (#10432)
|
||||||
|
|
||||||
|
|
||||||
|
13.0-RC2 (2023-01-28)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Feature: Press Ctrl to build a diagonal area of trees (#10342)
|
||||||
|
Feature: Set a custom number of industries in map generation window (#10340)
|
||||||
|
Change: Display font status as aa/noaa instead of true/false (#10352)
|
||||||
|
Fix: [Script] Improved API documentation for scripts (#10413, #10412)
|
||||||
|
Fix #10255: Reduce basic thickness of linkgraph GUI lines (#10410)
|
||||||
|
Fix #10220: Don't select unselectable engine as default (#10404)
|
||||||
|
Fix #10395: When loading old saves, don't forcibly bar level crossings (#10400)
|
||||||
|
Fix #10377: Bad sorting of rail vehicles when primary variant is missing (#10378)
|
||||||
|
Fix #10368: Server restarting game caused clients to hit assertion (#10369)
|
||||||
|
Fix #10362: NewGRF bridges without speed limits (#10365)
|
||||||
|
Fix #10363: CargoDist setting helptext shouldn't suggest symmetric distribution for diamonds in subtropic (#10364)
|
||||||
|
Fix: [Script] Switch to OWNER_TOWN prevented OWNER_DEITY test during industry prospecting (#10360)
|
||||||
|
Fix #10009: Bad overflow protection when taking out loans (#10359)
|
||||||
|
Fix #9865: Removing files with the console always failed (#10357)
|
||||||
|
Fix #10057: FallbackParagraphLayout fails to properly wrap (#10356)
|
||||||
|
Fix #10177: Company list password padlock showed after switching to single player (#10354)
|
||||||
|
Fix: Various Wide River issues (#10348)
|
||||||
|
Fix: Link variants to parents when finalising engines (#10346)
|
||||||
|
Fix #10333: Only show industry prospecting errors to local company (#10338)
|
||||||
|
Fix #10335: Set initial scrollbar count for object GUI (#10336)
|
||||||
|
Fix #10331: Starting new company during load must happen after AI start (#10332)
|
||||||
|
Fix #10309: [SDL] Uninitialized width and height when turning off full screen (#10328)
|
||||||
|
Fix #10032: Capacities of articulated vehicles in build window (#10326)
|
||||||
|
Fix: Improve handling of corrupt NewGRF or image files (#10321, #10316)
|
||||||
|
Fix: [NewGRF] Don't assume engclass 2 should be elrail (#10315)
|
||||||
|
Fix: [Script] AIGroup.GetProfitLastYear could get values different than those displayed in GUI (#10227)
|
||||||
|
Fix #10304: [Scripts] Don't start GS in intro game (#10305)
|
||||||
|
Fix: [Script] Copy compat files for version 13 (#10303)
|
||||||
|
|
||||||
|
|
||||||
|
13.0-RC1 (2023-01-01)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Feature: 'font' console command to configure fonts within game (#10278)
|
||||||
|
Feature: Ctrl-click to bulk edit timetable speeds/waiting times (#10265)
|
||||||
|
Feature: [NewGRF] Vehicle variants in expandable purchase list (#10220)
|
||||||
|
Feature: Expand all towns in the scenario editor (#10215)
|
||||||
|
Add: [NewGRF] Slope-aware and roadtype-specific one-way sprites (#10282)
|
||||||
|
Change: Display text files in black (#10291)
|
||||||
|
Change: Make vehicle list dropdown buttons resize to fit strings (#10286)
|
||||||
|
Change: [NewGRF] Support flipping shorter engines without explicit support (#10262)
|
||||||
|
Change: Separate ground sprite from foundation sprite offsets (#10256)
|
||||||
|
Change: Vertically centre sprite font relative to TrueType font (#10254)
|
||||||
|
Change: [macOS] Set minimum macOS version to 10.13 (#10253)
|
||||||
|
Change: Use lowered not disabled widget for current vehicle details tab (#10252)
|
||||||
|
Change: Various improvements to NewGRF sprite aligner (#10249)
|
||||||
|
Change: reset_engines console command now rerandomises introduction dates and reliability (#10220)
|
||||||
|
Change: Show error message on failed industry prospecting (#10202)
|
||||||
|
Fix: Local authority window rating list height ignored icon sizes (#10285)
|
||||||
|
Fix #10150: Town signs could be truncated when using custom fonts (#10283)
|
||||||
|
Fix #8971: Resize QueryStrings with interface scale change (#10281)
|
||||||
|
Fix #10274: Crash when rescanning scripts with GS selected (#10276)
|
||||||
|
Fix #10151: Use smaller padding for signs (#10272)
|
||||||
|
Fix #10263: [Script] Restore tile validation for commands (#10269)
|
||||||
|
Fix: Missing scrollbar for rail/roadtype dropdowns (#10264)
|
||||||
|
Fix #10260: Incorrect rect height drawing image in vehicle details (#10261)
|
||||||
|
Fix #10257: Incorrect catenary position on sloped bridge heads (#10258)
|
||||||
|
Fix: Vertically centre chat prompt (#10250)
|
||||||
|
Fix #10214: League and graph buttons in toolbar did not have a default action (#10246)
|
||||||
|
Fix #10242: Allow a space for text shadow when clipping text (#10243)
|
||||||
|
Fix #10206: Fully disable scripts in intro game (#10241)
|
||||||
|
Fix #10218: Don't try to create river tiles along incorrect slopes (#10235)
|
||||||
|
Fix #10208: [NewGRF] Allow using a specific underlay for road/tram tunnels (#10233)
|
||||||
|
Fix #10224: Don't change fast-forward mode while saving (#10230)
|
||||||
|
Fix #10147: Sound effect volume slider no longer set volume (#10228)
|
||||||
|
Fix #10223: Crash when vehicle cloning fails on order cloning (#10225)
|
||||||
|
Fix: Maximum space for engine preview image was never scaled (#10219)
|
||||||
|
Fix #10216: Crash when upgrading savegame with crashed vehicles (#10217)
|
||||||
|
Fix #10212: [Script] Nested ScriptAccounting scopes not restored properly (#10213)
|
||||||
|
Fix #10114: Incorrect drag-highlight position with non-power-of-2 scaling (#10211)
|
||||||
|
Fix #10198: Rearrange Intro GUI to make button rows narrower (#10203)
|
||||||
|
Fix: Missing extra padding when drawing tooltip text (#10201)
|
||||||
|
Fix: Bad alignment of button icons when using the original baseset (#10200)
|
||||||
|
Fix: Signal icons incorrectly positioned in UI (#10199)
|
||||||
|
Fix #10021: Object GUI resized when switching between different objects (#10196)
|
||||||
|
Fix #9720: Delay start of GS/AI to after loading of savegame (#9745)
|
||||||
|
|
||||||
|
|
||||||
|
13.0-beta2 (2022-11-27)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Feature: Allow AI/GS to be fully modified in scenario editor (#10152)
|
||||||
|
Feature: Display power-to-weight ratio in ground vehicle details GUI (#10123)
|
||||||
|
Feature: Variable interface scaling (with chunky bevels!) (#10114)
|
||||||
|
Feature: Hotkey to honk a vehicle's horn (#10110)
|
||||||
|
Feature: Split AI/Game Script configuration windows and add them to world gen window (#10058)
|
||||||
|
Feature: [GS] Scriptable league tables (#10001)
|
||||||
|
Feature: Multi-track level crossings (#9931)
|
||||||
|
Feature: Improved local authority action window (#9928)
|
||||||
|
Feature: Automatic console command screenshot numbering with a filename ending in '#' (#9781)
|
||||||
|
Feature: Add buttons to toggle music in the Game Options menu (#9727)
|
||||||
|
Feature: Contextual actions for vehicles grouped by shared orders (#8425)
|
||||||
|
Feature: Add cargo filter support to vehicle list (#8308)
|
||||||
|
Feature: Show the cargoes the vehicles can carry in the vehicle list window (#8304)
|
||||||
|
Change: Allow building canal by area outside editor (#10173)
|
||||||
|
Change: Minor improvements to the new Finance GUI (#10168)
|
||||||
|
Change: Let AI developers edit non-editable AI/Game Script Parameters (#8895)
|
||||||
|
Change: Allow building docks on clearable watered object tiles (#8514)
|
||||||
|
Fix #8770: Center vehicle status bar icon (#10178)
|
||||||
|
Fix: Crash if error message window is too wide for screen. (#10172)
|
||||||
|
Fix #10155: Network games not syncing company settings properly (#10158)
|
||||||
|
Fix #10154: Network game desync related to setting a random company face (#10157)
|
||||||
|
Fix #10011: Incorrect infrastructure totals when overbuilding bay road stop (#10143)
|
||||||
|
Fix #10117: Object burst limit allowed one fewer object than the setting (#10120)
|
||||||
|
Fix #10023: Allow negative input in text fields when needed (#10112)
|
||||||
|
Fix #9908: Fix crash which could occur when a company was deleted when a depot window was open (#9912)
|
||||||
|
|
||||||
|
|
||||||
|
13.0-beta1 (2022-10-31)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Feature: Airport construction GUI displays infrastructure cost (#10094)
|
||||||
|
Feature: Purchase land multiple tiles at a time (#10027)
|
||||||
|
Feature: Add sticky pin & shade widgets to Object Selection UI panel (#10019, #10020)
|
||||||
|
Feature: Improved handling of HiDPI and mixed-DPI screens (#9994, #9996, #9997, #10064)
|
||||||
|
Feature: Alternative linkgraph colour schemes (#9866)
|
||||||
|
Feature: Allow Shift+Insert as paste in edit box (#9836)
|
||||||
|
Feature: Setting to make the local town authority rubber-stamp all actions (#9833)
|
||||||
|
Feature: Add/extend console commands to enable screenshot automation (#9771)
|
||||||
|
Feature: [Linkgraph] Show a tooltip with statistics when hovering a link (#9760)
|
||||||
|
Feature: Build objects by area (#9709)
|
||||||
|
Feature: Add setting to hide news about competitors vehicle crash (#9653)
|
||||||
|
Feature: Ctrl-click to remove fully autoreplaced vehicles from list (#9639)
|
||||||
|
Feature: Wide rivers on map generation (#9628)
|
||||||
|
Add: [Script] ScriptCargo::GetWeight to get cargo weights (#9930)
|
||||||
|
Add: Command line option to skip NewGRF scanning (#9879)
|
||||||
|
Add: Show video driver name in Game Options window (#9872)
|
||||||
|
Add: [NewGRF] Map seed as global variable (#9834)
|
||||||
|
Add: [Script] IndustryType::ResolveNewGRFID to resolve industry id from grf_local_id and grfid (#9798)
|
||||||
|
Add: [Script] ObjectType::ResolveNewGRFID to resolve object id from grfid and grf_local_id (#9795)
|
||||||
|
Update: To all the friends we have lost and those we have gained (#10000)
|
||||||
|
Change: Use the Simulation subcategory to openttd.desktop (#10015)
|
||||||
|
Change: Constantly update destination of 'any depot' orders (#9959)
|
||||||
|
Change: Use an indent, not a dash, to list train capacity (#9887)
|
||||||
|
Change: [NewGRF] Increase vehicle sprite stack from 4 layers to 8 (#9863)
|
||||||
|
Change: Don't pay Property Maintenance on stations when Infrastructure Maintenance is disabled (#9828)
|
||||||
|
Change: Improved layout of the finance window (#9827)
|
||||||
|
Change: [Admin] Bump admin port protocol due to command changes (#9754)
|
||||||
|
Change: Suppress vehicle age warnings for stopped vehicles (#9718)
|
||||||
|
Change: Make pf.yapf.rail_firstred_twoway_eol on by default (#9544)
|
||||||
|
Change: Deliver cargo to the closest industry first (#9536)
|
||||||
|
Fix: Lots of fixes to how windows handle resizing (#10040, #10042, #10046, #10051, #10056, #10068, #10070, #10098)
|
||||||
|
Fix: Console commands list_ai output was truncated with a suitably large number of AIs (#10075)
|
||||||
|
Fix #9876: MacBook Touch Bar crash / render issues w/ 32bpp graphics (#10060)
|
||||||
|
Fix: Reduce framerate overhead in Train::Tick (#10055)
|
||||||
|
Fix: Only open scenario editor date query once (#10050)
|
||||||
|
Fix #10048: Don't relocate company HQ on the same exact location (#10049)
|
||||||
|
Fix #10038: Missing upper bounds check when loading custom playlists (#10039)
|
||||||
|
Fix: Wrong string used to determine size of zoomed out station sign (#10036)
|
||||||
|
Fix: Disable "turn around" button for other companies' road vehicles (#10033)
|
||||||
|
Fix: Online Players list mouse hover behaviour (#10031)
|
||||||
|
Fix: [NewGRF] Weirdness of new stations (#10017)
|
||||||
|
Fix #9854: DrawStringMultiLine() could draw beyond its bounding box (#10014)
|
||||||
|
Fix: Incorrect player name in online players window (#10013)
|
||||||
|
Fix #8099: News window zoom level fixes (#10005)
|
||||||
|
Fix: [NewGRF] Upper 16 random bits should be the same for all station tiles in callback 140 (#9992)
|
||||||
|
Fix #9989: £0 Net Profit is neither negative nor positive (#9991)
|
||||||
|
Fix #9804: Only apply sprite_zoom_min setting when sprites available (#9988)
|
||||||
|
Fix #9972: Add missing fill/resize flags on Framerate window widgets (#9982)
|
||||||
|
Fix #9935: Use more selectivity when building SSE specific code (#9980)
|
||||||
|
Fix #9940: Print debuglevel parse errors to console when changed from console (#9979)
|
||||||
|
Fix #9977: Clearing the console with a large number of lines could cause a crash (#9978)
|
||||||
|
Fix #9974: Console command getsysdate did not work due to off-by-one error (#9975)
|
||||||
|
Fix: [NewGRF] Default value of RailVehicleInfo::railveh_type was inconsistent with other default properties (#9967)
|
||||||
|
Fix #8584: Vehicles with shared orders getting invalid or unexpected start dates (#9955)
|
||||||
|
Fix #9951: [NewGRF] Scenario editor random industries button broke NewGRF persistent storage (#9952)
|
||||||
|
Fix: Validation of various internal command parameters that could have allowed a rogue client to crash servers (#9942, #9943, #9944, #9945, #9946, #9947, #9948, #9950)
|
||||||
|
Fix #9937: Station industries_near incorrect after removing part moved sign (#9938)
|
||||||
|
Fix: [Script] ScriptRoad::HasRoadType really check for RoadType (#9934)
|
||||||
|
Fix #9363: Rebuild client list on reinit event (#9929)
|
||||||
|
Fix #9925: Industry tile layout validation for layouts of only one tile (#9926)
|
||||||
|
Fix #9918: Reset industy last production year on scenario start (#9920)
|
||||||
|
Fix #9914: Prevent more useless pathfinder run for blocked vehicles (#9917)
|
||||||
|
Fix: List a max of four share owners instead of three (#9905)
|
||||||
|
Fix: [NewGRF] Industry layouts with zero regular tiles should be invalid (#9902)
|
||||||
|
Fix #9869: Remove docking tile when doing a clear square (#9898)
|
||||||
|
Fix: New player companies use favorite manager face, if saved (#9895)
|
||||||
|
Fix: Towns don't build parallel, redundant bridges (#9891)
|
||||||
|
Fix #9712: Cap town bridge length at original 11-tile limit (#9890)
|
||||||
|
Fix #9883: Show cost/income float over end tile of rail or road construction (#9889)
|
||||||
|
Fix #9870: Don't update infrastructure totals when overbuilding object on canal (#9888)
|
||||||
|
Fix #9877: GS could trigger 'Cost: £0' cost message (#9878)
|
||||||
|
Fix 44f2ef1: [strgen] Allow gender for {CARGO_SHORT} (#9873)
|
||||||
|
Fix #9867: Industry::stations_near not filled at industry creation (#9868)
|
||||||
|
Fix #9853: Incorrect merge of guiflags and flags for osk_activation (#9855)
|
||||||
|
Fix #6544: Don't join AI company when loading network game in singleplayer (#9794)
|
||||||
|
Fix: Company values do not properly account for shares (#9770)
|
||||||
|
Fix #9546: Crash when no industries are present in game (#9726)
|
||||||
|
Fix #9708: [Linkgraph] Don't assume vehicles have a non-zero max speed (#9693)
|
||||||
|
Fix #9665: [Linkgraph] Fix travel times of non-direct journeys (#9693)
|
||||||
|
Fix #8797: Use logical rail length when placing signals (#9652)
|
||||||
|
Cleanup: [NewGRF] Remove unused flag sprites (#10052)
|
||||||
|
|
||||||
|
|
||||||
|
12.2 (2022-04-02)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Feature: Remember the last-used signal between games (#9792)
|
||||||
|
Change: [MacOS] Allow touchbar usage on all supported OS versions (#9776)
|
||||||
|
Change: Add a timestamp in name of crash files (#9761)
|
||||||
|
Fix #9736: Duplicate multiplayer window opens upon canceling password entry (#9842)
|
||||||
|
Fix: Removing long roads doesn't prioritise refusal of local authority over other errors (#9831)
|
||||||
|
Fix #9020: Glitchy station coverage highlight when changing selection (#9825)
|
||||||
|
Fix: Correct some Romanian town names (#9819)
|
||||||
|
Fix: Original music playback rate was slightly too fast (#9814)
|
||||||
|
Fix #9811: Use the NewGRF-defined vehicle center when dragging ships and aircraft (#9812)
|
||||||
|
Fix: Do not let shares in the company taking over another company disappear (#9808)
|
||||||
|
Fix #9802: Crash when using lots of NewGRF waypoint types (#9803)
|
||||||
|
Fix #9766: Don't write uninitialised data in config file (#9767)
|
||||||
|
Fix #9743: [MacOS] Don't try to render touchbar sprites with invalid zoom level (#9776)
|
||||||
|
Fix #9774: Building roadstop in estimation mode updates station acceptance (#9775)
|
||||||
|
Fix: If vehicles only refit to cargo-slots >= 32, the default cargo was wrong (#9744)
|
||||||
|
Fix #9735: Possible desync when replacing a depot on same tile (#9738)
|
||||||
|
Fix #9730: [Network] Connections can use an invalid socket due to a race condition (#9731)
|
||||||
|
Fix: Don't show sign edit window for GS-owned signs (#9716)
|
||||||
|
Fix #9702: Display order window for vehicle group on ctrl-click only when using shared orders (#9704)
|
||||||
|
Fix #9680: Crash when loading really old savegames with aircraft in certain places (#9699)
|
||||||
|
Fix: Update last servicing dates when using the date cheat (#9694)
|
||||||
|
Fix: Error message shows about missing glyphs while suitable fallback font is found (#9692)
|
||||||
|
|
||||||
|
|
||||||
|
12.1 (2021-11-08)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Feature: Button to toggle showing advanced signal types (#9617)
|
||||||
|
Change: Don't show screenshot GUI in screenshots (#9674)
|
||||||
|
Change: Suppress panning in intro game, while user is interacting with the GUI (#9645)
|
||||||
|
Change: Draw rotor in cursor when dragging helicopters in depots (#9612)
|
||||||
|
Fix: Invalid memory access when loading a currency NewGRF (#9675)
|
||||||
|
Fix #9579: Object and HQ construction is Construction cost, not Property Maintenance (#9673)
|
||||||
|
Fix #9669: Ships exiting a blocked depot/lock could exit in the wrong direction (#9672)
|
||||||
|
Fix: Every 16th client never reconnects after server restart (#9666)
|
||||||
|
Fix #9643: Screenshots were always written as BMP files (#9644)
|
||||||
|
Fix #9630: Intro game could zoom in/out more than allowed by settings (#9633)
|
||||||
|
Fix #9626: Incorrect loading of script saved data (#9629)
|
||||||
|
Fix: Emergency crash save had the wrong NewGRF list saved in it (#9627)
|
||||||
|
Fix #9595: Always use plural forms of cargo for subsidy strings (#9619)
|
||||||
|
Fix #9614: Refresh rate dropdown was still active when vsync was enabled (#9618)
|
||||||
|
Fix: Don't use 'server address' string in server list when displaying an invite code (#9615)
|
||||||
|
|
||||||
|
|
||||||
|
12.0 (2021-10-17)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Add: [Network] Keep the refresh button in lowered state while refreshing (#9600)
|
||||||
|
Add: Console command to list search directories for various things (#9583)
|
||||||
|
Fix: Try all possible reverse directions when a ship reaches a dead end (#9610)
|
||||||
|
Fix: Incorrect Romanian own name (#9598)
|
||||||
|
Fix #9591: Update station docking tiles upon placing a water object on a docking tile (#9594)
|
||||||
|
Fix #9548: [Squirrel] Crash during engine cleanup after reaching memory limit on realloc (#9592)
|
||||||
|
Fix #9588: [Squirrel] Reaching memory limit during script registration could prevent further script detections (#9589)
|
||||||
|
Fix: Make ships more likely to find their destination at the cost of slightly worse paths (#9576)
|
||||||
|
Change: Reverse ship when leaving docks if a better path exists (#9610)
|
||||||
|
Change: Allow all tiles around docks to be docking tiles (#9578)
|
||||||
|
|
||||||
|
|
||||||
|
12.0-RC1 (2021-09-25)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Feature: Display icon/text whether vehicle is lost in vehicle (list) window (#9543)
|
||||||
|
Feature: [MacOS] Add selected toolbar buttons to MacBook Pro Touch Bar (#9511)
|
||||||
|
Feature: Button to open order window from vehicle shared orders window (#9325)
|
||||||
|
Feature: Ctrl-Clicking shared order vehicle list opens order window (#9325)
|
||||||
|
Feature: Multiple rotating views on title screen (#8980)
|
||||||
|
Feature: Hide block signals in GUI by default (#8688)
|
||||||
|
Add: [Script] Allow GameScripts to build neutral objects (#9568)
|
||||||
|
Add: [Network] Allow sending chat messages via admin port (#9563)
|
||||||
|
Add: [AI/GS] Missing water related functions and objects (#8390)
|
||||||
|
Fix: Industry funding window did not update when changing funding method (#9572)
|
||||||
|
Fix #9562: [NewGRF] Handle case of invalid Action2 with zero results (#9564)
|
||||||
|
Fix: Incorrect error messages when placing water in scenario editor (#9560)
|
||||||
|
Fix #9484: Update locale currencies settings config map (#9559)
|
||||||
|
Fix: Prevent train reversing when entirely inside a train depot (#9557)
|
||||||
|
Fix: [Network] Add back 'Spectate' option to company toolbar menu (#9556)
|
||||||
|
Fix #9463: [Win32] Work around XAudio2 crashes (#9549)
|
||||||
|
Fix #8603: Don't give focus to text filter when opening Object GUI (#9547)
|
||||||
|
Fix #9241: Grove and forest tree brushes did not also create rainforest terrain (#9542)
|
||||||
|
Fix: [Network] Several crashes in our network code (#9534, #9456)
|
||||||
|
Fix #9527: Crash when trying to place multi-tile objects at map edge (#9529)
|
||||||
|
Fix: [Network] SendCmdNames only sent one name per packet (#9528)
|
||||||
|
Fix #9407: Desync when founding a town nearby a station (#9526)
|
||||||
|
Fix #9521: Don't load at just removed docks that were part of a multi-dock station (#9524)
|
||||||
|
Fix: Ships always tried to avoid docking tiles when pathfinding (even if nothing was on them) (#9522)
|
||||||
|
Fix: [Network] Convert server_advertise to server_game_type in config file (#9515)
|
||||||
|
Fix #9490: [Network] A full server couldn't be queried (#9508)
|
||||||
|
Fix: [Network] Don't show GameScript " (v0)" for old servers (#9507)
|
||||||
|
Fix: [Network] Show query errors in the server listing instead of error popup (#9506)
|
||||||
|
Fix: [Network] Crash when last-joined server was no longer available (#9503)
|
||||||
|
Fix #9501: [Network] Crash when more than one game-info query was pending (#9502)
|
||||||
|
Fix: Wrong error message when building canals over ship depots / locks (#9410)
|
||||||
|
Fix: Reduce cost of building canals over objects on sea (#9410)
|
||||||
|
Change: [Linkgraph] Delete links only served by vehicles stopped in depot (#9499)
|
||||||
|
|
||||||
|
|
||||||
|
12.0-beta2 (2021-08-19)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Feature: [Linkgraph] Prioritize faster routes for passengers, mail and express cargo (#9457)
|
||||||
|
Fix: Wrong town window refreshed when building an airport with noise levels enabled (#9497)
|
||||||
|
Fix: Improve wording of network-related messages (#9494, #9495, #9500)
|
||||||
|
Fix: [Network] Report reuse of invite-code (#9487)
|
||||||
|
Fix: [Network] Connecting with the same client name thrice hangs the server (#9485)
|
||||||
|
|
||||||
|
|
||||||
12.0-beta1 (2021-08-15)
|
12.0-beta1 (2021-08-15)
|
||||||
------------------------------------------------------------------------
|
------------------------------------------------------------------------
|
||||||
Feature: [Network] Remove lobby window; pressing "Join Game" now immediately joins a server (#9467)
|
Feature: [Network] Remove lobby window; pressing "Join Game" now immediately joins a server (#9467)
|
||||||
|
87
cmake/CheckAtomic.cmake
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
# atomic builtins are required for threading support.
|
||||||
|
|
||||||
|
INCLUDE(CheckCXXSourceCompiles)
|
||||||
|
INCLUDE(CheckLibraryExists)
|
||||||
|
|
||||||
|
# Sometimes linking against libatomic is required for atomic ops, if
|
||||||
|
# the platform doesn't support lock-free atomics.
|
||||||
|
|
||||||
|
function(check_working_cxx_atomics varname)
|
||||||
|
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++17")
|
||||||
|
check_cxx_source_compiles("
|
||||||
|
#include <atomic>
|
||||||
|
std::atomic<int> x;
|
||||||
|
std::atomic<short> y;
|
||||||
|
std::atomic<char> z;
|
||||||
|
int main() {
|
||||||
|
++z;
|
||||||
|
++y;
|
||||||
|
return ++x;
|
||||||
|
}
|
||||||
|
" ${varname})
|
||||||
|
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
|
||||||
|
endfunction(check_working_cxx_atomics)
|
||||||
|
|
||||||
|
function(check_working_cxx_atomics64 varname)
|
||||||
|
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-std=c++17 ${CMAKE_REQUIRED_FLAGS}")
|
||||||
|
check_cxx_source_compiles("
|
||||||
|
#include <atomic>
|
||||||
|
#include <cstdint>
|
||||||
|
std::atomic<uint64_t> x (0);
|
||||||
|
int main() {
|
||||||
|
uint64_t i = x.load(std::memory_order_relaxed);
|
||||||
|
(void)i;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
" ${varname})
|
||||||
|
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
|
||||||
|
endfunction(check_working_cxx_atomics64)
|
||||||
|
|
||||||
|
|
||||||
|
# Check for (non-64-bit) atomic operations.
|
||||||
|
if(MSVC)
|
||||||
|
set(HAVE_CXX_ATOMICS_WITHOUT_LIB True)
|
||||||
|
else()
|
||||||
|
# First check if atomics work without the library.
|
||||||
|
check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
||||||
|
# If not, check if the library exists, and atomics work with it.
|
||||||
|
if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
||||||
|
check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)
|
||||||
|
if(HAVE_LIBATOMIC)
|
||||||
|
list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
|
||||||
|
check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB)
|
||||||
|
if (NOT HAVE_CXX_ATOMICS_WITH_LIB)
|
||||||
|
message(FATAL_ERROR "Host compiler must support std::atomic!")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Check for 64 bit atomic operations.
|
||||||
|
if(MSVC)
|
||||||
|
set(HAVE_CXX_ATOMICS64_WITHOUT_LIB True)
|
||||||
|
else()
|
||||||
|
# First check if atomics work without the library.
|
||||||
|
check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB)
|
||||||
|
# If not, check if the library exists, and atomics work with it.
|
||||||
|
if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB)
|
||||||
|
check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64)
|
||||||
|
if(HAVE_CXX_LIBATOMICS64)
|
||||||
|
list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
|
||||||
|
check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB)
|
||||||
|
if (NOT HAVE_CXX_ATOMICS64_WITH_LIB)
|
||||||
|
message(FATAL_ERROR "Host compiler must support 64-bit std::atomic!")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "Host compiler appears to require libatomic for 64-bit operations, but cannot find it.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(HAVE_CXX_ATOMICS_WITH_LIB OR HAVE_CXX_ATOMICS64_WITH_LIB)
|
||||||
|
target_link_libraries(openttd atomic)
|
||||||
|
endif()
|
@@ -43,6 +43,11 @@ macro(compile_flags)
|
|||||||
add_link_options(
|
add_link_options(
|
||||||
"$<$<NOT:$<CONFIG:Debug>>:-fstack-protector>" # Prevent undefined references when _FORTIFY_SOURCE > 0
|
"$<$<NOT:$<CONFIG:Debug>>:-fstack-protector>" # Prevent undefined references when _FORTIFY_SOURCE > 0
|
||||||
)
|
)
|
||||||
|
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
|
add_compile_options(
|
||||||
|
"$<$<CONFIG:Debug>:-Wa,-mbig-obj>" # Switch to pe-bigobj-x86-64 as x64 Debug builds push pe-x86-64 to the limits (linking errors with ASLR, ...)
|
||||||
|
)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Prepare a generator that checks if we are not a debug, and don't have asserts
|
# Prepare a generator that checks if we are not a debug, and don't have asserts
|
||||||
@@ -51,6 +56,11 @@ macro(compile_flags)
|
|||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
add_compile_options(/W3)
|
add_compile_options(/W3)
|
||||||
|
if(MSVC_VERSION GREATER 1929 AND CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||||
|
# Starting with version 19.30, there is an optimisation bug, see #9966 for details
|
||||||
|
# This flag disables the broken optimisation to work around the bug
|
||||||
|
add_compile_options(/d2ssa-rse-)
|
||||||
|
endif()
|
||||||
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
|
||||||
add_compile_options(
|
add_compile_options(
|
||||||
-W
|
-W
|
||||||
@@ -126,6 +136,10 @@ macro(compile_flags)
|
|||||||
# -flifetime-dse=2 (default since GCC 6) doesn't play
|
# -flifetime-dse=2 (default since GCC 6) doesn't play
|
||||||
# well with our custom pool item allocator
|
# well with our custom pool item allocator
|
||||||
"$<$<BOOL:${LIFETIME_DSE_FOUND}>:-flifetime-dse=1>"
|
"$<$<BOOL:${LIFETIME_DSE_FOUND}>:-flifetime-dse=1>"
|
||||||
|
|
||||||
|
# We have a fight between clang wanting std::move() and gcc not wanting it
|
||||||
|
# and of course they both warn when the other compiler is happy
|
||||||
|
"-Wno-redundant-move"
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@@ -122,6 +122,8 @@ set(CPACK_STRIP_FILES YES)
|
|||||||
set(CPACK_OUTPUT_FILE_PREFIX "bundles")
|
set(CPACK_OUTPUT_FILE_PREFIX "bundles")
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
|
# Stripping would produce unreadable stacktraces.
|
||||||
|
set(CPACK_STRIP_FILES NO)
|
||||||
set(CPACK_GENERATOR "Bundle")
|
set(CPACK_GENERATOR "Bundle")
|
||||||
include(PackageBundle)
|
include(PackageBundle)
|
||||||
|
|
||||||
@@ -129,7 +131,7 @@ if(APPLE)
|
|||||||
set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-macos-universal")
|
set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-macos-universal")
|
||||||
else()
|
else()
|
||||||
set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-macos-${CPACK_SYSTEM_NAME}")
|
set(CPACK_PACKAGE_FILE_NAME "openttd-#CPACK_PACKAGE_VERSION#-macos-${CPACK_SYSTEM_NAME}")
|
||||||
endif()
|
endif()
|
||||||
elseif(WIN32)
|
elseif(WIN32)
|
||||||
set(CPACK_GENERATOR "ZIP")
|
set(CPACK_GENERATOR "ZIP")
|
||||||
if(OPTION_USE_NSIS)
|
if(OPTION_USE_NSIS)
|
||||||
@@ -181,6 +183,10 @@ elseif(UNIX)
|
|||||||
if(DISTRO_ID STREQUAL "arch")
|
if(DISTRO_ID STREQUAL "arch")
|
||||||
set(PLATFORM "arch")
|
set(PLATFORM "arch")
|
||||||
set(CPACK_GENERATOR "TXZ")
|
set(CPACK_GENERATOR "TXZ")
|
||||||
|
elseif(DISTRO_ID STREQUAL "fedora" OR DISTRO_ID STREQUAL "rhel")
|
||||||
|
set(PLATFORM "fedora")
|
||||||
|
set(CPACK_GENERATOR "RPM")
|
||||||
|
include(PackageRPM)
|
||||||
else()
|
else()
|
||||||
set(UNSUPPORTED_PLATFORM_NAME "Linux distribution '${DISTRO_ID}' from /etc/os-release")
|
set(UNSUPPORTED_PLATFORM_NAME "Linux distribution '${DISTRO_ID}' from /etc/os-release")
|
||||||
endif()
|
endif()
|
||||||
|
@@ -18,6 +18,6 @@ function(link_package NAME)
|
|||||||
message(STATUS "${NAME} found -- -DWITH_${UCNAME} -- ${${NAME}_INCLUDE_DIRS} ${${NAME}_INCLUDE_DIR} -- ${${NAME}_LIBRARIES} ${${NAME}_LIBRARY}")
|
message(STATUS "${NAME} found -- -DWITH_${UCNAME} -- ${${NAME}_INCLUDE_DIRS} ${${NAME}_INCLUDE_DIR} -- ${${NAME}_LIBRARIES} ${${NAME}_LIBRARY}")
|
||||||
endif()
|
endif()
|
||||||
elseif(LP_ENCOURAGED)
|
elseif(LP_ENCOURAGED)
|
||||||
message(WARNING "${NAME} not found; compiling OpenTTD without ${NAME} is strongly disencouraged")
|
message(WARNING "${NAME} not found; compiling OpenTTD without ${NAME} is strongly discouraged")
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
source_group("AI Core" REGULAR_EXPRESSION "src/ai/")
|
source_group("AI Core" REGULAR_EXPRESSION "src/ai/")
|
||||||
source_group("Blitters" REGULAR_EXPRESSION "src/blitter/")
|
source_group("Blitters" REGULAR_EXPRESSION "src/blitter/")
|
||||||
source_group("Core Source Code" REGULAR_EXPRESSION "src/core/")
|
source_group("Core Source Code" REGULAR_EXPRESSION "src/core/")
|
||||||
|
source_group("Font Cache" REGULAR_EXPRESSION "src/fontcache/")
|
||||||
source_group("Game Core" REGULAR_EXPRESSION "src/game/")
|
source_group("Game Core" REGULAR_EXPRESSION "src/game/")
|
||||||
source_group("MD5" REGULAR_EXPRESSION "src/3rdparty/md5/")
|
source_group("MD5" REGULAR_EXPRESSION "src/3rdparty/md5/")
|
||||||
source_group("Misc" REGULAR_EXPRESSION "src/misc/")
|
source_group("Misc" REGULAR_EXPRESSION "src/misc/")
|
||||||
|
@@ -56,7 +56,7 @@ function(set_options)
|
|||||||
|
|
||||||
option(OPTION_DEDICATED "Build dedicated server only (no GUI)" OFF)
|
option(OPTION_DEDICATED "Build dedicated server only (no GUI)" OFF)
|
||||||
option(OPTION_INSTALL_FHS "Install with Filesystem Hierarchy Standard folders" ${DEFAULT_OPTION_INSTALL_FHS})
|
option(OPTION_INSTALL_FHS "Install with Filesystem Hierarchy Standard folders" ${DEFAULT_OPTION_INSTALL_FHS})
|
||||||
option(OPTION_USE_ASSERTS "Use assertions; leave enabled for nightlies, betas, and RCs" ON)
|
option(OPTION_USE_ASSERTS "Use assertions; leave enabled for nightlies, betas, and RCs" OFF)
|
||||||
if(EMSCRIPTEN)
|
if(EMSCRIPTEN)
|
||||||
# Although pthreads is supported, it is not in a way yet that is
|
# Although pthreads is supported, it is not in a way yet that is
|
||||||
# useful for us.
|
# useful for us.
|
||||||
|
1
cmake/PackageRPM.cmake
Normal file
@@ -0,0 +1 @@
|
|||||||
|
set(CPACK_RPM_PACKAGE_ARCHITECTURE "${ARCHITECTURE}")
|
@@ -13,6 +13,7 @@ cmake_minimum_required(VERSION 3.5)
|
|||||||
# The parameter "enumname" specifies the enumeration to extract. This can also be a regular expression.
|
# The parameter "enumname" specifies the enumeration to extract. This can also be a regular expression.
|
||||||
# The parameter "filename" specifies the relative path to the file, where the enumeration is extracted from. This can also be a glob expression.
|
# The parameter "filename" specifies the relative path to the file, where the enumeration is extracted from. This can also be a glob expression.
|
||||||
#
|
#
|
||||||
|
# All files where enumerations are extracted from are automatically added via #include
|
||||||
#
|
#
|
||||||
|
|
||||||
if(NOT GENERATE_SOURCE_FILE)
|
if(NOT GENERATE_SOURCE_FILE)
|
||||||
@@ -41,6 +42,7 @@ foreach(ENUM IN LISTS ENUM_LINES)
|
|||||||
|
|
||||||
string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" FILE ${FILE})
|
string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" FILE ${FILE})
|
||||||
string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}/* automatically generated from ${FILE} */")
|
string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}/* automatically generated from ${FILE} */")
|
||||||
|
list(APPEND INCLUDES "#include \"${FILE}\"")
|
||||||
|
|
||||||
foreach(LINE IN LISTS SOURCE_LINES)
|
foreach(LINE IN LISTS SOURCE_LINES)
|
||||||
string(REPLACE "${RM_INDENT}" "" LINE "${LINE}")
|
string(REPLACE "${RM_INDENT}" "" LINE "${LINE}")
|
||||||
@@ -116,4 +118,7 @@ foreach(ENUM IN LISTS ENUM_LINES)
|
|||||||
endforeach()
|
endforeach()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
|
list(REMOVE_DUPLICATES INCLUDES)
|
||||||
|
string(REPLACE ";" "\n" INCLUDES "${INCLUDES}")
|
||||||
|
|
||||||
configure_file(${GENERATE_SOURCE_FILE} ${GENERATE_BINARY_FILE})
|
configure_file(${GENERATE_SOURCE_FILE} ${GENERATE_BINARY_FILE})
|
||||||
|
@@ -35,6 +35,7 @@ execute_process(COMMAND ${OPENTTD_EXECUTABLE}
|
|||||||
-vnull:ticks=30000
|
-vnull:ticks=30000
|
||||||
-d script=2
|
-d script=2
|
||||||
-d misc=9
|
-d misc=9
|
||||||
|
-Q
|
||||||
OUTPUT_VARIABLE REGRESSION_OUTPUT
|
OUTPUT_VARIABLE REGRESSION_OUTPUT
|
||||||
ERROR_VARIABLE REGRESSION_RESULT
|
ERROR_VARIABLE REGRESSION_RESULT
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
@@ -342,7 +342,7 @@ foreach(LINE IN LISTS SOURCE_LINES)
|
|||||||
else()
|
else()
|
||||||
string(APPEND SQUIRREL_EXPORT "\n SQ${API_CLS}.PreRegister(engine, \"${API_SUPER_CLS}\");")
|
string(APPEND SQUIRREL_EXPORT "\n SQ${API_CLS}.PreRegister(engine, \"${API_SUPER_CLS}\");")
|
||||||
endif()
|
endif()
|
||||||
if(NOT "${SUPER_CLS}" STREQUAL "ScriptEvent")
|
if(NOT "${SUPER_CLS}" MATCHES "^ScriptEvent")
|
||||||
if("${CLS_PARAM_2}" STREQUAL "v")
|
if("${CLS_PARAM_2}" STREQUAL "v")
|
||||||
string(APPEND SQUIRREL_EXPORT "\n SQ${API_CLS}.AddSQAdvancedConstructor(engine);")
|
string(APPEND SQUIRREL_EXPORT "\n SQ${API_CLS}.AddSQAdvancedConstructor(engine);")
|
||||||
else()
|
else()
|
||||||
|
@@ -12,32 +12,11 @@ endif()
|
|||||||
if(NOT APIUC)
|
if(NOT APIUC)
|
||||||
message(FATAL_ERROR "Script needs APIUC defined")
|
message(FATAL_ERROR "Script needs APIUC defined")
|
||||||
endif()
|
endif()
|
||||||
|
if(NOT API_FILES)
|
||||||
|
message(FATAL_ERROR "Script needs API_FILES defined")
|
||||||
|
endif()
|
||||||
|
|
||||||
set(ARGC 1)
|
file(READ "${API_FILES}" SCRIPT_API_BINARY_FILES)
|
||||||
set(ARG_READ NO)
|
|
||||||
|
|
||||||
# For MSVC CMake runs this script from a batch file using || to detect errors,
|
|
||||||
# depending on source path it may quote args, and cause cmd to not understand ||
|
|
||||||
# and pass it as argument to ourself.
|
|
||||||
# Read all the arguments given to CMake; we are looking for -- and everything
|
|
||||||
# that follows, until ||. Those are our api files.
|
|
||||||
while(ARGC LESS CMAKE_ARGC)
|
|
||||||
set(ARG ${CMAKE_ARGV${ARGC}})
|
|
||||||
|
|
||||||
if(ARG STREQUAL "||")
|
|
||||||
set(ARG_READ NO)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(ARG_READ)
|
|
||||||
list(APPEND SCRIPT_API_BINARY_FILES "${ARG}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(ARG STREQUAL "--")
|
|
||||||
set(ARG_READ YES)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
math(EXPR ARGC "${ARGC} + 1")
|
|
||||||
endwhile()
|
|
||||||
|
|
||||||
foreach(FILE IN LISTS SCRIPT_API_BINARY_FILES)
|
foreach(FILE IN LISTS SCRIPT_API_BINARY_FILES)
|
||||||
file(STRINGS "${FILE}" LINES REGEX "^void SQ${APIUC}.*_Register\\(Squirrel \\*engine\\)$")
|
file(STRINGS "${FILE}" LINES REGEX "^void SQ${APIUC}.*_Register\\(Squirrel \\*engine\\)$")
|
||||||
|
117
docs/eints.md
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
# Translations for OpenTTD
|
||||||
|
|
||||||
|
Eints is [OpenTTD's WebTranslator](https://translator.openttd.org/).
|
||||||
|
|
||||||
|
- Registered translators translate from English to their language.
|
||||||
|
- Eints validates the translations syntactically and that parameter usage matches the English base language.
|
||||||
|
- Eints synchronises translations to OpenTTD's repository every day, shortly before the nightly build.
|
||||||
|
|
||||||
|
When adding or altering strings in english.txt, you should stick to some rules, so translations are handled smoothly by Eints and translators.
|
||||||
|
This document gives some guidelines.
|
||||||
|
|
||||||
|
|
||||||
|
## I want to change a translation.
|
||||||
|
|
||||||
|
### I want to become a regular translator.
|
||||||
|
|
||||||
|
Just [sign up](https://github.com/OpenTTD/team/issues/new/choose) as a translator.
|
||||||
|
|
||||||
|
### I only want to point out some issues / typos in the current translation, or suggest a change.
|
||||||
|
|
||||||
|
[Open an issue](https://github.com/OpenTTD/OpenTTD/issues/new/choose), so it can be assigned to the translation team of the language.
|
||||||
|
The translators will decide whether, where and how to apply your suggestion.
|
||||||
|
|
||||||
|
### I want to submit translations via PR.
|
||||||
|
|
||||||
|
Sorry, we don't offer this option.
|
||||||
|
|
||||||
|
### I want to change the language definition (plural form, genders, cases) of a translation.
|
||||||
|
|
||||||
|
Please [create an issue](https://github.com/OpenTTD/OpenTTD/issues/new/choose) for this.
|
||||||
|
|
||||||
|
### I want to add an entirely new translation language.
|
||||||
|
|
||||||
|
OpenTTD has more than 4000 strings, translating all of them is a lot of work.
|
||||||
|
Despite the initial enthusiasm, only few people have the endurance to get to even 20% translation progress.
|
||||||
|
|
||||||
|
As such, starting a new translation requires the prospect that there is also translation interest in the future.
|
||||||
|
And, frankly, OpenTTD probably already covers all languages to which this applies, and a few more.
|
||||||
|
|
||||||
|
If you still want to make the case, that your language is spoken by several 100 million people, please [create an issue](https://github.com/OpenTTD/OpenTTD/issues/new/choose) for adding a new language.
|
||||||
|
|
||||||
|
|
||||||
|
## I want to change the English base language (english.txt).
|
||||||
|
|
||||||
|
### I want to change the wording / fix a typo in an English string, without changing the meaning (drastically).
|
||||||
|
|
||||||
|
Just change it in your PR.
|
||||||
|
|
||||||
|
Translators will be notified that their translation became "outdated", so they can double-check whether the translation needs updating.
|
||||||
|
|
||||||
|
### I want to add/change/remove parameters from an English string.
|
||||||
|
|
||||||
|
Just change the parameters in english.txt in your PR.
|
||||||
|
Don't touch the translations, please ignore compile warnings about them.
|
||||||
|
|
||||||
|
Translators will be notified that their translation became "invalid", so they can adjust the translation.
|
||||||
|
Eints will remember the old translations for translators to view, but remove them from the git repository, while they are "invalid"; so there won't be any compile warnings after the nightly sync.
|
||||||
|
|
||||||
|
### I want to change the meaning of an English string, so that no existing translation makes any sense anymore.
|
||||||
|
|
||||||
|
In this case, please change the STR_xxx string identifier of the string; basically: remove the old string, add a new one.
|
||||||
|
Don't touch the translations, please ignore compile warnings about them.
|
||||||
|
|
||||||
|
Eints will discard all memory of the old strings in the nightly sync, and translators can start fresh with a new string.
|
||||||
|
|
||||||
|
### I want to add a new string.
|
||||||
|
|
||||||
|
Add the new string somewhere in english.txt, where it fits with the neighbouring strings.
|
||||||
|
Don't touch the translations, even if you can speak some of the languages.
|
||||||
|
|
||||||
|
### I want to remove an unused string.
|
||||||
|
|
||||||
|
Remove the string from english.txt.
|
||||||
|
Don't touch the translations, please ignore compile warnings about them.
|
||||||
|
|
||||||
|
Eints will remove the translations from the git repository in the nightly sync.
|
||||||
|
|
||||||
|
### I want to reorder strings in english.txt without changing them.
|
||||||
|
|
||||||
|
Reorder english.txt as you like. Don't touch the translations.
|
||||||
|
|
||||||
|
Eints will reorder all translations to match english.txt in the nightly sync.
|
||||||
|
|
||||||
|
### I want to add/change '#' comments.
|
||||||
|
|
||||||
|
Change comments in english.txt as you like. Don't touch the translations.
|
||||||
|
|
||||||
|
Eints will replicate comments into all translations in the nightly sync. Comments are not translated.
|
||||||
|
|
||||||
|
### I want to change the STR_xxx string identifier for code style reasons, without changing the English text.
|
||||||
|
|
||||||
|
This is the only case, where your PR should also edit translations.
|
||||||
|
The STR_xxx string identifier is used by Eints as key value to track strings and translations. If you change it, that's the same as deleting a string and adding an unrelated new one.
|
||||||
|
So, to keep translations, you have to replace the STR_xxx for all translations in the PR as well.
|
||||||
|
|
||||||
|
However, you will only be able to keep the translations which are part of the git repository.
|
||||||
|
Translation history and information about translations being "outdated" will be lost.
|
||||||
|
So, keep your code style OCD to a minimum :)
|
||||||
|
|
||||||
|
|
||||||
|
## I want to fight a bot and lose.
|
||||||
|
|
||||||
|
Here are some things, people sometimes want to do, but which won't work.
|
||||||
|
|
||||||
|
### I want to enforce re-translation by clearing current translations.
|
||||||
|
|
||||||
|
You have to change the STR_xxx string identifier, that's the only option.
|
||||||
|
|
||||||
|
You cannot "clear" translations by removing them via PR; eints will reinstall the previous "syntactically perfect valid" translation.
|
||||||
|
|
||||||
|
### I want to revert a broken change, some translator just did via eints.
|
||||||
|
|
||||||
|
You have to revert the translations via the WebTranslator interface.
|
||||||
|
If there are many changes, ask someone with Admin access to eints, so they can manually upload a fixed translation file to eints.
|
||||||
|
|
||||||
|
You cannot revert translations changes via PR. Eints merges translations from git and from web by keeping a translation history, and committing the newest translation to git.
|
||||||
|
If you revert to an old translation in git, eints will simply think git did not yet get the newer translation, and commit it again.
|
@@ -79,7 +79,7 @@ the array so you can quickly see what is used and what is not.
|
|||||||
<tr>
|
<tr>
|
||||||
<td rowspan="2">0</td>
|
<td rowspan="2">0</td>
|
||||||
<td class="caption">ground</td>
|
<td class="caption">ground</td>
|
||||||
<td class="bits" rowspan=27><span class="used" title="Tile type">XXXX</span> <span class="used" title="Presence and direction of bridge above">XX</span> <span class="used" title="Tropic Zone: only meaningfull in tropic climate. It contains the definition of the available zones">XX</span></td>
|
<td class="bits" rowspan=27><span class="used" title="Tile type">XXXX</span> <span class="used" title="Presence and direction of bridge above">XX</span> <span class="used" title="Tropic Zone: only meaningful in tropic climate. It contains the definition of the available zones">XX</span></td>
|
||||||
<td class="bits" rowspan=27><span class="used" title="Tile height">XXXX XXXX</span></td>
|
<td class="bits" rowspan=27><span class="used" title="Tile height">XXXX XXXX</span></td>
|
||||||
<td class="bits" rowspan=2><span class="free">OOO</span><span class="usable" title="Owner (always OWNER_NONE)">1 OOOO</span></td>
|
<td class="bits" rowspan=2><span class="free">OOO</span><span class="usable" title="Owner (always OWNER_NONE)">1 OOOO</span></td>
|
||||||
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
|
<td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
|
||||||
|
@@ -1,225 +1,207 @@
|
|||||||
# Multiplayer manual for OpenTTD
|
# Multiplayer manual for OpenTTD
|
||||||
|
|
||||||
Last updated: 2011-02-16
|
|
||||||
|
|
||||||
|
|
||||||
## Table of contents
|
## Table of contents
|
||||||
|
|
||||||
- 1.0) [Starting a server](#10-starting-a-server)
|
- 1.0) [Starting a server](#10-starting-a-server)
|
||||||
- 2.0) [Connecting to a server](#20-connecting-to-a-server)
|
- 2.0) [Connecting to a server](#20-connecting-to-a-server)
|
||||||
- 2.1) [Connecting to a server over the console](#21-connecting-to-a-server-over-the-console)
|
- 2.1) [Connecting to a server over the console](#21-connecting-to-a-server-over-the-console)
|
||||||
- 3.0) [Playing internet games](#30-playing-internet-games)
|
- 3.0) [Playing internet games](#30-playing-internet-games)
|
||||||
- 4.0) [Tips for servers](#40-tips-for-servers)
|
- 4.0) [Tips for servers](#40-tips-for-servers)
|
||||||
- 4.1)[Imposing landscaping limits](#41-imposing-landscaping-limits)
|
- 4.1)[Imposing landscaping limits](#41-imposing-landscaping-limits)
|
||||||
- 5.0) [Some useful things](#50-some-useful-things)
|
- 5.0) [Some useful things](#50-some-useful-things)
|
||||||
- 6.0) [Troubleshooting](#60-troubleshooting)
|
- 6.0) [Troubleshooting](#60-troubleshooting)
|
||||||
|
|
||||||
|
|
||||||
## 1.0) Starting a server
|
## 1.0) Starting a server
|
||||||
|
|
||||||
- Make sure that you have your firewall of the computer as well as possible
|
- Click on "Multiplayer" in the Start Menu.
|
||||||
routers or modems of the server configured such that:
|
- Click on "Start Server".
|
||||||
- port 3979 is free for both UDP and TCP connections in- and outgoing
|
- Give your server a name.
|
||||||
- port 3978 is free outbound for UDP in order to advertise with the master
|
- Select the visibility of your server:
|
||||||
server (if desired). Otherwise you'll have to tell players your IP.
|
- "Public": your server will be publicly listed.
|
||||||
- port 3977 if use of the admin interface is desired (see admin_network.txt)
|
- "Invite Only": only players who have the invite code for your server can
|
||||||
- Click "multiplayer" on the startup screen
|
join.
|
||||||
- Click "start server"
|
- "Local": only players on your local network can join.
|
||||||
- Type in a game name
|
- (optional) Set a password for your server.
|
||||||
- Select the type of game ('LAN/Internet' or 'Internet (advertise)'. With the
|
- Click "New Game", "Load Game", or "Play Scenario".
|
||||||
last one other people are able to see you online. Else they need your IP and
|
- Start playing.
|
||||||
port to join)
|
|
||||||
- Click "start game", "load game" or "load scenario"
|
|
||||||
- Start playing
|
|
||||||
|
|
||||||
|
|
||||||
## 2.0) Connecting to a server
|
## 2.0) Connecting to a server
|
||||||
|
|
||||||
- Click "multiplayer" on the startup screen
|
- Click on "Multiplayer" in the Start Menu.
|
||||||
- If you want to connect to any network game in your LAN click on 'LAN', then
|
- There are three ways to join a server:
|
||||||
on 'Find Server'
|
- If you want to connect to a local server, click "Search LAN".
|
||||||
- If you want to see which servers all online on the Internet, click on
|
- If you want to connect to a public game, click "Search internet".
|
||||||
'Internet' and 'Find Server'
|
- If the server-owner shared an invite code with you:
|
||||||
- If there were more than one server
|
- Click "Add Server".
|
||||||
- select one in the list below the buttons
|
- Fill in the invite code, which always starts with a `+`.
|
||||||
- click on 'join game'
|
- Click "OK".
|
||||||
- If you want to play and you have the ip or hostname of the game server you
|
- Click on the server you want to join.
|
||||||
want connect to.
|
- Click "Join Game".
|
||||||
- click add server
|
- If the server has a password, it will ask you for this.
|
||||||
- type in the ip address or hostname
|
- You see a progressbar how far you are with joining the server.
|
||||||
- if you want to add a port use :<port>
|
- Happy playing.
|
||||||
- If you want to play and you have the invite code of the game server you
|
|
||||||
want connect to.
|
|
||||||
- click add server
|
|
||||||
- type in the invite code
|
|
||||||
- Now you can select a company and press: "Join company", to help that company
|
|
||||||
- Or you can press "Spectate game", to spectate the game
|
|
||||||
- Or you can press "New company", and start your own company (if there are
|
|
||||||
slots free)
|
|
||||||
- You see a progressbar how far you are with joining the server.
|
|
||||||
- Happy playing
|
|
||||||
|
|
||||||
## 2.1) Connecting to a server over the console
|
## 2.1) Connecting to a server over the console
|
||||||
|
|
||||||
- Open the console and type in the following command:
|
- Open the console and type `connect` for help how to connect via the console.
|
||||||
connect `<ip/host>:<port>#<company-no>`
|
|
||||||
|
|
||||||
|
|
||||||
## 3.0) Playing internet games
|
## 3.0) Playing internet games
|
||||||
|
|
||||||
- Servers with a red dot behind it have a different version then you have. You
|
- Servers with a red dot behind it have a different version then you have. You
|
||||||
will not be able to join those servers.
|
will not be able to join those servers.
|
||||||
|
|
||||||
- Servers with a yellow dot behind it have NewGRFs that you do not have. You
|
- Servers with a yellow dot behind it have NewGRFs that you do not have. You
|
||||||
will not be able to join those servers. However, via "NewGRF Settings" and
|
will not be able to join those servers. However, via "NewGRF Settings" and
|
||||||
"Find missing content online" you might be able to download the needed
|
"Find missing content online" you might be able to download the needed
|
||||||
NewGRFs after which you can join the server.
|
NewGRFs after which you can join the server.
|
||||||
|
|
||||||
- It can happen that a connection is that slow, or you have that many clients
|
- It can happen that a connection is that slow, or you have that many clients
|
||||||
connected to your server, that your clients start to loose their connection.
|
connected to your server, that your clients start to loose their connection.
|
||||||
Some things you can do about it:
|
Some things you can do about it:
|
||||||
- [network] frame_freq:
|
- `[network] frame_freq`:
|
||||||
change it in console with: 'set network.frame_freq <number>'
|
change it in console with: `set network.frame_freq <number>`
|
||||||
the number should be between the 0 and 10, not much higher. It indicates
|
the number should be between the 0 and 10, not much higher. It indicates
|
||||||
the delay between clicking and showing up. The higher, the more you notice
|
the delay between clicking and showing up. The higher, the more you notice
|
||||||
it, but the less bandwidth you use.
|
it, but the less bandwidth you use.
|
||||||
A good value for Internet-games is 2 or 3.
|
A good value for Internet-games is 2 or 3.
|
||||||
|
|
||||||
- [network] sync_freq:
|
- `[network] sync_freq`:
|
||||||
change it in console with: 'set network.sync_freq <number>'
|
change it in console with: `set network.sync_freq <number>`
|
||||||
the number should be between the 50 and 1000, not much lower, not much
|
the number should be between the 50 and 1000, not much lower, not much
|
||||||
higher. It indicates the time between sync-frames. A sync-frame is a frame
|
higher. It indicates the time between sync-frames. A sync-frame is a frame
|
||||||
which checks if all clients are still in sync. When the value it too high,
|
which checks if all clients are still in sync. When the value it too high,
|
||||||
clients can desync in 1960, but the server detects it in 1970. Not really
|
clients can desync in 1960, but the server detects it in 1970. Not really
|
||||||
handy. The lower the value, the more bandwidth it uses.
|
handy. The lower the value, the more bandwidth it uses.
|
||||||
|
|
||||||
NB: changing frame_freq has more effect on the bandwidth then sync_freq.
|
|
||||||
|
|
||||||
|
NB: changing `frame_freq` has more effect on the bandwidth then `sync_freq`.
|
||||||
|
|
||||||
## 4.0) Tips for servers
|
## 4.0) Tips for servers
|
||||||
|
|
||||||
- You can launch a dedicated server by adding -D as parameter.
|
- You can launch a dedicated server by adding `-D` as parameter.
|
||||||
- In UNIX like systems, you can fork your dedicated server by adding -f as
|
- In UNIX like systems, you can fork your dedicated server by adding `-f` as
|
||||||
parameter.
|
parameter.
|
||||||
|
|
||||||
- You can automatically clean companies that do not have a client connected to
|
- You can automatically clean companies that do not have a client connected to
|
||||||
them, for, let's say, 3 years. You can do this via: 'set autoclean_companies'
|
them, for, let's say, 3 years. You can do this via: `set autoclean_companies`
|
||||||
and 'set autoclean_protected' and 'set autoclean_unprotected'. Unprotected
|
and `set autoclean_protected` and `set autoclean_unprotected`. Unprotected
|
||||||
removes a password from a company when it is not used for more then the
|
removes a password from a company when it is not used for more then the
|
||||||
defined amount of months. 'set autoclean_novehicles' can be used to remove
|
defined amount of months. `set autoclean_novehicles` can be used to remove
|
||||||
companies without any vehicles quickly.
|
companies without any vehicles quickly.
|
||||||
|
|
||||||
- You can also do this manually via the console: 'reset_company'.
|
- You can also do this manually via the console: `reset_company`.
|
||||||
|
|
||||||
- You can let your server automatically restart a map when, let's say, year 2030
|
- You can let your server automatically restart a map when, let's say,
|
||||||
is reached. See 'set restart_game_date' for detail.
|
year 2030 is reached. See `set restart_game_date` for detail.
|
||||||
|
|
||||||
- If you want to be on the server-list, make your server public. You can do
|
- If you want to be on the server-list, make your server public. You can do
|
||||||
this either from the Start Server GUI, via the in-game Online Players GUI,
|
this either from the Start Server window, via the in-game Online Players
|
||||||
or by typing in the console:
|
window, or by typing in the console: `set server_game_type public`.
|
||||||
'set server_game_type public'.
|
|
||||||
|
|
||||||
- You can protect your server with a password via the console: 'set server_pw',
|
- You can protect your server with a password via the console: `set server_pw`,
|
||||||
or via the Start Server menu.
|
or via the Start Server menu.
|
||||||
|
|
||||||
- When you have many clients connected to your server via Internet, watch your
|
- When you have many clients connected to your server via Internet, watch your
|
||||||
bandwidth (if you have any limit on it, set by your ISP). One client uses
|
bandwidth (if you have any limit on it, set by your ISP). One client uses
|
||||||
about 1.5 kilobytes per second up and down. To decrease this amount, setting
|
about 1.5 kilobytes per second up and down. To decrease this amount, setting
|
||||||
'frame_freq' to 1 will reduce it to roughly 1 kilobyte per second per client.
|
`frame_freq` to 1 will reduce it to roughly 1 kilobyte per second per client.
|
||||||
|
|
||||||
- OpenTTD's default settings for maximum number of clients, and amount of data
|
- OpenTTD's default settings for maximum number of clients, and amount of data
|
||||||
from clients to process are chosen to not influence the normal playing of
|
from clients to process are chosen to not influence the normal playing of
|
||||||
people, but to prevent or at least make it less likely that someone can
|
people, but to prevent or at least make it less likely that someone can
|
||||||
perform a (distributed) denial-of-service attack on your server by causing
|
perform a (distributed) denial-of-service attack on your server by causing
|
||||||
an out-of-memory event by flooding the server with data to send to all
|
an out-of-memory event by flooding the server with data to send to all
|
||||||
clients. The major factor in this is the maximum number of clients; with
|
clients. The major factor in this is the maximum number of clients; with
|
||||||
32 clients "only" sending one chat message causes 1024 messages to be
|
32 clients "only" sending one chat message causes 1024 messages to be
|
||||||
distributed in total, with 64 clients that already quadruples to 4096. Given
|
distributed in total, with 64 clients that already quadruples to 4096. Given
|
||||||
that upstream bandwidth is usually the limiting factor, a queue of packets
|
that upstream bandwidth is usually the limiting factor, a queue of packets
|
||||||
that need to be sent will be created.
|
that need to be sent will be created.
|
||||||
To prevent clients from exploiting this "explosion" of packets to send we
|
To prevent clients from exploiting this "explosion" of packets to send we
|
||||||
limit the number of incoming data, resulting in effectively limiting the
|
limit the number of incoming data, resulting in effectively limiting the
|
||||||
amount of data that OpenTTD will send to the clients. Even with the default
|
amount of data that OpenTTD will send to the clients. Even with the default
|
||||||
limits it is possible to generate about 70.000 packets per second, or about
|
limits it is possible to generate about 70.000 packets per second, or about
|
||||||
7 megabit per second of traffic.
|
7 megabit per second of traffic.
|
||||||
Given that OpenTTD kicks clients after they have not reacted within about 9
|
Given that OpenTTD kicks clients after they have not reacted within about 9
|
||||||
seconds from sending a frame update packet it would be possible that OpenTTD
|
seconds from sending a frame update packet it would be possible that OpenTTD
|
||||||
keeps about 600.000 packets in memory, using about 50 megabytes of memory.
|
keeps about 600.000 packets in memory, using about 50 megabytes of memory.
|
||||||
Given that OpenTTD allows short bursts of packets, you can have slightly
|
Given that OpenTTD allows short bursts of packets, you can have slightly
|
||||||
more packets in memory in case of a distributed denial of service attack.
|
more packets in memory in case of a distributed denial of service attack.
|
||||||
When increasing the amount of incoming data, or the maximum number of
|
When increasing the amount of incoming data, or the maximum number of
|
||||||
clients the amount of memory OpenTTD needs in case of a distributed denial
|
clients the amount of memory OpenTTD needs in case of a distributed denial
|
||||||
of service attack is linearly related to the amount of incoming data and
|
of service attack is linearly related to the amount of incoming data and
|
||||||
quadratic to the amount of clients. In short, a rule of thumb for, the
|
quadratic to the amount of clients. In short, a rule of thumb for, the
|
||||||
maximum memory usage for packets is:
|
maximum memory usage for packets is:
|
||||||
#max_clients * #max_clients * bytes_per_frame * 10 KiB.
|
`#max_clients * #max_clients * bytes_per_frame * 10 KiB`.
|
||||||
|
|
||||||
### 4.1) Imposing landscaping limits
|
### 4.1) Imposing landscaping limits
|
||||||
|
|
||||||
- You can impose limits on companies by the following 4 settings:
|
- You can impose limits on companies by the following 4 settings:
|
||||||
- terraform_per_64k_frames
|
- `terraform_per_64k_frames`
|
||||||
- terraform_frame_burst
|
- `terraform_frame_burst`
|
||||||
- clear_per_64k_frames
|
- `clear_per_64k_frames`
|
||||||
- clear_frame_burst
|
- `clear_frame_burst`
|
||||||
|
|
||||||
- Explaining 'per_64K_frames' and 'burst'
|
- Explaining `NNN_burst` and `NNN_per_64K_frames`
|
||||||
- 'burst' defines 3 things, the maximum limit, the limit of a single action,
|
- `NNN_burst` defines 3 things, the maximum limit, the limit of a single
|
||||||
and the initial value for the limit assigned to a new company.
|
action, and the initial value for the limit assigned to a new company.
|
||||||
This setting is fairly simple and requires no math.
|
This setting is fairly simple and requires no math.
|
||||||
|
|
||||||
A value of 1 means a single tile can be affected by a single action.
|
A value of 1 means a single tile can be affected by a single action.
|
||||||
This results in having to click 400 times when wanting to cover an area
|
This results in having to click 400 times when wanting to cover an area
|
||||||
of 20 x 20 tiles.
|
of 20 x 20 tiles.
|
||||||
|
|
||||||
The default value 4096 covers an area of 64 x 64 tiles.
|
The default value 4096 covers an area of 64 x 64 tiles.
|
||||||
|
|
||||||
- 'per_64k_frames' defines the number of tiles added to each companies limit
|
- `NNN_per_64K_frames` defines the number of tiles added to each companies
|
||||||
per frame (however not past the possible maximum value,the 'burst').
|
limit per frame (however not past the possible maximum value,the
|
||||||
64k rather resembles the exact number of 65536 frames. So setting this
|
`NNN_burst`). 64k rather resembles the exact number of 65536 frames. So
|
||||||
variable to 65536 means: 65536 / 65536 = 1 tile per frame.
|
setting this variable to 65536 means: `65536 / 65536 = 1 tile per frame`.
|
||||||
As a day consists of 74 frames, a company's limit is increased by 74
|
|
||||||
tiles during the course of a single day (2.22 seconds).
|
|
||||||
|
|
||||||
To achieve a 1 tile per day increase the following calculation is needed:
|
As a day consists of 74 frames, a company's limit is increased by 74
|
||||||
1 / 74 (frames per day) * 65536 (per_64k_frames) = 885.62...
|
tiles during the course of a single day (2.22 seconds).
|
||||||
after rounding: a value of 886 means adding a bit over 1 tile per day.
|
To achieve a 1 tile per day increase the following calculation is needed:
|
||||||
|
`1 / 74 (frames per day) * 65536 (per_64k_frames) = 885.62...`.
|
||||||
|
After rounding: a value of 886 means adding a bit over 1 tile per day.
|
||||||
|
|
||||||
There is still enough space to scale this value downwards:
|
There is still enough space to scale this value downwards:
|
||||||
decreasing this value to 127 results in a bit over 1 tile added to the
|
decreasing this value to 127 results in a bit over 1 tile added to the
|
||||||
allowance per week (7 days).
|
allowance per week (7 days).
|
||||||
|
|
||||||
To create a setup in which a company gets an initial allowance only,
|
To create a setup in which a company gets an initial allowance only,
|
||||||
set the value to 0 - no increase of the allowance per frame.
|
set the value to 0 - no increase of the allowance per frame.
|
||||||
|
|
||||||
- Even though construction actions include a clear tile action, they are not
|
|
||||||
affected by the above settings.
|
|
||||||
|
|
||||||
|
- Even though construction actions include a clear tile action, they are not
|
||||||
|
affected by the above settings.
|
||||||
|
|
||||||
## 5.0) Some useful things
|
## 5.0) Some useful things
|
||||||
|
|
||||||
- You can protect your company so nobody else can join uninvited. To do this,
|
- You can protect your company so nobody else can join uninvited. To do this,
|
||||||
set a password in your Company Screen
|
set a password in your Company window.
|
||||||
|
|
||||||
- You can give other players some money via the ClientList (under the 'head'
|
- You can chat with other players via ENTER or via SHIFT+T or via the Online
|
||||||
in the mainbar).
|
Players window
|
||||||
|
|
||||||
- You can chat with other players via ENTER or via SHIFT+T or via the ClientList
|
|
||||||
|
|
||||||
- Servers can now kick players, so don't make them use it!
|
|
||||||
|
|
||||||
|
- Servers can kick players, so don't make them use it!
|
||||||
|
|
||||||
## 6.0) Troubleshooting
|
## 6.0) Troubleshooting
|
||||||
|
|
||||||
- My advertising server does not show up in list at servers.openttd.org
|
### My server does not show up in the serverlist
|
||||||
Run openttd with the '-d net=2' parameter. That will show which incoming
|
|
||||||
communication is received, whether the replies from the master server or
|
|
||||||
communication from an admin tool reach the programme. See section 1
|
|
||||||
'Starting a server' further up for the ports and protocols used by OpenTTD.
|
|
||||||
The ports can be configured in the config file.
|
|
||||||
|
|
||||||
- My advertising server warns a lot about getaddrinfo taking N seconds
|
Check if the visibility of your server is set to `public`.
|
||||||
This could be a transient issue with your (local) DNS server, but if the
|
|
||||||
problem persists there is likely a configuration issue in DNS resolving
|
If it is, and your server still isn't showing up, start OpenTTD with
|
||||||
on your computer. This seems to be a common configuration issue for
|
`-d net=4` as extra argument. This will show debug message related to the
|
||||||
Docker instances, where the DNS resolving waits for a time out of usually
|
network, including communication to/from the Game Coordinator.
|
||||||
5 seconds.
|
|
||||||
|
### My server warns a lot about getaddrinfo taking N seconds
|
||||||
|
|
||||||
|
This could be a transient issue with your (local) DNS server, but if the
|
||||||
|
problem persists there is likely a configuration issue in DNS resolving on
|
||||||
|
your computer.
|
||||||
|
|
||||||
|
#### Running OpenTTD in a Docker container?
|
||||||
|
|
||||||
|
This is an issue with dual-stack Docker containers. If there is no default
|
||||||
|
IPv6 resolver and IPv6 traffic is preferred, DNS requests will time out after
|
||||||
|
5 seconds. To resolve this, use an IPv4 DNS server for your Docker container,
|
||||||
|
for example by adding `--dns 1.1.1.1` to your `docker run` command.
|
||||||
|
@@ -17,6 +17,7 @@ set(BASESET_OTHER_SOURCE_FILES
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/openttd.grf
|
${CMAKE_CURRENT_SOURCE_DIR}/openttd.grf
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/opntitle.dat
|
${CMAKE_CURRENT_SOURCE_DIR}/opntitle.dat
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/orig_extra.grf
|
${CMAKE_CURRENT_SOURCE_DIR}/orig_extra.grf
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/../openttd.32.bmp
|
||||||
)
|
)
|
||||||
|
|
||||||
# Done by the subdirectories, if nforenum / grfcodec is installed
|
# Done by the subdirectories, if nforenum / grfcodec is installed
|
||||||
|
@@ -1,43 +0,0 @@
|
|||||||
// 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/>.
|
|
||||||
//
|
|
||||||
-1 * 0 0C "Flag graphics"
|
|
||||||
-1 * 3 05 14 24
|
|
||||||
-1 sprites/flags.png 8bpp 34 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 50 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 66 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 82 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 98 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 114 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 130 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 146 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 162 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 178 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 194 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 210 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 226 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 242 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 258 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 274 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 290 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 306 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 322 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 338 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 354 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 370 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 386 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 402 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 418 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 434 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 450 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 466 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 482 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 498 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 514 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 530 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 546 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 562 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 578 8 11 8 0 0 normal
|
|
||||||
-1 sprites/flags.png 8bpp 594 8 11 8 0 0 normal
|
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -4,10 +4,24 @@
|
|||||||
// 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/>.
|
// 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 "One way road graphics"
|
-1 * 0 0C "One way road graphics"
|
||||||
-1 * 3 05 09 06
|
-1 * 3 05 09 12
|
||||||
-1 sprites/oneway.png 8bpp 34 8 24 16 -12 -8 normal
|
-1 sprites/oneway.png 8bpp 34 8 24 16 -10 -9 normal
|
||||||
-1 sprites/oneway.png 8bpp 66 8 24 16 -12 -8 normal
|
-1 sprites/oneway.png 8bpp 66 8 24 16 -13 -7 normal
|
||||||
-1 sprites/oneway.png 8bpp 98 8 24 16 -12 -8 normal
|
-1 sprites/oneway.png 8bpp 98 8 24 16 -12 -8 normal
|
||||||
-1 sprites/oneway.png 8bpp 130 8 24 16 -12 -8 normal
|
-1 sprites/oneway.png 8bpp 130 8 24 16 -15 -10 normal
|
||||||
-1 sprites/oneway.png 8bpp 162 8 24 16 -12 -8 normal
|
-1 sprites/oneway.png 8bpp 162 8 24 16 -12 -9 normal
|
||||||
-1 sprites/oneway.png 8bpp 194 8 24 16 -12 -8 normal
|
-1 sprites/oneway.png 8bpp 194 8 24 16 -11 -8 normal
|
||||||
|
|
||||||
|
-1 sprites/oneway.png 8bpp 34 40 24 16 -13 -10 normal
|
||||||
|
-1 sprites/oneway.png 8bpp 66 40 24 16 -12 -8 normal
|
||||||
|
-1 sprites/oneway.png 8bpp 98 40 24 16 -12 -9 normal
|
||||||
|
-1 sprites/oneway.png 8bpp 130 40 24 16 -11 -8 normal
|
||||||
|
-1 sprites/oneway.png 8bpp 162 40 24 16 -9 -10 normal
|
||||||
|
-1 sprites/oneway.png 8bpp 194 40 24 16 -10 -9 normal
|
||||||
|
|
||||||
|
-1 sprites/oneway.png 8bpp 34 72 24 16 -8 -11 normal
|
||||||
|
-1 sprites/oneway.png 8bpp 66 72 24 16 -11 -5 normal
|
||||||
|
-1 sprites/oneway.png 8bpp 98 72 24 16 -12 -8 normal
|
||||||
|
-1 sprites/oneway.png 8bpp 130 72 24 16 -12 -5 normal
|
||||||
|
-1 sprites/oneway.png 8bpp 162 72 24 16 -14 -10 normal
|
||||||
|
-1 sprites/oneway.png 8bpp 194 72 24 16 -12 -8 normal
|
||||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 7.7 KiB |
@@ -92,7 +92,6 @@
|
|||||||
#include "roadstops.nfo"
|
#include "roadstops.nfo"
|
||||||
#include "aqueduct.nfo"
|
#include "aqueduct.nfo"
|
||||||
#include "autorail.nfo"
|
#include "autorail.nfo"
|
||||||
#include "flags.nfo"
|
|
||||||
#include "openttdgui.nfo"
|
#include "openttdgui.nfo"
|
||||||
#include "airport_preview.nfo"
|
#include "airport_preview.nfo"
|
||||||
#include "chars.nfo"
|
#include "chars.nfo"
|
||||||
|
12
media/baseset/orig_extra/fix_gui_icons.nfo
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
// 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/>.
|
||||||
|
//
|
||||||
|
-1 * 0 0C "Fix alignment of button icons."
|
||||||
|
|
||||||
|
// Fix alignment of button icons.
|
||||||
|
-1 * 11 0A 03 01 DC 02 01 E2 02 01 E6 02
|
||||||
|
-1 sprites/fix_gui_icons.png 8bpp 8 13 20 20 0 0 normal nocrop
|
||||||
|
-1 sprites/fix_gui_icons.png 8bpp 40 13 20 20 0 0 normal nocrop
|
||||||
|
-1 sprites/fix_gui_icons.png 8bpp 72 13 20 20 0 0 normal nocrop
|
BIN
media/baseset/orig_extra/fix_gui_icons.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
@@ -83,3 +83,4 @@
|
|||||||
#include "rivers/arctic.nfo"
|
#include "rivers/arctic.nfo"
|
||||||
#include "rivers/tropic.nfo"
|
#include "rivers/tropic.nfo"
|
||||||
#include "rivers/toyland.nfo"
|
#include "rivers/toyland.nfo"
|
||||||
|
#include "fix_gui_icons.nfo"
|
||||||
|
BIN
media/openttd.1024.png
Normal file
After Width: | Height: | Size: 66 KiB |
BIN
media/openttd.2048.png
Normal file
After Width: | Height: | Size: 148 KiB |
BIN
media/openttd.512.png
Normal file
After Width: | Height: | Size: 31 KiB |
@@ -6,6 +6,6 @@ Name=OpenTTD
|
|||||||
Icon=${BINARY_NAME}
|
Icon=${BINARY_NAME}
|
||||||
Exec=${BINARY_NAME}
|
Exec=${BINARY_NAME}
|
||||||
Terminal=false
|
Terminal=false
|
||||||
Categories=Game;
|
Categories=Game;Simulation;
|
||||||
Keywords=game;simulation;transport;tycoon;deluxe;economics;multiplayer;money;train;ship;bus;truck;aircraft;cargo;
|
Keywords=game;simulation;transport;tycoon;deluxe;economics;multiplayer;money;train;ship;bus;truck;aircraft;cargo;
|
||||||
@Comment_STR_DESKTOP_SHORTCUT_COMMENT@
|
@Comment_STR_DESKTOP_SHORTCUT_COMMENT@
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
FROM emscripten/emsdk:2.0.10
|
FROM emscripten/emsdk:3.1.28
|
||||||
|
|
||||||
COPY emsdk-liblzma.patch /
|
COPY emsdk-liblzma.patch /
|
||||||
RUN cd /emsdk/upstream/emscripten && patch -p1 < /emsdk-liblzma.patch
|
RUN cd /emsdk/upstream/emscripten && patch -p1 < /emsdk-liblzma.patch
|
||||||
|
@@ -1,40 +1,38 @@
|
|||||||
## How to build with Emscripten
|
## How to build with Emscripten
|
||||||
|
|
||||||
Building with Emscripten works with emsdk 2.0.10 and above.
|
Please use docker with the supplied `Dockerfile` to build for emscripten.
|
||||||
|
It takes care of a few things:
|
||||||
|
- Use a version of emscripten we know works
|
||||||
|
- Patch in LibLZMA support (as this is not supported by upstream)
|
||||||
|
|
||||||
Currently there is no LibLZMA support upstream; for this we suggest to apply
|
First, build the docker image by navigating in the folder this `README.md` is in, and executing:
|
||||||
the provided patch in this folder to your emsdk installation.
|
|
||||||
|
|
||||||
For convenience, a Dockerfile is supplied that does this patches for you
|
|
||||||
against upstream emsdk docker. Best way to use it:
|
|
||||||
|
|
||||||
Build the docker image:
|
|
||||||
```
|
```
|
||||||
docker build -t emsdk-lzma .
|
docker build -t emsdk-lzma .
|
||||||
```
|
```
|
||||||
|
|
||||||
Build the host tools first:
|
Next, navigate back to the root folder of this project.
|
||||||
|
|
||||||
|
Now we build the host tools first:
|
||||||
```
|
```
|
||||||
mkdir build-host
|
mkdir build-host
|
||||||
docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build-host emsdk-lzma cmake .. -DOPTION_TOOLS_ONLY=ON
|
docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build-host emsdk-lzma cmake .. -DOPTION_TOOLS_ONLY=ON
|
||||||
docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build-host emsdk-lzma make -j5 tools
|
docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build-host emsdk-lzma make -j$(nproc) tools
|
||||||
```
|
```
|
||||||
|
|
||||||
Next, build the game with emscripten:
|
Finally, we build the actual game:
|
||||||
|
|
||||||
```
|
```
|
||||||
mkdir build
|
mkdir build
|
||||||
docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build emsdk-lzma emcmake cmake .. -DHOST_BINARY_DIR=$(pwd)/build-host -DCMAKE_BUILD_TYPE=RelWithDebInfo -DOPTION_USE_ASSERTS=OFF
|
docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build emsdk-lzma emcmake cmake .. -DHOST_BINARY_DIR=../build-host -DCMAKE_BUILD_TYPE=Release -DOPTION_USE_ASSERTS=OFF
|
||||||
docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build emsdk-lzma emmake make -j5
|
docker run -it --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) --workdir $(pwd)/build emsdk-lzma emmake make -j$(nproc)
|
||||||
```
|
```
|
||||||
|
|
||||||
And now you have in your build folder files like "openttd.html".
|
In the `build` folder you will now see `openttd.html`.
|
||||||
|
|
||||||
To run it locally, you would have to start a local webserver, like:
|
To run it locally, you would have to start a local webserver; something like:
|
||||||
|
|
||||||
```
|
```
|
||||||
cd build
|
cd build
|
||||||
python3 -m http.server
|
python3 -m http.server
|
||||||
````
|
````
|
||||||
|
|
||||||
Now you can play the game via http://127.0.0.1:8000/openttd.html .
|
You can now play the game via http://127.0.0.1:8000/openttd.html .
|
||||||
|
@@ -10,47 +10,37 @@ Modifed by OpenTTD to have the bare minimum needed to work. Otherwise there
|
|||||||
are constantly conflicts when trying to apply this patch to different versions
|
are constantly conflicts when trying to apply this patch to different versions
|
||||||
of emsdk.
|
of emsdk.
|
||||||
|
|
||||||
diff --git a/embuilder.py b/embuilder.py
|
diff --git a/tools/settings.py b/tools/settings.py
|
||||||
index 818262190ed..ab7d5adb7b2 100755
|
--- a/tools/settings.py
|
||||||
--- a/embuilder.py
|
+++ b/tools/settings.py
|
||||||
+++ b/embuilder.py
|
@@ -40,6 +40,7 @@ PORTS_SETTINGS = {
|
||||||
@@ -60,6 +60,7 @@
|
'USE_SDL_NET',
|
||||||
'harfbuzz',
|
'USE_SDL_GFX',
|
||||||
'icu',
|
'USE_LIBJPEG',
|
||||||
'libjpeg',
|
+ 'USE_LIBLZMA',
|
||||||
+ 'liblzma',
|
'USE_OGG',
|
||||||
'libpng',
|
'USE_REGAL',
|
||||||
'ogg',
|
'USE_BOOST_HEADERS',
|
||||||
'regal',
|
|
||||||
@@ -197,6 +198,8 @@ def main():
|
|
||||||
build_port('ogg', libname('libogg'))
|
|
||||||
elif what == 'libjpeg':
|
|
||||||
build_port('libjpeg', libname('libjpeg'))
|
|
||||||
+ elif what == 'liblzma':
|
|
||||||
+ build_port('liblzma', libname('liblzma'))
|
|
||||||
elif what == 'libpng':
|
|
||||||
build_port('libpng', libname('libpng'))
|
|
||||||
elif what == 'sdl2':
|
|
||||||
diff --git a/src/settings.js b/src/settings.js
|
diff --git a/src/settings.js b/src/settings.js
|
||||||
index 61cd98939ba..be6fcb678c6 100644
|
|
||||||
--- a/src/settings.js
|
--- a/src/settings.js
|
||||||
+++ b/src/settings.js
|
+++ b/src/settings.js
|
||||||
@@ -1197,6 +1197,9 @@ var USE_BZIP2 = 0;
|
@@ -1450,6 +1450,10 @@ var USE_GIFLIB = false;
|
||||||
// 1 = use libjpeg from emscripten-ports
|
// [compile+link]
|
||||||
var USE_LIBJPEG = 0;
|
var USE_LIBJPEG = false;
|
||||||
|
|
||||||
+// 1 = use liblzma from emscripten-ports
|
+// 1 = use liblzma from emscripten-ports
|
||||||
+var USE_LIBLZMA = 0;
|
+// [compile+link]
|
||||||
|
+var USE_LIBLZMA = false;
|
||||||
+
|
+
|
||||||
// 1 = use libpng from emscripten-ports
|
// 1 = use libpng from emscripten-ports
|
||||||
var USE_LIBPNG = 0;
|
// [compile+link]
|
||||||
|
var USE_LIBPNG = false;
|
||||||
|
|
||||||
diff --git a/tools/ports/liblzma.py b/tools/ports/liblzma.py
|
diff --git a/tools/ports/liblzma.py b/tools/ports/liblzma.py
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 00000000000..e9567ef36ff
|
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/tools/ports/liblzma.py
|
+++ b/tools/ports/liblzma.py
|
||||||
@@ -0,0 +1,160 @@
|
@@ -0,0 +1,151 @@
|
||||||
+# Copyright 2020 The Emscripten Authors. All rights reserved.
|
+# Copyright 2020 The Emscripten Authors. All rights reserved.
|
||||||
+# Emscripten is available under two separate licenses, the MIT license and the
|
+# Emscripten is available under two separate licenses, the MIT license and the
|
||||||
+# University of Illinois/NCSA Open Source License. Both these licenses can be
|
+# University of Illinois/NCSA Open Source License. Both these licenses can be
|
||||||
@@ -58,9 +48,11 @@ index 00000000000..e9567ef36ff
|
|||||||
+
|
+
|
||||||
+import os
|
+import os
|
||||||
+import shutil
|
+import shutil
|
||||||
|
+import logging
|
||||||
|
+from pathlib import Path
|
||||||
+
|
+
|
||||||
+VERSION = '5.2.5'
|
+VERSION = '5.4.0'
|
||||||
+HASH = '7443674247deda2935220fbc4dfc7665e5bb5a260be8ad858c8bd7d7b9f0f868f04ea45e62eb17c0a5e6a2de7c7500ad2d201e2d668c48ca29bd9eea5a73a3ce'
|
+HASH = '29b2cd25bb5b234b329ffe9547692d2c29be393db9d8d4ce70a66dfdaebd54433e79a89d80c57e58cd4559c3c68b9845507d5fedf3eec1c528a81e3d9ddbd811'
|
||||||
+
|
+
|
||||||
+
|
+
|
||||||
+def needed(settings):
|
+def needed(settings):
|
||||||
@@ -68,42 +60,31 @@ index 00000000000..e9567ef36ff
|
|||||||
+
|
+
|
||||||
+
|
+
|
||||||
+def get(ports, settings, shared):
|
+def get(ports, settings, shared):
|
||||||
+ libname = ports.get_lib_name('liblzma')
|
+ ports.fetch_project('liblzma', f'https://tukaani.org/xz/xz-{VERSION}.tar.gz', sha512hash=HASH)
|
||||||
+ ports.fetch_project('liblzma', 'https://tukaani.org/xz/xz-' + VERSION + '.tar.gz', 'xz-' + VERSION, sha512hash=HASH)
|
+
|
||||||
|
+ def create(final):
|
||||||
|
+ logging.info('building port: liblzma')
|
||||||
+
|
+
|
||||||
+ def create():
|
|
||||||
+ ports.clear_project_build('liblzma')
|
+ ports.clear_project_build('liblzma')
|
||||||
+
|
+
|
||||||
+ source_path = os.path.join(ports.get_dir(), 'liblzma', 'xz-' + VERSION)
|
+ source_path = os.path.join(ports.get_dir(), 'liblzma', f'xz-{VERSION}', 'src', 'liblzma')
|
||||||
+ dest_path = os.path.join(ports.get_build_dir(), 'liblzma')
|
+ ports.write_file(os.path.join(source_path, 'config.h'), config_h)
|
||||||
+
|
+ ports.install_headers(os.path.join(source_path, 'api'), pattern='lzma.h')
|
||||||
+ shared.try_delete(dest_path)
|
+ ports.install_headers(os.path.join(source_path, 'api', 'lzma'), pattern='*.h', target='lzma')
|
||||||
+ os.makedirs(dest_path)
|
|
||||||
+ shutil.rmtree(dest_path, ignore_errors=True)
|
|
||||||
+ shutil.copytree(source_path, dest_path)
|
|
||||||
+
|
+
|
||||||
+ build_flags = ['-DHAVE_CONFIG_H', '-DTUKLIB_SYMBOL_PREFIX=lzma_', '-fvisibility=hidden']
|
+ build_flags = ['-DHAVE_CONFIG_H', '-DTUKLIB_SYMBOL_PREFIX=lzma_', '-fvisibility=hidden']
|
||||||
+ exclude_dirs = ['xzdec', 'xz', 'lzmainfo']
|
+ exclude_files = ['crc32_small.c', 'crc64_small.c', 'crc32_tablegen.c', 'crc64_tablegen.c', 'price_tablegen.c', 'fastpos_tablegen.c',
|
||||||
+ exclude_files = ['crc32_small.c', 'crc64_small.c', 'crc32_tablegen.c', 'crc64_tablegen.c', 'price_tablegen.c', 'fastpos_tablegen.c'
|
|
||||||
+ 'tuklib_exit.c', 'tuklib_mbstr_fw.c', 'tuklib_mbstr_width.c', 'tuklib_open_stdxxx.c', 'tuklib_progname.c']
|
+ 'tuklib_exit.c', 'tuklib_mbstr_fw.c', 'tuklib_mbstr_width.c', 'tuklib_open_stdxxx.c', 'tuklib_progname.c']
|
||||||
+ include_dirs_rel = ['../common', 'api', 'common', 'check', 'lz', 'rangecoder', 'lzma', 'delta', 'simple']
|
+ include_dirs_rel = ['../common', 'api', 'check', 'common', 'delta', 'lz', 'lzma', 'rangecoder', 'simple']
|
||||||
+
|
+
|
||||||
+ open(os.path.join(dest_path, 'src', 'config.h'), 'w').write(config_h)
|
+ include_dirs = [os.path.join(source_path, p) for p in include_dirs_rel]
|
||||||
|
+ ports.build_port(source_path, final, 'liblzma', flags=build_flags, exclude_files=exclude_files, includes=include_dirs)
|
||||||
+
|
+
|
||||||
+ final = os.path.join(dest_path, libname)
|
+ return [shared.cache.get_lib('liblzma.a', create, what='port')]
|
||||||
+ include_dirs = [os.path.join(dest_path, 'src', 'liblzma', p) for p in include_dirs_rel]
|
|
||||||
+ ports.build_port(os.path.join(dest_path, 'src'), final, flags=build_flags, exclude_dirs=exclude_dirs, exclude_files=exclude_files, includes=include_dirs)
|
|
||||||
+
|
|
||||||
+ ports.install_headers(os.path.join(dest_path, 'src', 'liblzma', 'api'), 'lzma.h')
|
|
||||||
+ ports.install_headers(os.path.join(dest_path, 'src', 'liblzma', 'api', 'lzma'), '*.h', 'lzma')
|
|
||||||
+
|
|
||||||
+ return final
|
|
||||||
+
|
|
||||||
+ return [shared.Cache.get(libname, create, what='port')]
|
|
||||||
+
|
+
|
||||||
+
|
+
|
||||||
+def clear(ports, settings, shared):
|
+def clear(ports, settings, shared):
|
||||||
+ shared.Cache.erase_file(ports.get_lib_name('liblzma'))
|
+ shared.cache.erase_lib('liblzma.a')
|
||||||
+
|
+
|
||||||
+
|
+
|
||||||
+def process_args(ports):
|
+def process_args(ports):
|
||||||
@@ -114,7 +95,7 @@ index 00000000000..e9567ef36ff
|
|||||||
+ return 'liblzma (USE_LIBLZMA=1; public domain)'
|
+ return 'liblzma (USE_LIBLZMA=1; public domain)'
|
||||||
+
|
+
|
||||||
+
|
+
|
||||||
+config_h = r'''
|
+config_h = '''
|
||||||
+#define ASSUME_RAM 128
|
+#define ASSUME_RAM 128
|
||||||
+#define ENABLE_NLS 1
|
+#define ENABLE_NLS 1
|
||||||
+#define HAVE_CHECK_CRC32 1
|
+#define HAVE_CHECK_CRC32 1
|
||||||
@@ -186,9 +167,9 @@ index 00000000000..e9567ef36ff
|
|||||||
+#define PACKAGE "xz"
|
+#define PACKAGE "xz"
|
||||||
+#define PACKAGE_BUGREPORT "lasse.collin@tukaani.org"
|
+#define PACKAGE_BUGREPORT "lasse.collin@tukaani.org"
|
||||||
+#define PACKAGE_NAME "XZ Utils"
|
+#define PACKAGE_NAME "XZ Utils"
|
||||||
+#define PACKAGE_STRING "XZ Utils 5.2.5"
|
+#define PACKAGE_STRING "XZ Utils 5.4.0"
|
||||||
+#define PACKAGE_TARNAME "xz"
|
+#define PACKAGE_TARNAME "xz"
|
||||||
+#define PACKAGE_VERSION "5.2.5"
|
+#define PACKAGE_VERSION "5.4.0"
|
||||||
+#define SIZEOF_SIZE_T 4
|
+#define SIZEOF_SIZE_T 4
|
||||||
+#define STDC_HEADERS 1
|
+#define STDC_HEADERS 1
|
||||||
+#define TUKLIB_CPUCORES_SYSCONF 1
|
+#define TUKLIB_CPUCORES_SYSCONF 1
|
||||||
@@ -209,5 +190,5 @@ index 00000000000..e9567ef36ff
|
|||||||
+#ifndef __EXTENSIONS__
|
+#ifndef __EXTENSIONS__
|
||||||
+# define __EXTENSIONS__ 1
|
+# define __EXTENSIONS__ 1
|
||||||
+#endif
|
+#endif
|
||||||
+#define VERSION "5.2.5"
|
+#define VERSION "5.4.0"
|
||||||
+'''
|
+'''
|
||||||
|
64
os/gog/linux.json
Executable file
@@ -0,0 +1,64 @@
|
|||||||
|
{
|
||||||
|
"project": {
|
||||||
|
"baseProductId": "1293297882",
|
||||||
|
"clientId": "CLIENT_ID",
|
||||||
|
"clientSecret": "CLIENT_SECRET",
|
||||||
|
"version": "VERSION",
|
||||||
|
"installDirectory": "OpenTTD",
|
||||||
|
"name": "OpenTTD",
|
||||||
|
"platform": "gnu-linux",
|
||||||
|
"tags": [
|
||||||
|
"editor_v_1_4_0"
|
||||||
|
],
|
||||||
|
"languageMode": "together",
|
||||||
|
"products": [
|
||||||
|
{
|
||||||
|
"name": "OpenTTD",
|
||||||
|
"productId": "1293297882",
|
||||||
|
"depots": [
|
||||||
|
{
|
||||||
|
"name": "Linux",
|
||||||
|
"folder": "linux",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "OpenGFX",
|
||||||
|
"folder": "opengfx",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "OpenMSX",
|
||||||
|
"folder": "openmsx",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "OpenSFX",
|
||||||
|
"folder": "opensfx",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"type": "FileTask",
|
||||||
|
"name": "OpenTTD",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
],
|
||||||
|
"category": "game",
|
||||||
|
"path": "openttd",
|
||||||
|
"isPrimary": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"supportDepots": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
65
os/gog/macos.json
Executable file
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"project": {
|
||||||
|
"baseProductId": "1293297882",
|
||||||
|
"clientId": "CLIENT_ID",
|
||||||
|
"clientSecret": "CLIENT_SECRET",
|
||||||
|
"version": "VERSION",
|
||||||
|
"installDirectory": "OpenTTD",
|
||||||
|
"name": "OpenTTD",
|
||||||
|
"platform": "osx",
|
||||||
|
"tags": [
|
||||||
|
"editor_v_1_4_0"
|
||||||
|
],
|
||||||
|
"languageMode": "together",
|
||||||
|
"products": [
|
||||||
|
{
|
||||||
|
"name": "OpenTTD",
|
||||||
|
"productId": "1293297882",
|
||||||
|
"depots": [
|
||||||
|
{
|
||||||
|
"name": "MacOS",
|
||||||
|
"folder": "macos",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "OpenGFX",
|
||||||
|
"folder": "opengfx",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "OpenMSX",
|
||||||
|
"folder": "openmsx",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "OpenSFX",
|
||||||
|
"folder": "opensfx",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"type": "FileTask",
|
||||||
|
"name": "OpenTTD",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
],
|
||||||
|
"category": "game",
|
||||||
|
"path": "OpenTTD.app/Contents/MacOS/openttd",
|
||||||
|
"isPrimary": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"supportDepots": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
94
os/gog/windows.json
Executable file
@@ -0,0 +1,94 @@
|
|||||||
|
{
|
||||||
|
"project": {
|
||||||
|
"baseProductId": "1293297882",
|
||||||
|
"clientId": "CLIENT_ID",
|
||||||
|
"clientSecret": "CLIENT_SECRET",
|
||||||
|
"version": "VERSION",
|
||||||
|
"installDirectory": "OpenTTD",
|
||||||
|
"name": "OpenTTD",
|
||||||
|
"platform": "windows",
|
||||||
|
"tags": [
|
||||||
|
"editor_v_1_4_0"
|
||||||
|
],
|
||||||
|
"languageMode": "together",
|
||||||
|
"products": [
|
||||||
|
{
|
||||||
|
"name": "OpenTTD",
|
||||||
|
"productId": "1293297882",
|
||||||
|
"depots": [
|
||||||
|
{
|
||||||
|
"name": "Win32",
|
||||||
|
"folder": "win32",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
],
|
||||||
|
"osBitness": [
|
||||||
|
"32"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Win64",
|
||||||
|
"folder": "win64",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
],
|
||||||
|
"osBitness": [
|
||||||
|
"64"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "OpenGFX",
|
||||||
|
"folder": "opengfx",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
],
|
||||||
|
"osBitness": [
|
||||||
|
"32",
|
||||||
|
"64"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "OpenMSX",
|
||||||
|
"folder": "openmsx",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
],
|
||||||
|
"osBitness": [
|
||||||
|
"32",
|
||||||
|
"64"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "OpenSFX",
|
||||||
|
"folder": "opensfx",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
],
|
||||||
|
"osBitness": [
|
||||||
|
"32",
|
||||||
|
"64"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"type": "FileTask",
|
||||||
|
"name": "OpenTTD",
|
||||||
|
"languages": [
|
||||||
|
"en-US"
|
||||||
|
],
|
||||||
|
"category": "game",
|
||||||
|
"path": "openttd.exe",
|
||||||
|
"isPrimary": true,
|
||||||
|
"osBitness": [
|
||||||
|
"32",
|
||||||
|
"64"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"supportDepots": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"scriptInterpreter": true
|
||||||
|
}
|
||||||
|
}
|
@@ -31,5 +31,7 @@
|
|||||||
<string>NSApplication</string>
|
<string>NSApplication</string>
|
||||||
<key>NSHighResolutionCapable</key>
|
<key>NSHighResolutionCapable</key>
|
||||||
<string>True</string>
|
<string>True</string>
|
||||||
|
<key>LSMinimumSystemVersion</key>
|
||||||
|
<string>10.13.0</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
@@ -5,11 +5,8 @@ set -e
|
|||||||
# If you are building an unofficial branch of OpenTTD, please change the bundle
|
# If you are building an unofficial branch of OpenTTD, please change the bundle
|
||||||
# ID in Info.plist and below.
|
# ID in Info.plist and below.
|
||||||
#
|
#
|
||||||
# This uses `gon' to perform notarization:
|
# This uses the Xcode notarytool to perform notarization. You must set up a keychain
|
||||||
#
|
# profile called "openttd" using the "store-credentials" notarytool command beforehand.
|
||||||
# https://github.com/mitchellh/gon
|
|
||||||
#
|
|
||||||
# Follow the setup instructions on the gon site to install.
|
|
||||||
#
|
#
|
||||||
# Before executing this script, you must first configure CMake with at least the following
|
# Before executing this script, you must first configure CMake with at least the following
|
||||||
# parameters:
|
# parameters:
|
||||||
@@ -22,19 +19,11 @@ set -e
|
|||||||
# This will sign the application with your signing certificate, and will enable
|
# This will sign the application with your signing certificate, and will enable
|
||||||
# the hardened runtime.
|
# the hardened runtime.
|
||||||
#
|
#
|
||||||
# You also need to set your Apple Developer username and password (app-specific password
|
|
||||||
# is recommended) in the AC_USERNAME and AC_PASSWORD environment variables.
|
|
||||||
#
|
|
||||||
# Then, ensuring you're in your build directory and that the "bundles" directory
|
# Then, ensuring you're in your build directory and that the "bundles" directory
|
||||||
# exists with a .dmg in it (clear out any old DMGs first), run:
|
# exists with a .dmg in it (clear out any old DMGs first), run:
|
||||||
#
|
#
|
||||||
# ../os/macosx/notarize.sh
|
# ../os/macosx/notarize.sh
|
||||||
|
|
||||||
if [ -z "${AC_USERNAME}" ]; then
|
|
||||||
echo AC_USERNAME not set, skipping notarization.
|
|
||||||
exit 0
|
|
||||||
fi;
|
|
||||||
|
|
||||||
dmg_filename=(bundles/*.dmg)
|
dmg_filename=(bundles/*.dmg)
|
||||||
|
|
||||||
if [ "${dmg_filename}" = "bundles/*.dmg" ]; then
|
if [ "${dmg_filename}" = "bundles/*.dmg" ]; then
|
||||||
@@ -43,24 +32,15 @@ if [ "${dmg_filename}" = "bundles/*.dmg" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
cat <<EOF > notarize.json
|
xcrun notarytool submit ${dmg_filename[0]} --keychain-profile "openttd" --wait
|
||||||
{
|
|
||||||
"notarize": [
|
|
||||||
{
|
|
||||||
"path": "${dmg_filename[0]}",
|
|
||||||
"bundle_id": "org.openttd.openttd",
|
|
||||||
"staple": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
gon notarize.json
|
# Staple the ticket to the .dmg
|
||||||
|
xcrun stapler staple "${dmg_filename[0]}"
|
||||||
|
|
||||||
app_filename=(_CPack_Packages/*/Bundle/openttd-*/OpenTTD.app)
|
app_filename=(_CPack_Packages/*/Bundle/openttd-*/OpenTTD.app)
|
||||||
|
|
||||||
if [ "${app_filename}" = "_CPack_Packages/*/Bundle/openttd-*/OpenTTD.app" ]; then
|
if [ "${app_filename}" = "_CPack_Packages/*/Bundle/openttd-*/OpenTTD.app" ]; then
|
||||||
echo "No .app found in the _CPack_Packages directory, skipping stapling."
|
echo "No .app found in the _CPack_Packages directory, skipping app stapling."
|
||||||
exit 0
|
exit 0
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
<windowsSettings>
|
<windowsSettings>
|
||||||
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware>
|
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware>
|
||||||
|
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2,PerMonitor</dpiAwareness>
|
||||||
</windowsSettings>
|
</windowsSettings>
|
||||||
</application>
|
</application>
|
||||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
|
@@ -12,7 +12,7 @@ REM URL of the timestamp server
|
|||||||
IF NOT DEFINED SIGNTOOL_TIMESTAMP_URL (SET SIGNTOOL_TIMESTAMP_URL=http://timestamp.digicert.com)
|
IF NOT DEFINED SIGNTOOL_TIMESTAMP_URL (SET SIGNTOOL_TIMESTAMP_URL=http://timestamp.digicert.com)
|
||||||
|
|
||||||
REM Sign with SHA-1 for Windows 7 and below
|
REM Sign with SHA-1 for Windows 7 and below
|
||||||
"%SIGNTOOL_PATH%" sign -v -n %2 -t %SIGNTOOL_TIMESTAMP_URL% %1
|
"%SIGNTOOL_PATH%" sign -v -n %2 -t %SIGNTOOL_TIMESTAMP_URL% -fd sha1 %1
|
||||||
|
|
||||||
REM Sign with SHA-256 for Windows 8 and above
|
REM Sign with SHA-256 for Windows 8 and above
|
||||||
"%SIGNTOOL_PATH%" sign -v -n %2 -tr %SIGNTOOL_TIMESTAMP_URL% -fd sha256 -td sha256 -as %1
|
"%SIGNTOOL_PATH%" sign -v -n %2 -tr %SIGNTOOL_TIMESTAMP_URL% -fd sha256 -td sha256 -as %1
|
||||||
|
2
os/windows/winstore/generate-assets.bat
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
@echo off
|
||||||
|
powershell -File "%~dp0generate-assets.ps1"
|
48
os/windows/winstore/generate-assets.ps1
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
function ResizeImage() {
|
||||||
|
param([String]$sourcePath, [Int]$targetWidth, [Int]$targetHeight, [String]$targetPath)
|
||||||
|
|
||||||
|
Add-Type -AssemblyName "System.Drawing"
|
||||||
|
|
||||||
|
$img = [System.Drawing.Image]::FromFile($sourcePath)
|
||||||
|
|
||||||
|
$ratioX = $targetWidth / $img.Width;
|
||||||
|
$ratioY = $targetHeight / $img.Height;
|
||||||
|
|
||||||
|
$ratio = $ratioY
|
||||||
|
|
||||||
|
if ($ratioX -le $ratioY) {
|
||||||
|
$ratio = $ratioX
|
||||||
|
}
|
||||||
|
|
||||||
|
$newWidth = [int] ($img.Width * $ratio)
|
||||||
|
$newHeight = [int] ($img.Height * $ratio)
|
||||||
|
|
||||||
|
$resizedImage = New-Object System.Drawing.Bitmap($targetWidth, $targetHeight)
|
||||||
|
$graph = [System.Drawing.Graphics]::FromImage($resizedImage)
|
||||||
|
$graph.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic
|
||||||
|
|
||||||
|
$graph.Clear([System.Drawing.Color]::Transparent)
|
||||||
|
$graph.DrawImage($img, $targetWidth / 2 - $newWidth / 2, $targetHeight / 2 - $newHeight / 2, $newWidth, $newHeight)
|
||||||
|
|
||||||
|
$resizedImage.Save($targetPath)
|
||||||
|
$resizedImage.Dispose()
|
||||||
|
$img.Dispose()
|
||||||
|
}
|
||||||
|
|
||||||
|
$logoPath = "..\..\..\media\openttd.2048.png"
|
||||||
|
|
||||||
|
# Create the main image assets required for the Windows Store
|
||||||
|
New-Item -Path "." -Name "assets" -ItemType "directory" -Force
|
||||||
|
ResizeImage $logoPath 1240 1240 "assets\LargeTile.png"
|
||||||
|
ResizeImage $logoPath 284 284 "assets\SmallTile.png"
|
||||||
|
ResizeImage $logoPath 2480 1200 "assets\SplashScreen.png"
|
||||||
|
ResizeImage $logoPath 176 176 "assets\Square44x44Logo.png"
|
||||||
|
Copy-Item "assets\Square44x44Logo.png" -Destination "assets\Square44x44Logo.targetsize-44_altform-unplated.png"
|
||||||
|
ResizeImage $logoPath 600 600 "assets\Square150x150Logo.png"
|
||||||
|
Copy-Item "assets\Square150x150Logo.png" -Destination "assets\Square150x150Logo.targetsize-150_altform-unplated.png"
|
||||||
|
ResizeImage $logoPath 200 200 "assets\StoreLogo.png"
|
||||||
|
ResizeImage $logoPath 1240 600 "assets\Wide310x150Logo.png"
|
||||||
|
|
||||||
|
# Copy the logo for the store for the common package
|
||||||
|
New-Item -Path "." -Name "assets-common" -ItemType "directory" -Force
|
||||||
|
Copy-Item "assets\StoreLogo.png" -Destination "assets-common\StoreLogoCommon.png"
|
2
os/windows/winstore/generate-key.bat
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
@echo off
|
||||||
|
powershell -File "%~dp0generate-key.ps1" %1 %2 %3
|
21
os/windows/winstore/generate-key.ps1
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
[CmdletBinding()]
|
||||||
|
[Alias()]
|
||||||
|
Param
|
||||||
|
(
|
||||||
|
# Publisher ("CN=xyz")
|
||||||
|
[Parameter(Mandatory=$true, Position=0)]
|
||||||
|
$Publisher,
|
||||||
|
|
||||||
|
# Password
|
||||||
|
[Parameter(Mandatory=$true, Position=1)]
|
||||||
|
$PasswordParam,
|
||||||
|
|
||||||
|
# Filename
|
||||||
|
[Parameter(Mandatory=$true, Position=2)]
|
||||||
|
$OutputFilename
|
||||||
|
)
|
||||||
|
|
||||||
|
$cert = New-SelfSignedCertificate -Type Custom -Subject $Publisher -KeyUsage DigitalSignature -FriendlyName "OpenTTD signing certificate" -CertStoreLocation "Cert:\CurrentUser\My" -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}")
|
||||||
|
|
||||||
|
$password = ConvertTo-SecureString -String $PasswordParam -Force -AsPlainText
|
||||||
|
Export-PfxCertificate -cert "Cert:\CurrentUser\My\$($cert.Thumbprint)" -FilePath $OutputFilename -Password $password
|