Author SHA1 Message Date
Jylpah f913f84f42 Merge pull request #33 from Jylpah/stable-filters-update2
Backport stable fixes
2021-11-23 18:44:17 +02:00
5 changed files with 162 additions and 619 deletions

No files matched your search

+23 -25
View File
@@ -1,5 +1,5 @@
# blitz-tools
Python scripts to analyze WoT Blitz replays and stats. All the scripts require [Python 3.7](https://www.python.org/downloads/) or later.
Python scripts to analyze WoT Blitz replays and stats. All the scripts require [Python 3.7](https://www.python.org/downloads/) or higher. I am using 3.8 myself so you may have to change the Python interpreter version in the scripts' first line.
### Replays
* [upload_wotb_replays.py](upload_wotb_replays.py): An asynchronous replay uploader.
@@ -13,48 +13,46 @@ Python scripts to analyze WoT Blitz replays and stats. All the scripts require [
* [blitzutils.py](blitzutils.py): A utils class for various Blitz related to functions. *Other scripts use this*, so you need to place it to the same folder with the other scripts
### Data
* [tanks.json](tanks.json): Tankopedia in WG JSON format extracted from the Blitz app files with [extract_tankopedia.py](extractTankopedia.py). Contains only limited information required by the scripts.
* [maps.json](maps.json): Blitz map names extracted from the Blitz app files with [extract_tankopedia.py](extract_tankopedia.py).
* [tanks.json](tanks.json): Tankopedia in WG JSON format extracted from the Blitz app files with [extract_tankopedia.py]](extractTankopedia.py]). Contains only limited information required by the scripts.
* [maps.json](maps.json): Blitz map names extracted from the Blitz app files with [extract_tankopedia.py]](extract_tankopedia.py]).
### Quick instructions
1. Install [Python 3.8](https://www.python.org/downloads/) or later to your computer/laptop
2. Install the required Python modules (see [requirements.txt](requirements.txt): motor, aiohttp, aioconsole, aiofiles, aiosqlite, beautifulsoup4, lxml, xmltodict, progress
1. Install [Python 3.8](https://www.python.org/downloads/) on to your computer/laptop
2. Install the required Python modules: motor, aiohttp, aioconsole, aiofiles, aiosqlite, beautifulsoup4, lxml, xmltodict, progress
```
python -m pip install -r requirements.txt
# Remember to run the command with a Python interpreter >= 3.7
python -m pip install motor aiohttp aioconsole aiofiles aiosqlite beautifulsoup4 lxml xmltodict progress
```
3. Clone the repository. [GitHub Desktop](https://desktop.github.com/) is an excellent GUI for `git`. This makes it easy to receive the updates via `git pull`.
3. Download all the files including the [maps.json](maps.json) and [tanks.json](tanks.json) files. **The recommened way** is to install the scipts via `git clone`: [GitHub Desktop](https://desktop.github.com/) is an excellent GUI for git. This makes it easy to receive the updates via `git pull`.
4. Upload your replays.
```
git clone https://github.com/Jylpah/blitz-tools.git
```
4. Upload your replays with `upload_wotb_replays.py`
```
## Check the options
# Windows Command Prompt or Powershell
# Windows, run directly from Command Prompt or Powershell
# Check the options
python.exe .\upload_wotb_replays.py --help
# Linux or Windows Subsystem for Linux (WSL)
./upload_wotb_replays.py --help
# Upload replays (Windows)
python.exe .\upload_wotb_replays.py REPLAY_FILE.wotbreplay DIR_WITH_REPLAYS
# Syntax
python.exe .\upload_wotb_replays.py REPLAY_FILE.wotbreplay
# example
python.exe .\upload_wotb_replays.py 20200223_0122__jylpah_T-54_grossberg.wotbreplay
# Linux
./upload_wotb_replays.py --help
```
5. Analyze replays with `analyze_wotb_replays.py`
5. Analyze replays.
```
## Check options
# Windows Command Prompt or Powershell
# Windows, run directly from Command Prompt or Powershell
python.exe .\analyze_wotb_replays.py --help
# Syntax (Windows)
python.exe .\analyze_wotb_replays.py REPLAY_FILE.wotbreplay.json [DIR_WITH_REPLAYS ...]
# Syntax
python.exe .\analyze_wotb_replays.py REPLAY_FILE.wotbreplay.json
# Example (Windows)
# Example
python.exe .\analyze_wotb_replays.py 20200223_0122__jylpah_T-54_grossberg.wotbreplay.json
# Linux or Windows Subsystem for Linux (WSL)
# Linux
./analyze_wotb_replays.py --help
```
+117 -177
View File
@@ -29,8 +29,6 @@ STAT_TANK_BATTLE_MIN = 100
BATTLE_TIME_BUCKET = 3600*24*14
OPT_EXPORT_REPLAY_DIR = 'export_replays'
OPT_EXPORT_CSV_FILE = 'export.csv'
OPT_EXPORT_JSON_FILE = 'export.json'
RE_SRC_IS_DB = re.compile(r'^DB:')
@@ -228,41 +226,16 @@ class BattleCategorizationList():
'top_tier'
]
## Player stats based categorizations
_categorizations_stats = [ group + '_' + measure for group in [ 'player', 'allies', 'enemies'] for measure in ['wins', 'battles', 'damage_dealt' ]]
@classmethod
def get_categorizations_all(cls, cats: list = None) -> list:
try:
if cats == None:
return list(cls._categorizations.keys())
else:
return list(set(cls._categorizations.keys()) & set(cats))
except Exception as err:
bu.error(exception=err)
return None
_categorizations_stats = [
'player_wins',
'player_battles',
'player_battles'
]
@classmethod
def get_categorizations_stats(cls, cats=None, stats_cats=None):
try:
if cats == None:
return cls._categorizations_stats
else:
if stats_cats == None:
return cats
player_stat_filters = set(cls._categorizations_stats)
cats = set(cls.get_categorizations_all(cats))
if stats_cats:
cats = cats & player_stat_filters
else:
cats = cats - player_stat_filters
bu.debug(', '.join(list(cats)))
return list(cats)
except Exception as err:
bu.error(exception=err)
return None
def get_categorizations_all(cls):
return cls._categorizations.keys()
@classmethod
@@ -397,10 +370,6 @@ class BattleCategorizationList():
return BattleCategorizationListIterator(self)
def len(self):
return len(self.categorizations)
def get_categorization(self, cat: str):
"""Return a BattleCategorization for a category"""
try:
@@ -409,7 +378,6 @@ class BattleCategorizationList():
bu.error(exception=err)
return None
def record_result(self, result: dict):
try:
for cat in self.categorizations_list:
@@ -1420,7 +1388,7 @@ class ErrorCatchingArgumentParser(argparse.ArgumentParser):
## main() -------------------------------------------------------------
async def main(argv):
global wg, wi, WG_APP_ID, OPT_MODE_DEFAULT, OPT_EXPORT_CSV_FILE, OPT_EXPORT_JSON_FILE
global wg, wi, WG_APP_ID, OPT_MODE_DEFAULT
# set the directory for the script
current_dir = os.getcwd()
os.chdir(os.path.dirname(sys.argv[0]))
@@ -1433,8 +1401,8 @@ async def main(argv):
OPT_HIST = False
OPT_STAT_FUNC = StatFunc.get_default()
OPT_WORKERS_N = 10
# OPT_EXPORT_CSV_FILE = 'export.csv'
# OPT_EXPORT_JSON_FILE = 'export.json'
OPT_EXPORT_CSV_FILE = 'export.csv'
OPT_EXPORT_JSON_FILE = 'export.json'
#WG_ACCOUNT = None # format: nick@server, where server is either 'eu', 'ru', 'na', 'asia' or 'china'.
# China is not supported since WG API stats are not available there
@@ -1446,8 +1414,8 @@ async def main(argv):
## VERY unlikely you have a DB set up
DB_SERVER = 'localhost'
DB_PORT = 27017
DB_TLS = False
DB_CERT_REQ = False
DB_SSL = False
DB_CERT_REQ = ssl.CERT_NONE
DB_AUTH = 'admin'
DB_NAME = 'BlitzStats'
DB_USER = 'mongouser'
@@ -1499,14 +1467,14 @@ async def main(argv):
OPT_DB = configDB.getboolean('opt_DB', OPT_DB)
DB_SERVER = configDB.get('db_server', DB_SERVER)
DB_PORT = configDB.getint('db_port', DB_PORT)
DB_TLS = configDB.getboolean('db_tls', DB_TLS)
DB_CERT_REQ = configDB.getboolean('db_tls_req', DB_CERT_REQ)
DB_SSL = configDB.getboolean('db_ssl', DB_SSL)
DB_CERT_REQ = configDB.getint('db_ssl_req', DB_CERT_REQ)
DB_AUTH = configDB.get('db_auth', DB_AUTH)
DB_NAME = configDB.get('db_name', DB_NAME)
DB_USER = configDB.get('db_user', DB_USER)
DB_PASSWD = configDB.get('db_password', DB_PASSWD)
DB_CERT = configDB.get('db_tls_cert_file', DB_CERT)
DB_CA = configDB.get('db_tls_ca_file', DB_CA)
DB_CERT = configDB.get('db_ssl_cert_file', DB_CERT)
DB_CA = configDB.get('db_ssl_ca_file', DB_CA)
except (KeyError, configparser.NoSectionError) as err:
bu.error(exception=err)
@@ -1552,7 +1520,7 @@ async def main(argv):
#### Connect to MongoDB. You are unlikely to have this set up...
bu.debug('DB_SERVER: ' + DB_SERVER)
bu.debug('DB_PORT: ' + str(DB_PORT))
bu.debug('DB_TLS: ' + "True" if DB_TLS else "False")
bu.debug('DB_SSL: ' + "True" if DB_SSL else "False")
bu.debug('DB_AUTH: ' + DB_AUTH)
bu.debug('DB_NAME: ' + DB_NAME)
@@ -1560,7 +1528,7 @@ async def main(argv):
db = None
if args.db:
try:
client = motor.motor_asyncio.AsyncIOMotorClient(DB_SERVER,DB_PORT, authSource=DB_AUTH, username=DB_USER, password=DB_PASSWD, tls=DB_TLS, tlsAllowInvalidCertificates=DB_CERT_REQ, tlsCertificateKeyFile=DB_CERT, tlsCAFile=DB_CA)
client = motor.motor_asyncio.AsyncIOMotorClient(DB_SERVER,DB_PORT, authSource=DB_AUTH, username=DB_USER, password=DB_PASSWD, ssl=DB_SSL, ssl_cert_reqs=DB_CERT_REQ, ssl_certfile=DB_CERT, tlsCAFile=DB_CA)
db = client[DB_NAME]
bu.debug('Database connection initiated')
except Exception as err:
@@ -1590,78 +1558,103 @@ async def main(argv):
args.account_id = await wg.get_account_id(args.account)
bu.debug('WG account_id: ' + str(args.account_id))
# try:
BattleCategory.set_fields(args.mode)
replayQ = asyncio.Queue(maxsize=1000)
reader_tasks = []
# Make replay Queue
try:
BattleCategory.set_fields(args.mode)
replayQ = asyncio.Queue(maxsize=1000)
reader_tasks = []
# Make replay Queue
scanner_task = asyncio.create_task(mk_replayQ(replayQ, args, db))
bu.set_counter('Reading replays', 10)
# Start tasks to process the Queue
for i in range(OPT_WORKERS_N):
reader_tasks.append(asyncio.create_task(replay_reader(replayQ, i, args)))
bu.debug('ReplayReader ' + str(i) + ' started')
scanner_task = asyncio.create_task(mk_replayQ(replayQ, args, db))
bu.set_counter('Reading replays', 10)
# Start tasks to process the Queue
for i in range(OPT_WORKERS_N):
reader_tasks.append(asyncio.create_task(replay_reader(replayQ, i, args)))
bu.debug('ReplayReader ' + str(i) + ' started')
bu.debug('Waiting for the replay scanner to finish')
await asyncio.wait([scanner_task])
bu.finish_progress_bar()
# bu.debug('Scanner finished. Waiting for replay readers to finish the queue')
await replayQ.join()
await asyncio.sleep(0.1)
bu.debug('Replays read. Cancelling Readers and analyzing results')
for task in reader_tasks:
task.cancel()
await asyncio.sleep(0.1)
results = []
players = set()
replays = dict()
for res in await asyncio.gather(*reader_tasks):
results.extend(res[0])
players.update(res[1])
replays.update(res[2])
if len(players) == 0:
raise Exception("No players found to fetch stats for. No replays found?")
if args.min != None:
results = filter_min_replays_by_player(results, args.min)
bu.debug('Waiting for the replay scanner to finish')
await asyncio.wait([scanner_task])
bu.finish_progress_bar()
# bu.debug('Scanner finished. Waiting for replay readers to finish the queue')
await replayQ.join()
await asyncio.sleep(0.1)
bu.debug('Replays read. Cancelling Readers and analyzing results')
for task in reader_tasks:
task.cancel()
await asyncio.sleep(0.1)
results = []
players = set()
replays = dict()
for res in await asyncio.gather(*reader_tasks):
results.extend(res[0])
players.update(res[1])
replays.update(res[2])
# Filter based on non-stats filters
results = filter_results(results, args.filters, stats_filters=False)
players = get_players(results)
(player_stats, stat_id_map) = await process_player_stats(players, OPT_WORKERS_N, args, db)
# Filter based on stats filters
results = filter_results(results, args.filters, stats_filters=True)
bu.debug(str(len(replays)) + ' replays to process')
replays = filter_replays(replays, results)
bu.debug('Number of player stats: ' + str(len(player_stats)))
teamresults = calc_team_stats(results, player_stats, stat_id_map, args)
if len(players) == 0:
raise Exception("No players found to fetch stats for. No replays found?")
blt_cat_list = process_battle_results(teamresults, args)
bu.verbose_std('WR = ' + StatFunc.get_title())
blt_cat_list.print_results()
if args.min != None:
results = filter_min_replays_by_player(results, args.min)
players = get_players(results)
replays = filter_replays(replays, results)
histograms = None
if args.hist:
histograms = process_player_dist(results, player_stats, stat_id_map)
print_player_dist(histograms)
if args.json:
await export_json(args, blt_cat_list, histograms)
if args.csv:
await export_csv(args, blt_cat_list, histograms)
if args.replays:
await export_replays(replays)
# Filter based on non-stats filters
results = filter_results(results, args.filters, stats_filters=False)
bu.debug('Finished. Cleaning up..................')
# except Exception as err:
# bu.error(exception=err)
(player_stats, stat_id_map) = await process_player_stats(players, OPT_WORKERS_N, args, db)
# Filter based on stats filters
results = filter_results(results, args.filters, stats_filters=True)
bu.debug('Number of player stats: ' + str(len(player_stats)))
teamresults = calc_team_stats(results, player_stats, stat_id_map, args)
blt_cat_list = process_battle_results(teamresults, args)
bu.verbose_std('WR = ' + StatFunc.get_title())
blt_cat_list.print_results()
histograms = None
if args.hist:
histograms = process_player_dist(results, player_stats, stat_id_map)
print_player_dist(histograms)
if args.json:
res = blt_cat_list.get_results_json()
if histograms != None:
res_hist = dict()
for histogram in histograms.keys():
res_hist[histogram] = histograms[histogram].get_results()
res['histograms'] = res_hist
if args.outfile == '-':
export_file = OPT_EXPORT_JSON_FILE
else:
export_file = args.outfile
await bu.save_JSON(export_file, res, pretty=False) ## Excel does not understand pretty JSON
bu.verbose_std('Results exported to: ' + export_file)
if args.csv:
rows = blt_cat_list.get_results_list()
if args.hist:
rows.append('')
rows.append(['Player Histograms'])
for histogram in histograms.values():
rows.append('')
rows.extend(histogram.get_results_list())
if args.outfile == '-':
export_file = OPT_EXPORT_CSV_FILE
else:
export_file = args.outfile
with open(export_file, 'w') as csvfile:
# creating a csv writer object
csvwriter = csv.writer(csvfile)
csvwriter.writerows(rows)
bu.verbose_std('Results exported to: ' + export_file)
if args.replays:
await export_replays(replays)
bu.debug('Finished. Cleaning up..................')
except Exception as err:
bu.error(exception=err)
except UserWarning as err:
bu.warning(str(err))
except asyncio.CancelledError:
@@ -1677,48 +1670,6 @@ async def main(argv):
return None
async def export_csv(args : argparse.Namespace, blt_cat_list: BattleCategorizationList, histograms: dict = None):
"""Export results into a CSV file"""
try:
rows = blt_cat_list.get_results_list()
if args.hist:
rows.append('')
rows.append(['Player Histograms'])
for histogram in histograms.values():
rows.append('')
rows.extend(histogram.get_results_list())
if args.outfile == '-':
export_file = OPT_EXPORT_CSV_FILE
else:
export_file = args.outfile
with open(export_file, 'w') as csvfile:
# creating a csv writer object
csvwriter = csv.writer(csvfile)
csvwriter.writerows(rows)
bu.verbose_std('Results exported to: ' + export_file)
except Exception as err:
bu.error(exception=err)
async def export_json(args : argparse.Namespace, blt_cat_list: BattleCategorizationList, histograms: dict = None):
"""Export results into a JSON file"""
try:
res = blt_cat_list.get_results_json()
if histograms != None:
res_hist = dict()
for histogram in histograms.keys():
res_hist[histogram] = histograms[histogram].get_results()
res['histograms'] = res_hist
if args.outfile == '-':
export_file = OPT_EXPORT_JSON_FILE
else:
export_file = args.outfile
await bu.save_JSON(export_file, res, pretty=False) ## Excel does not understand pretty JSON
bu.verbose_std('Results exported to: ' + export_file)
except Exception as err:
bu.error(exception=err)
async def help_extended(db : motor.motor_asyncio.AsyncIOMotorDatabase = None, parser: argparse.ArgumentParser = None):
"""Help for --filters"""
if parser != None:
@@ -1900,28 +1851,21 @@ def process_battle_results(results: dict, args : argparse.Namespace):
return blt_cat_list
def filter_results(results: list, filters_json : str, stats_filters=None) -> bool:
def filter_results(results: list, filter_json : str, stats_filters=False) -> bool:
"""Filter replays based on battle category filters"""
try:
if filters_json == None:
return results
filters = json.loads(filters_json)
filters = json.loads(filter_json)
bu.debug(str(filters))
if type(filters) != dict:
bu.error('invalid --filter arguments: ' + str(filter))
sys.exit(1)
filter_cats = BattleCategorizationList.get_categorizations_stats(filters.keys(), stats_filters)
filter_cats = BattleCategorizationList(filter_cats)
if filter_cats.len() == 0:
bu.debug('Nothing to filter')
return results
filter_cats = BattleCategorizationList(filters.keys())
bu.verbose('Filters applied:')
for category in filter_cats:
cat = category.category_key
categorization = filter_cats.get_categorization(cat)
bu.debug('Category: ' + cat + ' filters: ' + str(filters))
bu.debug('Category: ' + cat + ' filters type: ' + str(type(filters)) + ' filters: ' + str(filters))
filters[cat] = categorization.get_filter_categories(filters[cat])
bu.verbose(' ' + cat + ' = ' + ','.join(filters[cat]))
bu.verbose('')
@@ -1941,12 +1885,8 @@ def filter_results(results: list, filters_json : str, stats_filters=None) -> boo
res.append(result)
except Exception as err:
bu.error(exception=err)
if len(res) == 0:
raise UserWarning('No replays left after filtering')
bu.verbose_std('Replays after filtering: ' + str(len(res)))
return res
except UserWarning:
raise
except Exception as err:
bu.error(exception=err)
return None
@@ -2021,9 +1961,9 @@ async def process_player_stats(players, N_workers: int, args : argparse.Namespac
def remap_stat_id(stat_id_map: dict, stat_id_remap: dict):
bu.debug('Remapping stat_ids: stat_id_map: ' + str(len(stat_id_map)) + ' remap needed: ' + str(len(stat_id_remap)))
for stat_id in stat_id_map:
# bu.debug(stat_id)
if stat_id_map[stat_id] in stat_id_remap.keys():
stat_id_map[stat_id] = stat_id_remap[stat_id_map[stat_id]]
# bu.debug(stat_id)
if stat_id_map[stat_id] in stat_id_remap.keys():
stat_id_map[stat_id] = stat_id_remap[stat_id_map[stat_id]]
return stat_id_map
@@ -2499,7 +2439,7 @@ async def mk_readerQ_item(replay_json, filename : str = None, _id: str = None) -
try:
if wi.chk_JSON_replay(replay_json):
if not '_id' in replay_json:
if _id == None:
if _id != None:
_id = wi.read_replay_id(replay_json)
replay_json['_id'] = _id
else:
-1
View File
@@ -18,7 +18,6 @@
"fort": "Fort Despair",
"grossberg": "Dynasty's Pearl",
"himmelsdorf": "Himmelsdorf",
"holland": "Molendijk",
"holmeisk": "Wasteland",
"iceworld": "Everfrost",
"idle": "Yukon",
-5
View File
@@ -2,11 +2,6 @@
| Release | Date | Notes | Inaccurate? |
|:-------:|:--------:|-------------|-----|
| 8.9 | 2022-03-23 | "Free" camo resupply, VK 72.01 supplies | |
| 8.8 | 2022-02-16 | Molendijk map | |
| 8.7 | 2022-01-19 | Soviet Light Tanks | |
| 8.6 | 2021-12-15 | Joining Light and Medium Tank classes in MM | |
| 8.5 | 2021-11-17 | New national crew voices, economy update | |
| 8.4 | 2021-10-20 | Polish heavy tanks | |
| 8.3 | 2021-09-16 | FV4005, FV4022, VK 91.01 (P) and WZ-121 legendary camos, -5 deg gun depression to WZ-120 | |
| 8.2 | 2021-08-18 | Ghost Factory map, XP/credits nerf for inactive players, new store UI | |
+22 -411
View File
@@ -1,7 +1,7 @@
{
"status": "ok",
"meta": {
"count": 550
"count": 520
},
"data": {
"1": {
@@ -1252,14 +1252,6 @@
"tier": 7,
"type": "mediumTank"
},
"5473": {
"is_premium": false,
"name": "Mitsu 108",
"nation": "japan",
"tank_id": 5473,
"tier": 5,
"type": "heavyTank"
},
"5489": {
"is_premium": true,
"name": "Y5 T-34",
@@ -1300,14 +1292,6 @@
"tier": 9,
"type": "mediumTank"
},
"5729": {
"is_premium": false,
"name": "Ju-Nu",
"nation": "japan",
"tank_id": 5729,
"tier": 6,
"type": "heavyTank"
},
"5745": {
"is_premium": true,
"name": "Y5 Firefly",
@@ -1364,14 +1348,6 @@
"tier": 8,
"type": "mediumTank"
},
"5985": {
"is_premium": false,
"name": "Ju-To",
"nation": "japan",
"tank_id": 5985,
"tier": 7,
"type": "heavyTank"
},
"6001": {
"is_premium": true,
"name": "Y5 ELC bis",
@@ -1436,14 +1412,6 @@
"tier": 10,
"type": "heavyTank"
},
"6241": {
"is_premium": false,
"name": "Chi-Se",
"nation": "japan",
"tank_id": 6241,
"tier": 8,
"type": "heavyTank"
},
"6257": {
"is_premium": true,
"name": "M4/FL10",
@@ -1508,14 +1476,6 @@
"tier": 4,
"type": "lightTank"
},
"6497": {
"is_premium": false,
"name": "Type 68",
"nation": "japan",
"tank_id": 6497,
"tier": 9,
"type": "heavyTank"
},
"6529": {
"is_premium": false,
"name": "Škoda T 25",
@@ -1564,14 +1524,6 @@
"tier": 5,
"type": "heavyTank"
},
"6753": {
"is_premium": false,
"name": "Type 71",
"nation": "japan",
"tank_id": 6753,
"tier": 10,
"type": "heavyTank"
},
"6785": {
"is_premium": true,
"name": "Škoda T 27",
@@ -1628,14 +1580,6 @@
"tier": 1,
"type": "lightTank"
},
"7009": {
"is_premium": true,
"name": "Type 57",
"nation": "japan",
"tank_id": 7009,
"tier": 8,
"type": "heavyTank"
},
"7025": {
"is_premium": true,
"name": "Vulcan",
@@ -1918,7 +1862,7 @@
},
"8305": {
"is_premium": true,
"name": "Titan H-Nd",
"name": "Titan H-N",
"nation": "other",
"tank_id": 8305,
"tier": 7,
@@ -2052,22 +1996,6 @@
"tier": 4,
"type": "AT-SPG"
},
"9073": {
"is_premium": true,
"name": "Titan-54d",
"nation": "other",
"tank_id": 9073,
"tier": 8,
"type": "mediumTank"
},
"9089": {
"is_premium": true,
"name": "Škoda T 56",
"nation": "european",
"tank_id": 9089,
"tier": 8,
"type": "heavyTank"
},
"9217": {
"is_premium": true,
"name": "IS-6",
@@ -2100,22 +2028,6 @@
"tier": 10,
"type": "AT-SPG"
},
"9329": {
"is_premium": true,
"name": "Titan-150",
"nation": "other",
"tank_id": 9329,
"tier": 6,
"type": "heavyTank"
},
"9345": {
"is_premium": true,
"name": "Svear",
"nation": "european",
"tank_id": 9345,
"tier": 7,
"type": "mediumTank"
},
"9489": {
"is_premium": false,
"name": "E 100",
@@ -2132,14 +2044,6 @@
"tier": 9,
"type": "heavyTank"
},
"9521": {
"is_premium": true,
"name": "WZ-122 TM",
"nation": "china",
"tank_id": 9521,
"tier": 8,
"type": "mediumTank"
},
"9553": {
"is_premium": false,
"name": "AT 8",
@@ -2148,14 +2052,6 @@
"tier": 6,
"type": "AT-SPG"
},
"9601": {
"is_premium": true,
"name": "CS-52 LIS",
"nation": "european",
"tank_id": 9601,
"tier": 7,
"type": "mediumTank"
},
"9745": {
"is_premium": false,
"name": "E 75",
@@ -2188,14 +2084,6 @@
"tier": 6,
"type": "AT-SPG"
},
"9857": {
"is_premium": true,
"name": "Škoda T 45",
"nation": "european",
"tank_id": 9857,
"tier": 7,
"type": "heavyTank"
},
"9985": {
"is_premium": false,
"name": "SU-101",
@@ -2236,14 +2124,6 @@
"tier": 7,
"type": "AT-SPG"
},
"10113": {
"is_premium": true,
"name": "Carro da Combattimento 45t",
"nation": "european",
"tank_id": 10113,
"tier": 10,
"type": "mediumTank"
},
"10241": {
"is_premium": false,
"name": "SU-100M1",
@@ -2366,7 +2246,7 @@
},
"11281": {
"is_premium": true,
"name": "Kampfpanzer 70",
"name": "KpfPz 70",
"nation": "germany",
"tank_id": 11281,
"tier": 9,
@@ -2670,7 +2550,7 @@
},
"15697": {
"is_premium": true,
"name": "Chieftain Mk. 6",
"name": "Chieftain Mk.6",
"nation": "uk",
"tank_id": 15697,
"tier": 10,
@@ -3052,14 +2932,6 @@
"tier": 8,
"type": "heavyTank"
},
"19265": {
"is_premium": true,
"name": "Charles",
"nation": "france",
"tank_id": 19265,
"tier": 6,
"type": "AT-SPG"
},
"19281": {
"is_premium": true,
"name": "Super Conqueror",
@@ -3308,14 +3180,6 @@
"tier": 6,
"type": "mediumTank"
},
"21329": {
"is_premium": true,
"name": "GSOR 1008",
"nation": "uk",
"tank_id": 21329,
"tier": 8,
"type": "AT-SPG"
},
"21505": {
"is_premium": true,
"name": "T-44-85",
@@ -3340,14 +3204,6 @@
"tier": 6,
"type": "mediumTank"
},
"21585": {
"is_premium": true,
"name": "Blasteroid",
"nation": "uk",
"tank_id": 21585,
"tier": 6,
"type": "heavyTank"
},
"21761": {
"is_premium": true,
"name": "STG",
@@ -3372,14 +3228,6 @@
"tier": 10,
"type": "lightTank"
},
"21841": {
"is_premium": true,
"name": "Caliban",
"nation": "uk",
"tank_id": 21841,
"tier": 8,
"type": "heavyTank"
},
"22017": {
"is_premium": true,
"name": "T-34-85",
@@ -3548,14 +3396,6 @@
"tier": 7,
"type": "heavyTank"
},
"23809": {
"is_premium": false,
"name": "Object 84",
"nation": "ussr",
"tank_id": 23809,
"tier": 9,
"type": "lightTank"
},
"23825": {
"is_premium": true,
"name": "Krupp-Steyr Waffenträger",
@@ -3572,14 +3412,6 @@
"tier": 7,
"type": "AT-SPG"
},
"24065": {
"is_premium": false,
"name": "LTG",
"nation": "ussr",
"tank_id": 24065,
"tier": 7,
"type": "lightTank"
},
"24081": {
"is_premium": true,
"name": "U-Panzer",
@@ -3597,7 +3429,7 @@
"type": "mediumTank"
},
"24321": {
"is_premium": false,
"is_premium": true,
"name": "T-100 LT",
"nation": "ussr",
"tank_id": 24321,
@@ -3620,86 +3452,14 @@
"tier": 10,
"type": "AT-SPG"
},
"24593": {
"is_premium": true,
"name": "Keiler",
"nation": "germany",
"tank_id": 24593,
"tier": 8,
"type": "heavyTank"
},
"24609": {
"is_premium": true,
"is_premium": false,
"name": "Concept 1B",
"nation": "usa",
"tank_id": 24609,
"tier": 10,
"type": "heavyTank"
},
"24849": {
"is_premium": true,
"name": "Kryos",
"nation": "germany",
"tank_id": 24849,
"tier": 6,
"type": "AT-SPG"
},
"24865": {
"is_premium": true,
"name": "Scepter",
"nation": "usa",
"tank_id": 24865,
"tier": 8,
"type": "heavyTank"
},
"25089": {
"is_premium": true,
"name": "Object 752",
"nation": "ussr",
"tank_id": 25089,
"tier": 9,
"type": "heavyTank"
},
"25105": {
"is_premium": true,
"name": "Barkhan",
"nation": "germany",
"tank_id": 25105,
"tier": 6,
"type": "heavyTank"
},
"25345": {
"is_premium": true,
"name": "Object 274a",
"nation": "ussr",
"tank_id": 25345,
"tier": 8,
"type": "mediumTank"
},
"25377": {
"is_premium": true,
"name": "T77",
"nation": "usa",
"tank_id": 25377,
"tier": 8,
"type": "heavyTank"
},
"25889": {
"is_premium": true,
"name": "Ranger",
"nation": "usa",
"tank_id": 25889,
"tier": 6,
"type": "lightTank"
},
"26145": {
"is_premium": true,
"name": "High Score",
"nation": "usa",
"tank_id": 26145,
"tier": 5,
"type": "mediumTank"
},
"51201": {
"is_premium": true,
"name": "KV-220 Beta-Test",
@@ -4415,8 +4175,6 @@
"A-20bis": "SP-3",
"A-32": "A-32",
"A-32_mod_1939": "A-32",
"A05_M4_105BD": "High Score",
"A05_M4_105BD_short": "High Score",
"A100_T49": "T49",
"A100_T49_Custom": "T49 Hornet",
"A100_T49_Custom_short": "T49 Hornet",
@@ -4459,17 +4217,11 @@
"A125_AEP_1": "AE Phase I",
"A125_AEP_1_short": "AE Phase I",
"A128_Concept_1b": "Concept 1B",
"A128_Concept_1b_Custom": "Concept 1B Thunderbird",
"A128_Concept_1b_Custom_short": "Concept 1B Thunderbird",
"A128_Concept_1b_short": "Concept 1B",
"A130_Super_Hellcat": "Super Hellcat",
"A130_Super_Hellcat_Custom": "Super Hellcat Delta",
"A130_Super_Hellcat_Custom_short": "Super Hellcat Delta",
"A130_Super_Hellcat_short": "Super Hellcat",
"A132_T77": "T77",
"A132_T77_Custom": "T77 Cannonball",
"A132_T77_Custom_short": "T77 Cannonball",
"A132_T77_short": "T77",
"A68_T28D": "T28 Defender",
"A68_T28D_short": "T28 Defender",
"A77_T6M": "T6E1 Grizzly",
@@ -4551,10 +4303,6 @@
"AVS_1195": "AVS-1195",
"AV_1195": "AV-1195",
"AV_1790": "AV 1790",
"Achilles_FR": "Charles",
"Achilles_FR_Custom": "Charles the Gallant",
"Achilles_FR_Custom_short": "Charles the Gallant",
"Achilles_FR_short": "Charles",
"Aether_W-20": "Aether W-20",
"Akawara": "O-47",
"Akawara_Custom": "O-47 Phoenix",
@@ -4605,7 +4353,6 @@
"CH38_WZ113G-FT_short": "WZ-113G FT",
"CH38_WZ113G_FT_Custom": "WZ-113G FT Lucky",
"CH38_WZ113G_FT_Custom_short": "WZ-113G FT Lucky",
"CKD_AXK": "ČKD AXK",
"Cadillac_V8": "3xCadillacV8",
"Cannone_da_105_51_M68": "Cannone da 105/51 M68",
"Cannone_da_105_51_M68_short": "Cannone da 105/51 M68",
@@ -4627,8 +4374,6 @@
"Canon_de_105_mle_1930_Schneider_AC_short": "105 mm AC\\nmle. 1930 S",
"Canon_de_90mm_Vo_930_m_s": "Canon de 90 mm Vo 930 m/s",
"Ch01_Type59": "Type 59",
"Ch01_Type59_Custom": "Type 59 Qinglong",
"Ch01_Type59_Custom_short": "Type 59 Qinglong",
"Ch02_Type62": "Type 62",
"Ch02_Type62_Dragon": "Type 62 Dragon",
"Ch03_WZ-111": "WZ-111",
@@ -4677,8 +4422,6 @@
"Ch39_WZ120_1G_FT": "WZ-120-1G FT",
"Ch39_WZ120_1G_FT_Custom": "WZ-120-1 FT Enraged",
"Ch39_WZ120_1G_FT_Custom_short": "WZ-120-1 FT Enraged",
"Ch39_WZ120_1G_FT_Custom_short_v2": "WZ-120-1 FT Gongbi",
"Ch39_WZ120_1G_FT_Custom_v2": "WZ-120-1 FT Gongbi",
"Ch39_WZ120_1G_FT_short": "WZ-120-1G FT",
"Ch41_WZ_111_5A": "WZ-111 model 5A",
"Ch41_WZ_111_5A_Custom": "WZ-111 5A Serpent",
@@ -4688,8 +4431,6 @@
"Ch42_M41D_Custom": "M41D Jade",
"Ch42_M41D_Custom_short": "M41D Jade",
"Ch42_M41D_short": "M41D",
"Ch43_WZ-122_2": "WZ-122 TM",
"Ch43_WZ-122_2_short": "WZ-122 TM",
"Ch_LT_vz38": "LT vz. 38",
"Ch_LT_vz38_short": "LT vz. 38",
"Ch_WZ-112v2": "WZ-112-2",
@@ -4732,7 +4473,6 @@
"Continental_AOS-895-3": "AN/GRC-8",
"Continental_AOS-895-3_short": "AN/GRC-8",
"Continental_AOSI-1195-1": "Continental AOSI 1195-1",
"Continental_AOSI-1195-1A": "Continental AOSI-1195-1A",
"Continental_AOSI-1195-5": "Continental AOSI-1195-5",
"Continental_AOSI-895-5": "Continental AOSI-895-5",
"Continental_AOSI-895-5_short": "Continental\\nAOSI-895-5",
@@ -4756,7 +4496,6 @@
"Continental_AVDS-1790-2": "Continental AVDS-1790-2",
"Continental_AVDS-1790-2_short": "Continental\\nAVDS-1790-2",
"Continental_AVI_1790_8": "Continental AVI-1790-8",
"Continental_AV_1790_5B": "Continental AV-1790-5B",
"Continental_AV_1790_5C": "Continental AV-1790-5C",
"Continental_AV_1790_5C_short": "Continental\\nAV-1790-5C",
"Continental_R-670-5": "Continental R-670-5",
@@ -4806,12 +4545,6 @@
"Cz13_T-27_Custom": "Škoda T 27 Rampant",
"Cz13_T-27_Custom_short": "Škoda T 27 Rampant",
"Cz13_T-27_short": "Škoda T 27",
"Cz14_Skoda_T-56": "Škoda T 56",
"Cz14_Skoda_T-56_Custom": "Škoda T 56 Golem",
"Cz14_Skoda_T-56_Custom_short": "Škoda T 56 Golem",
"Cz14_Skoda_T-56_short": "Škoda T 56",
"Cz15_Skoda_T-45": "Škoda T 45",
"Cz15_Skoda_T-45_short": "Škoda T 45",
"D-744": "D-744",
"D1": "D1",
"D1_short": "D1",
@@ -4824,8 +4557,6 @@
"D51072": "D51072",
"D51080": "D51080",
"DB_605": "DB 605",
"DB_605NY": "DB 605 A",
"DG": "DG",
"DMA-RD-620C2": "DMA RD-620C2",
"DW_II": "Durchbruchswagen 2",
"DW_II_short": "D.W. 2",
@@ -4885,8 +4616,6 @@
"F69_AMX_13_57GF": "AMX 13 57",
"F69_AMX_13_57GF_short": "AMX 13 57",
"F71_AMX_30_prototype": "AMX 30 1er prototype",
"F71_AMX_30_prototype_Custom": "AMX 30 Win Peaks",
"F71_AMX_30_prototype_Custom_short": "AMX 30 Win Peaks",
"F71_AMX_30_prototype_short": "AMX 30 1er prot.",
"F72_AMX_30": "AMX 30 B",
"F72_AMX_30_Custom": "AMX 30 B Corsica",
@@ -4907,8 +4636,6 @@
"F84_Somua_SM_Custom_short": "Somua Grenadier",
"F84_Somua_SM_short": "Somua SM",
"F89_Canon_dassaut_105": "AMX Canon d'assaut 105",
"F89_Canon_dassaut_105_Custom": "CDA 105 Égalité",
"F89_Canon_dassaut_105_Custom_short": "CDA 105 Égalité",
"F89_Canon_dassaut_105_short": "AMX CDA 105",
"FCM50t_fwhite": "FCM 50 t Titi",
"FCM50t_fwhite_short": "FCM 50 t Titi",
@@ -4936,7 +4663,6 @@
"Ford_GAA-3": "Christmas Spirit",
"Ford_GAA-4": "Ford GAA",
"Ford_GAA_2": "Ford GAA",
"Ford_GAA_FR": "Ford GAA",
"Ford_GAC": "Ford GAZ",
"Ford_GAC_1": "None",
"Ford_GAF": "Ford GAF",
@@ -4946,7 +4672,6 @@
"Ford_GAF_500": "Ford GAF (500)",
"Ford_GAF_V8": "Ford GAF V8",
"Ford_GAN": "Ford GAN",
"Ford_GAN_BP": "Ford GAN",
"Ford_GAN_T": "Ford GAN No. 17",
"Ford_GAN_T23": "None",
"Ford_V8-221": "Ford V8-221",
@@ -4961,8 +4686,6 @@
"G106_PzKpfwPanther_AusfF": "Panther mit 8,8 cm L/71",
"G106_PzKpfwPanther_AusfF_short": "Panther 8,8",
"G109_Steyr_WT": "Krupp-Steyr Waffenträger",
"G109_Steyr_WT_Custom": "Steyr WT Snakebite",
"G109_Steyr_WT_Custom_short": "Steyr WT Snakebite",
"G109_Steyr_WT_short": "Steyr WT",
"G110_Mauschen": "Mäuschen",
"G110_Mauschen_short": "Mäuschen",
@@ -4994,13 +4717,11 @@
"G138_VK16801P": "VK 168.01 (P)",
"G138_VK16801P_short": "VK 168.01 (P)",
"G142_M48RPz": "M48A2 Räumpanzer",
"G142_M48RPz_Custom": "Räumpanzer Rhino",
"G142_M48RPz_Custom_short": "Räumpanzer Rhino",
"G142_M48RPz_short": "M48A2 Räumpanzer",
"G144_Kpz_50t": "Kampfpanzer 50 t",
"G144_Kpz_50t_Custom": "Kpz 50 t König",
"G144_Kpz_50t_Custom": "Kampfpanzer 50 t König",
"G144_Kpz_50t_Custom_short": "Kpz 50 t König",
"G144_Kpz_50t_short": "Kpz 50 t",
"G144_Kpz_50t_short": "Kampfpanzer 50 t",
"G147_mPanzer_64": "Kunze Panzer",
"G147_mPanzer_64_Custom": "Kunze Pz. Daredevil",
"G147_mPanzer_64_Custom_short": "Kunze Pz. Daredevil",
@@ -5015,8 +4736,6 @@
"GAZ-74b": "SU-85B",
"GAZ-M1": "GAZ-M1",
"GAZ_M1": "GAZ-M1",
"GAZ_O": "GAZ-O",
"GAZ_OU": "GAZ-OU",
"GB01_Medium_Mark_I": "Vickers Medium Mk. I",
"GB01_Medium_Mark_I_short": "Medium I",
"GB03_Cruiser_Mk_I": "Cruiser Mk. I",
@@ -5036,12 +4755,8 @@
"GB08_Churchill_I": "Churchill I",
"GB08_Churchill_I_short": "Churchill I",
"GB09_Churchill_VII": "Churchill VII",
"GB109_GSOR_1008": "GSOR 1008",
"GB109_GSOR_1008_short": "GSOR 1008",
"GB10_Black_Prince": "Black Prince",
"GB10_Black_Prince_short": "Black Prince",
"GB112_Caliban": "Caliban",
"GB112_Caliban_short": "Caliban",
"GB11_Caernarvon": "Caernarvon",
"GB11_Caernarvon_short": "Caernarvon",
"GB12_Conqueror": "Conqueror",
@@ -5095,10 +4810,6 @@
"GB60_Covenanter": "Covenanter",
"GB60_Covenanter_short": "Covenanter",
"GB63_TOG_II": "TOG II*",
"GB63_TOG_II_BP": "Blasteroid",
"GB63_TOG_II_BP_Custom": "Blasteroid Neo",
"GB63_TOG_II_BP_Custom_short": "Blasteroid Neo",
"GB63_TOG_II_BP_short": "Blasteroid",
"GB68_Matilda_Black_Prince": "Matilda Black Prince",
"GB68_Matilda_Black_Prince_short": "Matilda BP",
"GB69_Cruiser_Mk_II": "Cruiser Mk. II",
@@ -5122,10 +4833,10 @@
"GB83_4005_Custom": "FV4005 Overkill",
"GB83_4005_Custom_short": "FV4005 Overkill",
"GB83_4005_short": "FV4005",
"GB84_Chieftain_Mk6": "Chieftain Mk. 6",
"GB84_Chieftain_Mk6_Custom": "Chieftain Mk. 6 Royal",
"GB84_Chieftain_Mk6_Custom_short": "Chieftain Mk. 6 Royal",
"GB84_Chieftain_Mk6_short": "Chieftain Mk. 6",
"GB84_Chieftain_Mk6": "Chieftain Mk.6",
"GB84_Chieftain_Mk6_Custom": "Chieftain Mk.6 Royal",
"GB84_Chieftain_Mk6_Custom_short": "Chieftain Mk.6 Royal",
"GB84_Chieftain_Mk6_short": "Chieftain Mk.6",
"GB85_Cromwell_Berlin": "Cromwell B",
"GB85_Cromwell_Berlin_Custom": "Cromwell B Berlin",
"GB85_Cromwell_Berlin_Custom_short": "Cromwell B Berlin",
@@ -5188,28 +4899,20 @@
"GM_6-71_M": "GM 6062 6-71M",
"GM_X-11": "GM X-11",
"GM_X-12": "GM X-12",
"GTD": "GTD",
"GT_101": "GT 101",
"G_E": "G.W. E 100",
"G_E-75RT": "Keiler",
"G_E-75RT_short": "Keiler",
"G_E-75TS": "E 75 TS",
"G_E-75TS_short": "E 75 TS",
"G_E_75TS_Custom": "E 75 TS Eagle",
"G_E_75TS_Custom_short": "E 75 TS Eagle",
"G_E_short": "G.W. E 100",
"G_KpfPz_70": "Kampfpanzer 70",
"G_KpfPz_70_Custom": "Kpz 70 Cavalry",
"G_KpfPz_70_Custom_short": "Kpz 70 Cavalry",
"G_KpfPz_70_short": "Kpz 70",
"G_KpfPz_70": "KpfPz 70",
"G_KpfPz_70_Custom": "KpfPz 70 Cavalry",
"G_KpfPz_70_Custom_short": "KpfPz 70 Cavalry",
"G_KpfPz_70_short": "KpfPz 70",
"G_Panther": "G.W. Panther",
"G_Panther_short": "G.W. Panther",
"G_Tiger": "G.W. Tiger",
"G_Tiger_short": "G.W. Tiger",
"G_VK3502_BP": "Barkhan",
"G_VK3502_BP_Custom": "Barkhan Expedition",
"G_VK3502_BP_Custom_short": "Barkhan Expedition",
"G_VK3502_BP_short": "Barkhan",
"G_VK9001P": "VK 90.01 (P)",
"G_VK9001P_Custom": "VK 90.01 (P) Blade",
"G_VK9001P_Custom_short": "VK 90.01 (P) Blade",
@@ -5318,8 +5021,6 @@
"It14_P44_Pantera_Custom": "P.44 Pantera Furious",
"It14_P44_Pantera_Custom_short": "P.44 Pantera Furious",
"It14_P44_Pantera_short": "P.44 Pantera",
"It20_Car_Comb_45t": "Carro da Combattimento 45t",
"It20_Car_Comb_45t_short": "Carro 45t",
"J12_Shinobi": "Shinobi",
"J12_Shinobi_short": "Shinobi",
"J20_Ho_Ri_type3": "Ho-Ri Type III",
@@ -5332,24 +5033,6 @@
"J22_Ho_Ri_type96_short": "Ho-Ri T.I",
"J23_Chi_To_SPG": "Chi-To SPG",
"J23_Chi_To_SPG_short": "Chi-To SPG",
"J24_Type_57": "Type 57",
"J24_Type_57_Custom": "Type 57 Mechacamo",
"J24_Type_57_Custom_short": "Type 57 Mechacamo",
"J24_Type_57_short": "Type 57",
"J25_Type71": "Type 71",
"J25_Type71_Custom": "Type 71 Sankai",
"J25_Type71_Custom_short": "Type 71 Sankai",
"J25_Type71_short": "Type 71",
"J26_Type_68": "Type 68",
"J26_Type_68_short": "Type 68",
"J27_Chi_Se": "Chi-Se",
"J27_Chi_Se_short": "Chi-Se",
"J28_Ju_To": "Ju-To",
"J28_Ju_To_short": "Ju-To",
"J29_Ju_Nu": "Ju-Nu",
"J29_Ju_Nu_short": "Ju-Nu",
"J30_Mitsu_108": "Mitsu 108",
"J30_Mitsu_108_short": "Mitsu 108",
"J_V12_M": "American la France “J” V-12",
"JagdPanther": "Jagdpanther",
"JagdPantherII": "Jagdpanther II",
@@ -5357,10 +5040,6 @@
"JagdPanther_short": "JPanther",
"JagdPzIV": "Jagdpanzer IV",
"JagdPzIV_0": "Jagdpanzer IV",
"JagdPzIV_AusfBP": "Kryos",
"JagdPzIV_AusfBP_Custom": "Kryos Survivor",
"JagdPzIV_AusfBP_Custom_short": "Kryos Survivor",
"JagdPzIV_AusfBP_short": "Kryos",
"JagdPzIV_Ausf_1940": "Jagdpanzer IV 0-Serie",
"JagdPzIV_Ausf_1943": "Jagdpanzer IV",
"JagdPzIV_short": "Jg.Pz. IV",
@@ -5380,8 +5059,6 @@
"JgPzV_Standardketten": "Jagdpanther",
"JgPzV_Vetstaerktketten": "Jagdpanther verstärkteketten",
"K-91": "K-91",
"K-91_Custom": "K-91 Burn",
"K-91_Custom_short": "K-91 Burn",
"K-91_short": "K-91",
"KV": "KV",
"KV-13": "KV-13",
@@ -5413,11 +5090,6 @@
"KV_1_Custom_short": "KV-1 Warrior",
"KV_2": "KV-2",
"KZ-V8": "KZ V8",
"Kawasaki_Ha60_IB": "Kawasaki Ha60 IB",
"Kawasaki_Ha60_Ic": "Kawasaki Ha60 Ic",
"Kawasaki_Ha8": "Kawasaki Ha8",
"Kawasaki_Ha9_IIC": "Kawasaki Ha9 IIC",
"Kawasaki_Ha9_IID": "Kawasaki Ha9 IID",
"Ke_Ho": "Type 5 Ke-Ho",
"Ke_Ho_short": "Ke-Ho",
"Ke_Ni": "Type 98 Ke-Ni",
@@ -5461,10 +5133,6 @@
"M-17L": "M-17L",
"M-17T": "M-17T",
"M-3-Y": "M-III-Yoh",
"M-3-Y-Midas": "Scepter",
"M-3-Y-Midas_Custom": "Scepter Impeccable",
"M-3-Y-Midas_Custom_short": "Scepter Impeccable",
"M-3-Y-Midas_short": "Scepter",
"M-3-Y_short": "M-III-Yoh",
"M-5-400": "M-5-400",
"M-5-400F": "M-5-400F",
@@ -5572,7 +5240,6 @@
"MB-838_CAM-500_short": "MB 838 CaM 500",
"MB507": "DB 603 A2",
"MB517": "MB 517",
"MB_822_Ka_500": "MB 822 Ka-500",
"MB_837_Aa": "MB 837 Aa",
"MB_837_Ea": "MB 837 Ea",
"MB_837_F": "MB 837 F",
@@ -5618,7 +5285,6 @@
"Maybach_HL_116": "Maybach HL 116",
"Maybach_HL_116_S": "Maybach HL 116 S",
"Maybach_HL_120": "Maybach HL 120",
"Maybach_HL_120BP": "Maybach HL 120",
"Maybach_HL_120_TR": "Maybach HL 120 TR",
"Maybach_HL_120_TRM": "Maybach HL 120 TRM",
"Maybach_HL_120_TRMB": "Maybach HL 120 TRM Ausf. A",
@@ -5631,7 +5297,6 @@
"Maybach_HL_120_TR_R": "Maybach HL 120 TR R",
"Maybach_HL_120_WH": "Dark Soul",
"Maybach_HL_150": "Maybach HL 150",
"Maybach_HL_150BP": "Maybach HL 150 B",
"Maybach_HL_157": "Maybach HL 157",
"Maybach_HL_157P": "Maybach HL 157 P",
"Maybach_HL_157_P": "Maybach HL 157 P",
@@ -5694,14 +5359,9 @@
"Meadows_HOP_OC": "Meadows H.O.P. O.C.",
"Medous_MAT": "Meadows MAT",
"Meteor_Mark_IV_Mod_271": "Meteor Mark IV Mod 271",
"Meteorite_Mk_202": "Meteorite Mk. 202",
"Minkovsky_engine": "Minkovsky engine",
"Mitsubishi": "Mitsubishi A475VD",
"Mitsubishi_10ZF": "Mitsubishi 10ZF",
"Mitsubishi_12ZF": "Mitsubishi 12ZF",
"Mitsubishi_12ZM": "Mitsubishi 12ZM",
"Mitsubishi_12ZT": "Mitsubishi 12ZT",
"Mitsubishi_MT11": "Mitsubishi MT11",
"Mk.II_CS": "57mm Common Shell",
"Mod_T-10": "IS-3",
"Moteur_moderne_3M_27_1_01": "Moteur moderne 3M.27.1.01",
@@ -5709,8 +5369,8 @@
"NC27": "Renault Otsu",
"NC27_short": "R. Otsu",
"NORINCO_12150L7": "NORINCO 12150L",
"NVSS_T66": "HVSS T66",
"NVSS_T80": "HVSS T80",
"NVSS_T66": "NVSS T66",
"NVSS_T80": "NVSS T80",
"Nashorn": "Nashorn",
"Nashorn_short": "Nashorn",
"Nuffield_liberty_MKII": "Nuffield Liberty Mk. II",
@@ -5724,8 +5384,6 @@
"OQF_17pdr_Gun_Mk_VIIG_short": "OQF 17-pdr Gun Mk. VII G",
"OQF_17pdr_Gun_Mk_VIII": "OQF 17-pdr Gun Mk. VIII",
"OQF_17pdr_Gun_Mk_VIII_short": "OQF 17-pdr Gun Mk. VIII",
"OQF_17pdr_Gun_Mk_VII_BP": "OQF 17-pdr Gun Mk. VII",
"OQF_17pdr_Gun_Mk_VII_BP_short": "OQF 17-pdr Gun Mk. VII",
"OQF_3pdr_Gun": "OQF 3-pdr Gun Mk. II",
"OQF_55_pdr_AT_Gun": "OQF 55-pdr AT Gun",
"OQF_55_pdr_AT_Gun_short": "OQF 55-pdr AT Gun",
@@ -5813,16 +5471,10 @@
"Oth27_M24_AMX_Custom": "Titan Flare",
"Oth27_M24_AMX_Custom_short": "Titan Flare",
"Oth27_M24_AMX_short": "Titan T24 57",
"Oth28_Sturmfeur_HW": "Titan H-Nd",
"Oth28_Sturmfeur_HW_short": "Titan H-Nd",
"Oth28_Sturmfeur_HW": "Titan H-N",
"Oth28_Sturmfeur_HW_short": "Titan H-N",
"Oth29_A15HW": "Titan Mk. I",
"Oth29_A15HW_short": "Titan Mk. I",
"Oth30_T54MS": "Titan-54d",
"Oth30_T54MS_short": "Titan-54d",
"Oth31_T150BP": "Titan-150",
"Oth31_T150BP_Custom": "Titan-150 Trailblazer",
"Oth31_T150BP_Custom_short": "Titan-150 Trailblazer",
"Oth31_T150BP_short": "Titan-150",
"PLInz_RWA": "PLInz R.W.A.",
"PLT_27": "PLT-27",
"Paccar_120_325HT": "Gas Boiler",
@@ -5835,7 +5487,6 @@
"PanzerJager_I": "Panzerjäger I",
"PanzerJager_I_short": "Pz.Jäg. I",
"Paxman_Ricardo": "Paxman 12TP",
"Paxman_Ricardo_BP": "Paxman 12TP",
"Pershing": "M26 Pershing",
"Pershing_short": "Pershing",
"Pershingchassis1": "M26T80E1",
@@ -5849,20 +5500,14 @@
"Pl07_14TP": "14TP",
"Pl07_14TP_short": "14TP",
"Pl08_50TP_prot": "50TP prototyp",
"Pl08_50TP_prot_Custom": "50TP prototyp Hussar",
"Pl08_50TP_prot_Custom_short": "50TP prot. Hussar",
"Pl08_50TP_prot_short": "50TP prototyp",
"Pl10_40TP_Habicha": "40TP Habicha",
"Pl10_40TP_Habicha_short": "40TP Habicha",
"Pl119_CS_52_LIS": "CS-52 LIS",
"Pl119_CS_52_LIS_short": "CS-52 LIS",
"Pl11_45TP_Habicha": "45TP Habicha",
"Pl11_45TP_Habicha_short": "45TP Habicha",
"Pl13_53TP_Markowskiego": "53TP Markowskiego",
"Pl13_53TP_Markowskiego_short": "53TP Markowskiego",
"Pl15_60TP": "60TP Lewandowskiego",
"Pl15_60TP_Custom": "60TP Krzemień",
"Pl15_60TP_Custom_short": "60TP Krzemień",
"Pl15_60TP_short": "60TP Lewandowskiego",
"Porsche_16_Cyl_Y1": "Porsche 16 Cyl. Y",
"Porsche_16_Cyl_Y2": "Porsche Typ 212 NL",
@@ -6077,15 +5722,9 @@
"R120_T22SR_short": "T-22 medium",
"R127_T44_100_P": "T-44-100",
"R127_T44_100_P_short": "T-44-100",
"R131_LTG": "LTG",
"R131_LTG_short": "LTG",
"R132_T100LT": "T-100 LT",
"R132_T100LT_Custom": "T-100 LT Interceptor",
"R132_T100LT_Custom_short": "T-100 LT Interceptor",
"R132_T100LT_short": "T-100 LT",
"R134_Object_252U": "Object 252U",
"R134_Object_252U_Custom": "Object 252U Vigilant",
"R134_Object_252U_Custom_short": "Object 252U Vigilant",
"R134_Object_252U_short": "Obj. 252U",
"R140_M4A2_Loza": "Loza's M4-A2 Sherman",
"R140_M4A2_Loza_short": "Loza's Sherman",
@@ -6105,14 +5744,6 @@
"R159_SU_130PM_short": "SU-130PM",
"R160_object_244": "Object 244",
"R160_object_244_short": "Object 244",
"R172_Object_752": "Object 752",
"R172_Object_752_Custom": "Object 752 Stargazer",
"R172_Object_752_Custom_short": "Obj. 752 Stargazer",
"R172_Object_752_short": "Object 752",
"R180_Object_274A": "Object 274a",
"R180_Object_274A_Custom": "Object 274a Leshy",
"R180_Object_274A_Custom_short": "Object 274a Leshy",
"R180_Object_274A_short": "Object 274a",
"R43_T-70_57": "T-70/57",
"R43_T-70_57_short": "T-70/57",
"R63_ST_IBD": "T-2020",
@@ -6123,13 +5754,11 @@
"R98_T44_85": "T-44-85",
"R98_T44_85_Custom": "T-44-85 Bravery",
"R98_T44_85_Custom_short": "T-44-85 Bravery",
"R98_T44_85_Custom_short_v2": "T-44-85 Cosmic",
"R98_T44_85_Custom_v2": "T-44-85 Cosmic",
"R98_T44_85_Custom_short_v2": "T-44-85 Space",
"R98_T44_85_Custom_v2": "T-44-85 Space",
"R98_T44_85_short": "T-44-85",
"RX_20_1_chassis": "RX-20-1",
"RX_20_1_turret": "RX-20-1",
"R_Object_84": "Object 84",
"R_Object_84_short": "Object 84",
"Ram-II": "Ram II",
"Ram_II_D1": "Ram II D1",
"Redcell_Mk1": "Redcell Mk. 1",
@@ -6162,7 +5791,6 @@
"Rolls_Royce_Griffon-Mk2": "Rolls-Royce Griffon A",
"Rolls_Royce_Griffon_B": "Rolls-Royce Griffon B",
"Rolls_Royce_Meteor_Mark_IVB_900": "Rolls-Royce Meteor Mk. IVB (900)",
"Rolls_Royce_Meteor_MkIV_B12": "Rolls-Royce Meteor Mk. IVB/12",
"Rolls_Royce_Meteor_P": "Rolls-Royce Meteor P",
"Rolls_Royse_Meteor": "Rolls-Royce Meteor",
"Rolls_Royse_Meteor_M120": "Rolls-Royce Meteor M120",
@@ -6193,8 +5821,6 @@
"S07_Strv_74": "Strv 74",
"S07_Strv_74_short": "Strv 74",
"S13_Leo": "Leo",
"S13_Leo_NY": "Svear",
"S13_Leo_NY_short": "Svear",
"S13_Leo_short": "Leo",
"S16_Kranvagn": "Kranvagn",
"S16_Kranvagn_Custom": "Kranvagn Nidhögg",
@@ -6211,8 +5837,6 @@
"S25_EMIL_51_Custom_short": "EMIL 1951 Viking",
"S25_EMIL_51_short": "EMIL 1951",
"S26_Lancen_C": "Lansen C",
"S26_Lancen_C_Custom": "Lansen Moose",
"S26_Lancen_C_Custom_short": "Lansen Moose",
"S26_Lancen_C_short": "Lansen C",
"S35_captured": "Pz.Kpfw. S35 739 (f)",
"S35_captured_short": "Pz. S35",
@@ -6291,7 +5915,6 @@
"Sgr_m38": "Sgr m/38",
"Sherman_Jumbo": "M4A3E2 Sherman Jumbo",
"Sherman_Jumbo_short": "M4A3E2",
"Skoda_16_ADH_134": "Škoda 16 ADH 134",
"Skoda_16_ADH_140_A": "Škoda 16 ADH 140",
"Skoda_16_AH_145": "Škoda 16 AH 145",
"Skoda_16_AH_145_A": "Škoda 16 AH 145 A",
@@ -6411,10 +6034,6 @@
"T20D1": "T20D1",
"T20D2": "T20D2",
"T21": "T21",
"T21_BP": "Ranger",
"T21_BP_Custom": "Ranger All-Terrain",
"T21_BP_Custom_short": "Ranger All-Terrain",
"T21_BP_short": "Ranger",
"T23": "T23",
"T23D51080": "T23D51080",
"T23E3": "T23E3",
@@ -6499,7 +6118,6 @@
"T95E2_short": "T95E2",
"T99E2": "T99E2",
"TD-12": "TD-12",
"TD-12S": "TD-12S",
"TD-30": "M-50D",
"T_44_100_Custom": "T-44-100 Hellfire",
"T_44_100_Custom_short": "T-44-100 Hellfire",
@@ -6549,7 +6167,6 @@
"V-12-5U": "V-12-5U",
"V-12-5_shortened": "V-12-5 shortened",
"V-12-6": "V-12-6",
"V-12-6B": "V-12-6B",
"V-12A": "V-12 A",
"V-12P": "V-12P",
"V-12PA": "V-12PA",
@@ -6561,7 +6178,6 @@
"V-2-34E": "V-2-34E",
"V-2-34M": "V-2-34M",
"V-2-34M_BP": "V-2-34M B",
"V-2-34S": "V-2-34S",
"V-2-44": "V-2-44",
"V-2-54": "V-2-54",
"V-2-54IS": "V-2-54IS",
@@ -6579,9 +6195,7 @@
"V-2SNx2": "2x V-2K-F",
"V-4": "V-4",
"V-44": "V-44",
"V-44-2": "V-44-2",
"V-44A": "V-44A",
"V-44AD": "V-44AD",
"V-5": "V-5",
"V-54": "V-54",
"V-54-6": "V-54-6",
@@ -6590,7 +6204,6 @@
"V-54K_TU": "V-54K",
"V-55": "V-55",
"V-55U": "V-14",
"V-5BP": "V-5B",
"V-5F": "V-5F",
"V-5U": "V-5U",
"V-64": "V-64",
@@ -6681,7 +6294,6 @@
"V_2_34M": "V-2-34M",
"V_2_34_modificato": "V-2-34 modificato",
"V_2_54SCG": "V-2-54SCG",
"V_46_5": "V-46-5",
"V_54": "V-54",
"V_54_105": "V-54-105",
"ValentineMK_I": "Valentine",
@@ -6722,7 +6334,6 @@
"Wright_Continental_R-975C3": "Wright Continental R-975C3",
"Wright_Continental_R-975C4": "Wright Continental R-975C4",
"Wright_Continental_R-975C4B": "Wright Continental R-975C4B",
"Wright_Continental_R-975C4_BD": "Wright Continental R-975C4",
"Wright_Continental_R-975C4_short": "Wright C. R-975C4",
"Wright_Continental_R-975EC2": "Wright Continental R-975EC2",
"Wright_Continental_R-975EC2_short": "Wright C. R-975EC2",