diff --git a/gen_newgrf_revisions.py b/gen_newgrf_revisions.py new file mode 100755 index 0000000000..f53e602110 --- /dev/null +++ b/gen_newgrf_revisions.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 + +from urllib.request import urlopen + +verstr = urlopen("http://finger.openttd.org/tags.txt").read() +verstr = verstr.decode('utf-8') +verdata = verstr.strip().split() + +releases = [] +f = open("src/newgrf_revisions.cpp", "w") +f.write('#include "stdafx.h"\n\n') +f.write('#include \n') + +f.write('const std::map OPENTTD_NEWGRF_VERSIONS = {\n') +for rev, ver in zip(map(int, verdata[0::3]), verdata[2::3]): + if ver.startswith('1.1'): + break + v = ver.split('.') + vr = None + if '-' in v[2]: + v[2], vr = v[2].split('-') + v = list(map(int, v)) + release_flag = int(not bool(vr)) + newgrf_rev = (v[0] << 28 | v[1] << 24 | v[2] << 20 | + release_flag << 19 | (rev & ((1 << 19) - 1))) + f.write(' {{"{}", {}}},\n'.format(ver, newgrf_rev)) + + if release_flag and v[2] == 0: + newgrf_rev = v[0] << 28 | (v[1] + 1) << 24 + releases.append((rev, newgrf_rev)) + +f.write('};\n\n') + +f.write('const std::map OPENTTD_RELEASE_REVISIONS = {\n') +for rev, newgrf_rev in releases: + f.write(' {{{}, {}}},\n'.format(rev, newgrf_rev)) +f.write('};\n') diff --git a/source.list b/source.list index 5cb9f88d58..6d7486ffb4 100644 --- a/source.list +++ b/source.list @@ -605,6 +605,7 @@ zoning_cmd.cpp # CityMania files citymania/base64.h citymania/base64.cpp +newgrf_revisions.hpp # Save/Load handlers saveload/afterload.cpp diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index bf2ad2d0ad..a7bb58b22e 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -31,6 +31,7 @@ #include "network_base.h" #include "network_client.h" #include "../core/backup_type.hpp" +#include "../newgrf_revisions.hpp" #include "table/strings.h" @@ -41,12 +42,9 @@ /* This file handles all the client-commands */ void SyncCMUser(const char *msg); -static const std::map OPENTTD_NEWGRF_VERSIONS = { - {"1.7.0", 386428096}, - {"1.7.0-RC1", 385903751}, - {"1.6.1", 370699225}, - {"1.6.0", 369650572}, -}; +// extern const std::map OPENTTD_NEWGRF_VERSIONS; +// extern const std::map OPENTTD_RELEASE_REVISIONS; +static const uint32 OPENTTD_NEWGRF_REVISION_MASK = (1 << 19) - 1; /** Read some packets, and when do use that data as initial load filter. */ struct PacketReader : LoadFilter { @@ -349,12 +347,19 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendJoin() auto r = _network_join_server_revision; p->Send_string(r); auto nr = OPENTTD_NEWGRF_VERSIONS.find(r); - int rev; + uint32 rev; if (nr != OPENTTD_NEWGRF_VERSIONS.end()) { p->Send_uint32(nr->second); - } else if (r[0] == 'r' && r[6] == 0 && (rev = atoi(r + 1)) > 0) { + } else if (r[0] == 'r' && r[6] == 0 && (rev = strtoul(r + 1, nullptr, 10)) > 0) { // assume it's nightly - p->Send_uint32((rev >= 27840 ? 402653184u : 385875968u) | rev); + uint32 max_rev = 0; + // find release closest to the nightly + for (auto &kv: OPENTTD_RELEASE_REVISIONS) { + if (kv.first > max_rev && kv.first <= rev) + max_rev = kv.first; + } + p->Send_uint32(OPENTTD_RELEASE_REVISIONS.at(max_rev) | + (rev & OPENTTD_NEWGRF_REVISION_MASK)); } else { p->Send_uint32(_openttd_newgrf_version); } diff --git a/src/newgrf_revisions.hpp b/src/newgrf_revisions.hpp new file mode 100644 index 0000000000..8ed08fb88a --- /dev/null +++ b/src/newgrf_revisions.hpp @@ -0,0 +1,77 @@ +#include "stdafx.h" + +#include +const std::map OPENTTD_NEWGRF_VERSIONS = { + {"1.7.1", 387476713}, + {"1.7.1-RC1", 386952411}, + {"1.7.0", 386428096}, + {"1.7.0-RC1", 385903751}, + {"1.6.1", 370699225}, + {"1.6.1-RC1", 370174925}, + {"1.6.0", 369650572}, + {"1.6.0-RC1", 369126272}, + {"1.5.3", 356019014}, + {"1.5.3-RC1", 355494698}, + {"1.5.2", 354970369}, + {"1.5.2-RC1", 354446044}, + {"1.5.1", 353921698}, + {"1.5.1-RC1", 353397388}, + {"1.5.0", 352873041}, + {"1.5.0-RC1", 352348732}, + {"1.5.0-beta2", 352348706}, + {"1.5.0-beta1", 352348632}, + {"1.4.4", 340289941}, + {"1.4.4-RC1", 339765605}, + {"1.4.3", 339241250}, + {"1.4.3-RC2", 338716873}, + {"1.4.3-RC1", 338716843}, + {"1.4.2", 338192500}, + {"1.4.2-RC2", 337668191}, + {"1.4.2-RC1", 337668146}, + {"1.4.1", 337143811}, + {"1.4.1-RC2", 336619496}, + {"1.4.1-RC1", 336619458}, + {"1.4.0", 336095048}, + {"1.4.0-RC1", 335570735}, + {"1.4.0-beta5", 335570697}, + {"1.4.0-beta4", 335570621}, + {"1.4.0-beta3", 335570593}, + {"1.4.0-beta2", 335570551}, + {"1.4.0-beta1", 335570498}, + {"1.3.3", 322463256}, + {"1.3.3-RC2", 321938928}, + {"1.3.3-RC1", 321938866}, + {"1.3.2", 321414176}, + {"1.3.2-RC2", 320889859}, + {"1.3.2-RC1", 320889786}, + {"1.3.1", 320365278}, + {"1.3.1-RC1", 319840929}, + {"1.3.0", 319316527}, + {"1.3.0-RC3", 318792210}, + {"1.3.0-RC2", 318792173}, + {"1.3.0-RC1", 318792136}, + {"1.3.0-beta2", 318792083}, + {"1.3.0-beta1", 318791955}, + {"1.2.3", 305684561}, + {"1.2.3-RC1", 305160229}, + {"1.2.2", 304635804}, + {"1.2.2-RC1", 304111495}, + {"1.2.1", 303587058}, + {"1.2.1-RC1", 303062723}, + {"1.2.0", 302538294}, + {"1.2.0-RC4", 302013972}, + {"1.2.0-RC3", 302013934}, + {"1.2.0-RC2", 302013903}, + {"1.2.0-RC1", 302013859}, + {"1.2.0-beta4", 302013767}, + {"1.2.0-beta3", 302013721}, +}; + +const std::map OPENTTD_RELEASE_REVISIONS = { + {27840, 402653184}, + {27532, 385875968}, + {27217, 369098752}, + {26440, 352321536}, + {25135, 335544320}, + {24118, 318767104}, +};