From 00469384b497e8919b9fb19fb691f84ed33e19cb Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 25 May 2021 14:26:01 +0100 Subject: [PATCH 01/17] Suits: Keep using CAPI-source Suit name if we have it. * We were referring to *suit* 'slot id', when that's only for the loadouts. For suits we have a full id, from Frontier, that we use. * Comment that creating a suit loadout does *not* automatically equip it. Now, **if we have CAPI data** we will use the CAPI-sourced localised name for the suit display. Where we don't (yet) have CAPI data we still use the badly localised journal name for the suit. --- monitor.py | 60 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/monitor.py b/monitor.py index eeedfbd6..6b04ad69 100644 --- a/monitor.py +++ b/monitor.py @@ -1075,8 +1075,8 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below # "ModuleName":"wpn_s_pistol_plasma_charged", # "ModuleName_Localised":"Manticore Tormentor" } ] } # - suit_slotid, suitloadout_slotid = self.suitloadout_store_from_event(entry) - if not self.suit_and_loadout_setcurrent(suit_slotid, suitloadout_slotid): + suitid, suitloadout_slotid = self.suitloadout_store_from_event(entry) + if not self.suit_and_loadout_setcurrent(suitid, suitloadout_slotid): logger.error(f"Event was: {entry}") elif event_type == 'CreateSuitLoadout': @@ -1091,7 +1091,10 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below # { "SlotName":"SecondaryWeapon", "SuitModuleID":1700217869872834, # "ModuleName":"wpn_s_pistol_kinetic_sauto", "ModuleName_Localised":"Karma P-15" } ] } # - _, _ = self.suitloadout_store_from_event(entry) + suitid, suitloadout_slotid = self.suitloadout_store_from_event(entry) + # Creation doesn't mean equipping it + # if not self.suit_and_loadout_setcurrent(suitid, suitloadout_slotid): + # logger.error(f"Event was: {entry}") elif event_type == 'DeleteSuitLoadout': # alpha4: @@ -1591,45 +1594,52 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below :param entry: Journal entry - 'SwitchSuitLoadout' or 'SuitLoadout' :return Tuple[suit_slotid, suitloadout_slotid]: The IDs we set data for. """ - suit_slotid = self.suit_loadout_id_from_loadoutid(entry['LoadoutID']) - # Initial suit containing just the data that is then embedded in - # the loadout - new_suit = { - 'name': entry['SuitName'], - 'locName': entry.get('SuitName_Localised', entry['SuitName']), - 'suitId': entry['SuitID'], - } + # This is the full ID from Frontier, it's not a sparse array slot id + suitid = entry['SuitID'] + + # Check if this looks like a suit we already have stored, so as + # to avoid 'bad' Journal localised names. + suit = self.state['Suits'].get(f"{suitid}", None) + if not suit: + # Initial suit containing just the data that is then embedded in + # the loadout + suit = { + 'locName': entry.get('SuitName_Localised', entry['SuitName']), + 'suitId': entry['SuitID'], + 'name': entry['SuitName'], + } + + suitloadout_slotid = self.suit_loadout_id_from_loadoutid(entry['LoadoutID']) # Make the new loadout, in the CAPI format new_loadout = { - 'loadoutSlotId': suit_slotid, - 'suit': new_suit, + 'loadoutSlotId': suitloadout_slotid, + 'suit': suit, 'name': entry['LoadoutName'], - 'slots': self.suit_loadout_slots_array_to_dict( - entry['Modules']), + 'slots': self.suit_loadout_slots_array_to_dict(entry['Modules']), } # Assign this loadout into our state - self.state['SuitLoadouts'][f"{new_loadout['loadoutSlotId']}"] = new_loadout + self.state['SuitLoadouts'][f"{suitloadout_slotid}"] = new_loadout # Now add in the extra fields for new_suit to be a 'full' Suit structure - new_suit['id'] = None # Not available in 4.0.0.100 journal event - new_suit['slots'] = new_loadout['slots'] # 'slots', not 'Modules', to match CAPI - # Ensure new_suit is in self.state['Suits'] - self.state['Suits'][f"{suit_slotid}"] = new_suit + suit['id'] = suit.get('id') # Not available in 4.0.0.100 journal event + suit['slots'] = new_loadout['slots'] # 'slots', not 'Modules', to match CAPI + # Ensure the suit is in self.state['Suits'] + self.state['Suits'][f"{suitid}"] = suit - return suit_slotid, new_loadout['loadoutSlotId'] + return suitid, suitloadout_slotid - def suit_and_loadout_setcurrent(self, suit_slotid: int, suitloadout_slotid: int) -> bool: + def suit_and_loadout_setcurrent(self, suitid: int, suitloadout_slotid: int) -> bool: """ Set self.state for SuitCurrent and SuitLoadoutCurrent as requested. If the specified slots are unknown we abort and return False, else return True. - :param suit_slotid: Numeric ID of the slot for the suit. + :param suitid: Numeric ID of the suit. :param suitloadout_slotid: Numeric ID of the slot for the suit loadout. :return: True if we could do this, False if not. """ - str_suitid = f"{suit_slotid}" + str_suitid = f"{suitid}" str_suitloadoutid = f"{suitloadout_slotid}" if (self.state['Suits'].get(str_suitid, False) @@ -1638,7 +1648,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below self.state['SuitLoadoutCurrent'] = self.state['SuitLoadouts'][str_suitloadoutid] return True - logger.error(f"Tried to set a suit and suitloadout where we didn't know about both: {suit_slotid=}, " + logger.error(f"Tried to set a suit and suitloadout where we didn't know about both: {suitid=}, " f"{str_suitloadoutid=}") return False From 68a0e6c7af1014da3fa0d3854ccb21bafb07eb42 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 25 May 2021 14:31:27 +0100 Subject: [PATCH 02/17] Test for `if suit is None` rather than a boolean test. This matches the explicit default in the .get() --- monitor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monitor.py b/monitor.py index 6b04ad69..8caceb97 100644 --- a/monitor.py +++ b/monitor.py @@ -1600,7 +1600,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below # Check if this looks like a suit we already have stored, so as # to avoid 'bad' Journal localised names. suit = self.state['Suits'].get(f"{suitid}", None) - if not suit: + if suit is None: # Initial suit containing just the data that is then embedded in # the loadout suit = { From 48c852ec1d586d472dcff283cc89e9820a1e6984 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 25 May 2021 14:45:18 +0100 Subject: [PATCH 03/17] Suits: Code scaffolding for sanitising suit names --- monitor.py | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/monitor.py b/monitor.py index 8caceb97..a0c15881 100644 --- a/monitor.py +++ b/monitor.py @@ -1584,6 +1584,27 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below logger.debug(f'Invalid journal entry:\n{line!r}\n', exc_info=ex) return {'event': None} + def suit_sane_name(self, name: str) -> str: + """ + Given an input suit name return the best 'sane' name we can. + + AS of 4.0.0.102 the Journal events are fine for a Grade 1 suit, but + anything above that has broken SuitName_Localised strings, e.g. + $TacticalSuit_Class1_Name; + + Also, if there isn't a SuitName_Localised value at all we'll use the + plain SuitName which can be, e.g. tacticalsuit_class3 + + If the names were correct we would get 'Dominator Suit' in this instance, + however what we want to return is, e.g. 'Dominator'. As that's both + sufficient for disambiguation and more succinct. + + :param name: Name that could be in any of the forms. + :return: Our sane version of this suit's name. + """ + # TODO: Localisation ? + return name + def suitloadout_store_from_event(self, entry) -> Tuple[int, int]: """ Store Suit and SuitLoadout data from a journal event. @@ -1603,10 +1624,16 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below if suit is None: # Initial suit containing just the data that is then embedded in # the loadout + + # TODO: Attempt to map SuitName_Localised to something sane, if it + # isn't already. + suitname = entry.get('SuitName_Localised', entry['SuitName']) + edmc_suitname = self.suit_sane_name(suitname) suit = { - 'locName': entry.get('SuitName_Localised', entry['SuitName']), - 'suitId': entry['SuitID'], - 'name': entry['SuitName'], + 'edmcName': edmc_suitname, + 'locName': suitname, + 'suitId': entry['SuitID'], + 'name': entry['SuitName'], } suitloadout_slotid = self.suit_loadout_id_from_loadoutid(entry['LoadoutID']) From f85213b3188269793c3256ffd0f7dcb15ab0eade Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 25 May 2021 14:52:43 +0100 Subject: [PATCH 04/17] Suits: Initial stab at grabbing a usable name out of a $symbol; version --- monitor.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/monitor.py b/monitor.py index a0c15881..eca0d5b0 100644 --- a/monitor.py +++ b/monitor.py @@ -1603,6 +1603,13 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below :return: Our sane version of this suit's name. """ # TODO: Localisation ? + # Stage 1: Is it in `$_Class_Name;` form ? + if (m := re.fullmatch(r'^\$([^_]+)_Class([0-9]+)_Name$', name)): + n, c = m.group(1, 2) + name = n + + # Stage 2: Is it in `_class` form ? + # Stage 3: Is it in verbose ` Suit` form ? return name def suitloadout_store_from_event(self, entry) -> Tuple[int, int]: From dba3fba8e3a35f30cc2defd8034d76d3038ead32 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 25 May 2021 15:24:21 +0100 Subject: [PATCH 05/17] Suits: Fully implement mapping to sane (English only for now) names --- EDMarketConnector.py | 4 ++-- edmc_data.py | 15 +++++++++++++++ monitor.py | 12 +++++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index 2f94f660..5e0a0f4c 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -629,7 +629,7 @@ class AppWindow(object): self.suit['text'] = f'<{_("Unknown")}>' return - suitname = suit['locName'] + suitname = suit['edmcName'] if (suitloadout := monitor.state.get('SuitLoadoutCurrent')) is None: self.suit['text'] = '' @@ -927,7 +927,7 @@ class AppWindow(object): if monitor.state.get('SuitCurrent') is not None: if (loadout := data.get('loadout')) is not None: if (suit := loadout.get('suit')) is not None: - if (suitname := suit.get('locName')) is not None: + if (suitname := suit.get('edmcName')) is not None: # We've been paranoid about loadout->suit->suitname, now just assume loadouts is there loadout_name = index_possibly_sparse_list( data['loadouts'], loadout['loadoutSlotId'] diff --git a/edmc_data.py b/edmc_data.py index 7aea749b..11a7db4d 100644 --- a/edmc_data.py +++ b/edmc_data.py @@ -495,3 +495,18 @@ ship_name_map = { 'viper_mkiv': 'Viper MkIV', 'vulture': 'Vulture', } + +# Odyssey Suit Names +edmc_suit_shortnames = { + 'Artemis Suit': 'Artemis', + 'Dominator Suit': 'Dominator', + 'Flight Suit': 'Flight', + 'Maverick Suit': 'Maverick', +} + +edmc_suit_symbol_to_en = { + 'explorationsuit': 'Artemis Suit', + 'flightsuit': 'Flight Suit', + 'tacticalsuit': 'Dominator Suit', + 'utilitysuit': 'Maverick Suit', +} diff --git a/monitor.py b/monitor.py index eca0d5b0..8f6736fd 100644 --- a/monitor.py +++ b/monitor.py @@ -19,6 +19,7 @@ if TYPE_CHECKING: import util_ships from config import config +from edmc_data import edmc_suit_shortnames, edmc_suit_symbol_to_en from EDMCLogging import get_main_logger logger = get_main_logger() @@ -1604,12 +1605,21 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below """ # TODO: Localisation ? # Stage 1: Is it in `$_Class_Name;` form ? - if (m := re.fullmatch(r'^\$([^_]+)_Class([0-9]+)_Name$', name)): + if m := re.fullmatch(r'^\$([^_]+)_Class([0-9]+)_Name;$', name): n, c = m.group(1, 2) name = n # Stage 2: Is it in `_class` form ? + elif m := re.fullmatch(r'^([^_]+)_class([0-9]+)$', name): + n, c = m.group(1, 2) + name = n + + # Now turn either of those into an English ' Suit' form + name = edmc_suit_symbol_to_en.get(name.lower(), name) + # Stage 3: Is it in verbose ` Suit` form ? + name = edmc_suit_shortnames.get(name, name) + return name def suitloadout_store_from_event(self, entry) -> Tuple[int, int]: From 43a7974da590302fc5793f2e92d0d401d066b3c0 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 25 May 2021 16:05:34 +0100 Subject: [PATCH 06/17] Suits: Make suit name regex's case-insensitive (and tweak a comment) --- monitor.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/monitor.py b/monitor.py index 8f6736fd..4aa742b9 100644 --- a/monitor.py +++ b/monitor.py @@ -1605,19 +1605,19 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below """ # TODO: Localisation ? # Stage 1: Is it in `$_Class_Name;` form ? - if m := re.fullmatch(r'^\$([^_]+)_Class([0-9]+)_Name;$', name): + if m := re.fullmatch(r'(?i)^\$([^_]+)_Class([0-9]+)_Name;$', name): n, c = m.group(1, 2) name = n # Stage 2: Is it in `_class` form ? - elif m := re.fullmatch(r'^([^_]+)_class([0-9]+)$', name): + elif m := re.fullmatch(r'(?i)^([^_]+)_class([0-9]+)$', name): n, c = m.group(1, 2) name = n # Now turn either of those into an English ' Suit' form name = edmc_suit_symbol_to_en.get(name.lower(), name) - # Stage 3: Is it in verbose ` Suit` form ? + # Finally, map that to a form without the verbose ' Suit' on the end name = edmc_suit_shortnames.get(name, name) return name From e9e5352e3740fd9ac695f51c4f8a999e7c3c2b85 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 25 May 2021 16:30:23 +0100 Subject: [PATCH 07/17] Suits: Set edmcName in `BuySuit` handling --- monitor.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/monitor.py b/monitor.py index 4aa742b9..3b01ab3e 100644 --- a/monitor.py +++ b/monitor.py @@ -1135,10 +1135,12 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below # alpha4 : # { "timestamp":"2021-04-29T09:03:37Z", "event":"BuySuit", "Name":"UtilitySuit_Class1", # "Name_Localised":"Maverick Suit", "Price":150000, "SuitID":1698364934364699 } + loc_name = entry.get('Name_Localised', entry['Name']) self.state['Suits'][entry['SuitID']] = { 'name': entry['Name'], - 'locName': entry.get('Name_Localised', entry['Name']), - 'id': None, # Is this an FDev ID for suit type ? + 'locName': loc_name, + 'edmcName': self.suit_sane_name(loc_name), + 'id': None, # Is this an FDev ID for suit type ? 'suitId': entry['SuitID'], 'slots': [], } From bac718aeffc75f65eb8dd272ffd6d5afcbd65151 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 25 May 2021 17:56:11 +0100 Subject: [PATCH 08/17] Store `Fileheader` language, gameversion and build in monitor.state --- PLUGINS.md | 3 +++ monitor.py | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/PLUGINS.md b/PLUGINS.md index 1eb2a4a2..cff302ef 100644 --- a/PLUGINS.md +++ b/PLUGINS.md @@ -566,6 +566,9 @@ Content of `state` (updated to the current journal entry): | Field | Type | Description | | :------------- | :-------------------------: | :-------------------------------------------------------------------------------------------------------------- | +| `GameLanguage` | `Optional[str]` | `language` value from `Fileheader` event. | +| `GameVersion` | `Optional[str]` | `version` value from `Fileheader` event. | +| `GameBuild` | `Optional[str]` | `build` value from `Fileheader` event. | | `Captain` | `Optional[str]` | Name of the commander who's crew you're on, if any | | `Cargo` | `dict` | Current cargo. Note that this will be totals, and any mission specific duplicates will be counted together | | `CargoJSON` | `dict` | content of cargo.json as of last read. | diff --git a/monitor.py b/monitor.py index 3b01ab3e..1ae82c05 100644 --- a/monitor.py +++ b/monitor.py @@ -115,6 +115,9 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below # Cmdr state shared with EDSM and plugins # If you change anything here update PLUGINS.md documentation! self.state: Dict = { + 'GameLanguage': None, # From `Fileheader + 'GameVersion': None, # From `Fileheader + 'GameBuild': None, # From `Fileheader 'Captain': None, # On a crew 'Cargo': defaultdict(int), 'Credits': None, @@ -497,13 +500,15 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below self.systemaddress = None self.started = None self.__init_state() + # In self.state as well, as that's what plugins get + self.stat['GameLanguage'] = entry['language'] + self.stat['GameVersion'] = entry['gameversion'] + self.stat['GameBuild'] = entry['build'] elif event_type == 'Commander': self.live = True # First event in 3.0 elif event_type == 'LoadGame': - # alpha4 - # Odyssey: bool self.cmdr = entry['Commander'] # 'Open', 'Solo', 'Group', or None for CQC (and Training - but no LoadGame event) self.mode = entry.get('GameMode') From 20f373a37d2b00ed29cf6456c2823401a55efb21 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 25 May 2021 18:27:10 +0100 Subject: [PATCH 09/17] Suits: Localise out suit symbol name -> display name (stage1) lookup We'll need to localise the following 'shortname' lookup as well. --- edmc_data.py | 14 +++++++++----- monitor.py | 11 ++++++----- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/edmc_data.py b/edmc_data.py index 11a7db4d..009a5057 100644 --- a/edmc_data.py +++ b/edmc_data.py @@ -504,9 +504,13 @@ edmc_suit_shortnames = { 'Maverick Suit': 'Maverick', } -edmc_suit_symbol_to_en = { - 'explorationsuit': 'Artemis Suit', - 'flightsuit': 'Flight Suit', - 'tacticalsuit': 'Dominator Suit', - 'utilitysuit': 'Maverick Suit', +edmc_suit_symbol_localised = { + # The key here should match what's seen in Fileheader 'language', but with + # any in-file `\\` already unescaped to a single `\`. + r'English\UK': { + 'explorationsuit': 'Artemis Suit', + 'flightsuit': 'Flight Suit', + 'tacticalsuit': 'Dominator Suit', + 'utilitysuit': 'Maverick Suit', + }, } diff --git a/monitor.py b/monitor.py index 1ae82c05..06c82b88 100644 --- a/monitor.py +++ b/monitor.py @@ -19,7 +19,7 @@ if TYPE_CHECKING: import util_ships from config import config -from edmc_data import edmc_suit_shortnames, edmc_suit_symbol_to_en +from edmc_data import edmc_suit_shortnames, edmc_suit_symbol_localised from EDMCLogging import get_main_logger logger = get_main_logger() @@ -501,9 +501,9 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below self.started = None self.__init_state() # In self.state as well, as that's what plugins get - self.stat['GameLanguage'] = entry['language'] - self.stat['GameVersion'] = entry['gameversion'] - self.stat['GameBuild'] = entry['build'] + self.state['GameLanguage'] = entry['language'] + self.state['GameVersion'] = entry['gameversion'] + self.state['GameBuild'] = entry['build'] elif event_type == 'Commander': self.live = True # First event in 3.0 @@ -1622,7 +1622,8 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below name = n # Now turn either of those into an English ' Suit' form - name = edmc_suit_symbol_to_en.get(name.lower(), name) + if loc_lookup := edmc_suit_symbol_localised.get(self.state['GameLanguage']): + name = loc_lookup.get(name.lower(), name) # Finally, map that to a form without the verbose ' Suit' on the end name = edmc_suit_shortnames.get(name, name) From 033cfb7577a088da19cc02d63ff804117832c853 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 25 May 2021 19:09:55 +0100 Subject: [PATCH 10/17] Suits: Prepare for Russian localisation of names --- edmc_data.py | 1 + 1 file changed, 1 insertion(+) diff --git a/edmc_data.py b/edmc_data.py index 009a5057..fdaf0d39 100644 --- a/edmc_data.py +++ b/edmc_data.py @@ -513,4 +513,5 @@ edmc_suit_symbol_localised = { 'tacticalsuit': 'Dominator Suit', 'utilitysuit': 'Maverick Suit', }, + # r'Russian\RU': { } From f46618b61ce150aaca3e55ca50cd07360243be83 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Wed, 26 May 2021 14:49:17 +0100 Subject: [PATCH 11/17] Suits: Added German localisations/short forms for names. --- PLUGINS.md | 5 +++++ edmc_data.py | 32 +++++++++++++++++++++++++++----- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/PLUGINS.md b/PLUGINS.md index cff302ef..31a20593 100644 --- a/PLUGINS.md +++ b/PLUGINS.md @@ -655,6 +655,11 @@ this is **NOT** the same as the return from because CAPI data doesn't (didn't always?) have an indication of Horizons or not. +New in version 5.0.3: + +The `Suits` members have an additional key:value pair `edmcName` which is our +preferred name for display on the UI, for the in-use game language. + ##### Synthetic Events A special "StartUp" entry is sent if EDMC is started while the game is already diff --git a/edmc_data.py b/edmc_data.py index fdaf0d39..387048a5 100644 --- a/edmc_data.py +++ b/edmc_data.py @@ -498,20 +498,42 @@ ship_name_map = { # Odyssey Suit Names edmc_suit_shortnames = { - 'Artemis Suit': 'Artemis', - 'Dominator Suit': 'Dominator', - 'Flight Suit': 'Flight', - 'Maverick Suit': 'Maverick', + 'Flight Suit': 'Flight', # EN + 'Flug-Anzug': 'Flug', # DE + 'Artemis Suit': 'Artemis', # EN + 'Artemis-Anzug': 'Artemis', # DE + 'Dominator Suit': 'Dominator', # EN + 'Dominator-Anzug': 'Dominator', # DE + 'Maverick Suit': 'Maverick', # EN + 'Maverick-Anzug': 'Maverick', # DE } edmc_suit_symbol_localised = { # The key here should match what's seen in Fileheader 'language', but with # any in-file `\\` already unescaped to a single `\`. r'English\UK': { - 'explorationsuit': 'Artemis Suit', 'flightsuit': 'Flight Suit', + 'explorationsuit': 'Artemis Suit', 'tacticalsuit': 'Dominator Suit', 'utilitysuit': 'Maverick Suit', }, # r'Russian\RU': { + # { "timestamp":"2021-05-25T19:04:54Z", "event":"SwitchSuitLoadout", "SuitID":1700222635552764, "SuitName":"flightsuit", "SuitName_Localised":"Летный комбинезон", "LoadoutID":4293000000, "LoadoutName":"Снаряжение по умолчанию", "Modules":[ { "SlotName":"SecondaryWeapon", "SuitModuleID":1700222635552854, "ModuleName":"wpn_s_pistol_kinetic_sauto", "ModuleName_Localised":"Karma P-15" } ] } + # { "timestamp":"2021-05-25T19:04:58Z", "event":"SwitchSuitLoadout", "SuitID":1700399023825621, "SuitName":"tacticalsuit_class1", "SuitName_Localised":"Комбинезон Dominator", "LoadoutID":4293000001, "LoadoutName":"Боевой 1", "Modules":[ { "SlotName":"PrimaryWeapon1", "SuitModuleID":1700399051643021, "ModuleName":"wpn_m_sniper_plasma_charged", "ModuleName_Localised":"Manticore Executioner" }, { "SlotName":"PrimaryWeapon2", "SuitModuleID":1700399078090377, "ModuleName":"wpn_m_shotgun_plasma_doublebarrel", "ModuleName_Localised":"Manticore Intimidator" }, { "SlotName":"SecondaryWeapon", "SuitModuleID":1700222635552854, "ModuleName":"wpn_s_pistol_kinetic_sauto", "ModuleName_Localised":"Karma P-15" } ] } + # { "timestamp":"2021-05-25T19:05:02Z", "event":"SwitchSuitLoadout", "SuitID":1700575627706590, "SuitName":"tacticalsuit_class2", "SuitName_Localised":"$TacticalSuit_Class1_Name;", "LoadoutID":4293000002, "LoadoutName":"Снаряжение: 1", "Modules":[ { "SlotName":"PrimaryWeapon1", "SuitModuleID":1700575634697937, "ModuleName":"wpn_m_assaultrifle_plasma_fauto", "ModuleName_Localised":"Manticore Oppressor" }, { "SlotName":"PrimaryWeapon2", "SuitModuleID":1700399051643021, "ModuleName":"wpn_m_sniper_plasma_charged", "ModuleName_Localised":"Manticore Executioner" }, { "SlotName":"SecondaryWeapon", "SuitModuleID":1700222635552854, "ModuleName":"wpn_s_pistol_kinetic_sauto", "ModuleName_Localised":"Karma P-15" } ] } + # { "timestamp":"2021-05-25T19:05:05Z", "event":"SwitchSuitLoadout", "SuitID":1700563770964710, "SuitName":"utilitysuit_class1", "SuitName_Localised":"Комбинезон Maverick", "LoadoutID":4293000003, "LoadoutName":"ывы ", "Modules":[ { "SlotName":"PrimaryWeapon1", "SuitModuleID":1700399078090377, "ModuleName":"wpn_m_shotgun_plasma_doublebarrel", "ModuleName_Localised":"Manticore Intimidator" }, { "SlotName":"SecondaryWeapon", "SuitModuleID":1700222635552854, "ModuleName":"wpn_s_pistol_kinetic_sauto", "ModuleName_Localised":"Karma P-15" } ] } + # { "timestamp":"2021-05-25T19:05:07Z", "event":"SwitchSuitLoadout", "SuitID":1700571499909982, "SuitName":"explorationsuit_class2", "SuitName_Localised":"$ExplorationSuit_Class1_Name;", "LoadoutID":4293000004, "LoadoutName":"Снаряжение: 2", "Modules":[ { "SlotName":"PrimaryWeapon1", "SuitModuleID":1700399061224625, "ModuleName":"wpn_m_submachinegun_kinetic_fauto", "ModuleName_Localised":"Karma C-44" }, { "SlotName":"SecondaryWeapon", "SuitModuleID":1700222635552854, "ModuleName":"wpn_s_pistol_kinetic_sauto", "ModuleName_Localised":"Karma P-15" } ] } + # { "timestamp":"2021-05-25T19:05:18Z", "event":"SuitLoadout", "SuitID":1700571499909982, "SuitName":"explorationsuit_class2", "SuitName_Localised":"$ExplorationSuit_Class1_Name;", "LoadoutID":4293000004, "LoadoutName":"Снаряжение: 2", "Modules":[ { "SlotName":"PrimaryWeapon1", "SuitModuleID":1700399061224625, "ModuleName":"wpn_m_submachinegun_kinetic_fauto", "ModuleName_Localised":"Karma C-44" }, { "SlotName":"SecondaryWeapon", "SuitModuleID":1700222635552854, "ModuleName":"wpn_s_pistol_kinetic_sauto", "ModuleName_Localised":"Karma P-15" } ] } + # { "timestamp":"2021-05-25T19:05:18Z", "event":"BackPack" } + # { "timestamp":"2021-05-25T19:05:19Z", "event":"ReceiveText", "From":"Crown Prospect", "Message":"$STATION_NoFireZone_entered;", "Message_Localised":"Вы вошли в зону запрета огня", "Channel":"npc" } + # { "timestamp":"2021-05-25T19:05:32Z", "event":"BuySuit", "Name":"ExplorationSuit_Class1", "Name_Localised":"Комбинезон Artemis", "Price":150000, "SuitID":1700758324607786 } + # { "timestamp":"2021-05-25T19:05:47Z", "event":"Friends", "Status":"Online", "Name":"Automatic system" } + # { "timestamp":"2021-05-25T19:05:51Z", "event":"CreateSuitLoadout", "SuitID":1700758324607786, "SuitName":"explorationsuit_class1", "SuitName_Localised":"Комбинезон Artemis", "LoadoutID":4293000005, "LoadoutName":"Снаряжение: 3", "Modules":[ ] } + # { "timestamp":"2021-05-25T19:05:53Z", "event":"SwitchSuitLoadout", "SuitID":1700758324607786, "SuitName":"explorationsuit_class1", "SuitName_Localised":"Комбинезон Artemis", "LoadoutID":4293000005, "LoadoutName":"Снаряжение: 3", "Modules":[ ] } + r'German\DE': { + 'flightsuit': 'Flug-Anzug', + 'explorationsuit': 'Artemis-Anzug', + 'tacticalsuit': 'Dominator-Anzug', + 'utilitysuit': 'Maverick-Anzug', + }, } From e93ab9033e3684c571819ede4eaeeec468ec23b3 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Wed, 26 May 2021 14:58:55 +0100 Subject: [PATCH 12/17] Suits: Spanish localisation and short names. The full string for the Flightsuit is 'Traje de vuelo', and we indeed have 'Traje' as the translation for 'Suit', so the UI comes out as 'Traje: de vuelo' for this. --- edmc_data.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/edmc_data.py b/edmc_data.py index 387048a5..d06dd4db 100644 --- a/edmc_data.py +++ b/edmc_data.py @@ -500,12 +500,16 @@ ship_name_map = { edmc_suit_shortnames = { 'Flight Suit': 'Flight', # EN 'Flug-Anzug': 'Flug', # DE + 'Traje de vuelo': 'de vuelo', # ES 'Artemis Suit': 'Artemis', # EN 'Artemis-Anzug': 'Artemis', # DE + 'Traje Artemis': 'Artemis', # ES 'Dominator Suit': 'Dominator', # EN 'Dominator-Anzug': 'Dominator', # DE + 'Traje Dominator': 'Dominator', # ES 'Maverick Suit': 'Maverick', # EN 'Maverick-Anzug': 'Maverick', # DE + 'Traje Maverick': 'Maverick', # ES } edmc_suit_symbol_localised = { @@ -536,4 +540,10 @@ edmc_suit_symbol_localised = { 'tacticalsuit': 'Dominator-Anzug', 'utilitysuit': 'Maverick-Anzug', }, + r'Spanish\ES': { + 'flightsuit': 'Traje de vuelo', + 'explorationsuit': 'Traje Artemis', + 'tacticalsuit': 'Traje Dominator', + 'utilitysuit': 'Traje Maverick', + }, } From 7b613b6124d04dcffc3e1194432e7b978f9ab01d Mon Sep 17 00:00:00 2001 From: Athanasius Date: Wed, 26 May 2021 15:07:28 +0100 Subject: [PATCH 13/17] Suits: Russian name localisation and short names --- edmc_data.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/edmc_data.py b/edmc_data.py index d06dd4db..06652a7d 100644 --- a/edmc_data.py +++ b/edmc_data.py @@ -500,16 +500,20 @@ ship_name_map = { edmc_suit_shortnames = { 'Flight Suit': 'Flight', # EN 'Flug-Anzug': 'Flug', # DE + 'Летный комбинезон': 'Летный', # RU 'Traje de vuelo': 'de vuelo', # ES 'Artemis Suit': 'Artemis', # EN 'Artemis-Anzug': 'Artemis', # DE - 'Traje Artemis': 'Artemis', # ES + 'Traje Artemis': 'Artemis', # ES + 'Комбинезон Artemis': 'Artemis', # RU 'Dominator Suit': 'Dominator', # EN 'Dominator-Anzug': 'Dominator', # DE 'Traje Dominator': 'Dominator', # ES + 'Комбинезон Dominator': 'Dominator', # RU 'Maverick Suit': 'Maverick', # EN 'Maverick-Anzug': 'Maverick', # DE 'Traje Maverick': 'Maverick', # ES + 'Комбинезон Maverick': 'Maverick', # RU } edmc_suit_symbol_localised = { @@ -521,19 +525,12 @@ edmc_suit_symbol_localised = { 'tacticalsuit': 'Dominator Suit', 'utilitysuit': 'Maverick Suit', }, - # r'Russian\RU': { - # { "timestamp":"2021-05-25T19:04:54Z", "event":"SwitchSuitLoadout", "SuitID":1700222635552764, "SuitName":"flightsuit", "SuitName_Localised":"Летный комбинезон", "LoadoutID":4293000000, "LoadoutName":"Снаряжение по умолчанию", "Modules":[ { "SlotName":"SecondaryWeapon", "SuitModuleID":1700222635552854, "ModuleName":"wpn_s_pistol_kinetic_sauto", "ModuleName_Localised":"Karma P-15" } ] } - # { "timestamp":"2021-05-25T19:04:58Z", "event":"SwitchSuitLoadout", "SuitID":1700399023825621, "SuitName":"tacticalsuit_class1", "SuitName_Localised":"Комбинезон Dominator", "LoadoutID":4293000001, "LoadoutName":"Боевой 1", "Modules":[ { "SlotName":"PrimaryWeapon1", "SuitModuleID":1700399051643021, "ModuleName":"wpn_m_sniper_plasma_charged", "ModuleName_Localised":"Manticore Executioner" }, { "SlotName":"PrimaryWeapon2", "SuitModuleID":1700399078090377, "ModuleName":"wpn_m_shotgun_plasma_doublebarrel", "ModuleName_Localised":"Manticore Intimidator" }, { "SlotName":"SecondaryWeapon", "SuitModuleID":1700222635552854, "ModuleName":"wpn_s_pistol_kinetic_sauto", "ModuleName_Localised":"Karma P-15" } ] } - # { "timestamp":"2021-05-25T19:05:02Z", "event":"SwitchSuitLoadout", "SuitID":1700575627706590, "SuitName":"tacticalsuit_class2", "SuitName_Localised":"$TacticalSuit_Class1_Name;", "LoadoutID":4293000002, "LoadoutName":"Снаряжение: 1", "Modules":[ { "SlotName":"PrimaryWeapon1", "SuitModuleID":1700575634697937, "ModuleName":"wpn_m_assaultrifle_plasma_fauto", "ModuleName_Localised":"Manticore Oppressor" }, { "SlotName":"PrimaryWeapon2", "SuitModuleID":1700399051643021, "ModuleName":"wpn_m_sniper_plasma_charged", "ModuleName_Localised":"Manticore Executioner" }, { "SlotName":"SecondaryWeapon", "SuitModuleID":1700222635552854, "ModuleName":"wpn_s_pistol_kinetic_sauto", "ModuleName_Localised":"Karma P-15" } ] } - # { "timestamp":"2021-05-25T19:05:05Z", "event":"SwitchSuitLoadout", "SuitID":1700563770964710, "SuitName":"utilitysuit_class1", "SuitName_Localised":"Комбинезон Maverick", "LoadoutID":4293000003, "LoadoutName":"ывы ", "Modules":[ { "SlotName":"PrimaryWeapon1", "SuitModuleID":1700399078090377, "ModuleName":"wpn_m_shotgun_plasma_doublebarrel", "ModuleName_Localised":"Manticore Intimidator" }, { "SlotName":"SecondaryWeapon", "SuitModuleID":1700222635552854, "ModuleName":"wpn_s_pistol_kinetic_sauto", "ModuleName_Localised":"Karma P-15" } ] } - # { "timestamp":"2021-05-25T19:05:07Z", "event":"SwitchSuitLoadout", "SuitID":1700571499909982, "SuitName":"explorationsuit_class2", "SuitName_Localised":"$ExplorationSuit_Class1_Name;", "LoadoutID":4293000004, "LoadoutName":"Снаряжение: 2", "Modules":[ { "SlotName":"PrimaryWeapon1", "SuitModuleID":1700399061224625, "ModuleName":"wpn_m_submachinegun_kinetic_fauto", "ModuleName_Localised":"Karma C-44" }, { "SlotName":"SecondaryWeapon", "SuitModuleID":1700222635552854, "ModuleName":"wpn_s_pistol_kinetic_sauto", "ModuleName_Localised":"Karma P-15" } ] } - # { "timestamp":"2021-05-25T19:05:18Z", "event":"SuitLoadout", "SuitID":1700571499909982, "SuitName":"explorationsuit_class2", "SuitName_Localised":"$ExplorationSuit_Class1_Name;", "LoadoutID":4293000004, "LoadoutName":"Снаряжение: 2", "Modules":[ { "SlotName":"PrimaryWeapon1", "SuitModuleID":1700399061224625, "ModuleName":"wpn_m_submachinegun_kinetic_fauto", "ModuleName_Localised":"Karma C-44" }, { "SlotName":"SecondaryWeapon", "SuitModuleID":1700222635552854, "ModuleName":"wpn_s_pistol_kinetic_sauto", "ModuleName_Localised":"Karma P-15" } ] } - # { "timestamp":"2021-05-25T19:05:18Z", "event":"BackPack" } - # { "timestamp":"2021-05-25T19:05:19Z", "event":"ReceiveText", "From":"Crown Prospect", "Message":"$STATION_NoFireZone_entered;", "Message_Localised":"Вы вошли в зону запрета огня", "Channel":"npc" } - # { "timestamp":"2021-05-25T19:05:32Z", "event":"BuySuit", "Name":"ExplorationSuit_Class1", "Name_Localised":"Комбинезон Artemis", "Price":150000, "SuitID":1700758324607786 } - # { "timestamp":"2021-05-25T19:05:47Z", "event":"Friends", "Status":"Online", "Name":"Automatic system" } - # { "timestamp":"2021-05-25T19:05:51Z", "event":"CreateSuitLoadout", "SuitID":1700758324607786, "SuitName":"explorationsuit_class1", "SuitName_Localised":"Комбинезон Artemis", "LoadoutID":4293000005, "LoadoutName":"Снаряжение: 3", "Modules":[ ] } - # { "timestamp":"2021-05-25T19:05:53Z", "event":"SwitchSuitLoadout", "SuitID":1700758324607786, "SuitName":"explorationsuit_class1", "SuitName_Localised":"Комбинезон Artemis", "LoadoutID":4293000005, "LoadoutName":"Снаряжение: 3", "Modules":[ ] } + r'Russian\RU': { + 'flightsuit': 'Летный комбинезон', + 'explorationsuit': 'Комбинезон Artemis', + 'tacticalsuit': 'Комбинезон Dominator', + 'utilitysuit': 'Комбинезон Maverick', + }, r'German\DE': { 'flightsuit': 'Flug-Anzug', 'explorationsuit': 'Artemis-Anzug', From a38834c8eb90283bd84aa1505735b7177369d491 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Wed, 26 May 2021 15:15:27 +0100 Subject: [PATCH 14/17] Suits: French name localisations and short names Also re-arranged/re-formatted the shortnames to be grouped by language, rather than suit. --- edmc_data.py | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/edmc_data.py b/edmc_data.py index 06652a7d..29513dda 100644 --- a/edmc_data.py +++ b/edmc_data.py @@ -499,20 +499,28 @@ ship_name_map = { # Odyssey Suit Names edmc_suit_shortnames = { 'Flight Suit': 'Flight', # EN - 'Flug-Anzug': 'Flug', # DE - 'Летный комбинезон': 'Летный', # RU - 'Traje de vuelo': 'de vuelo', # ES 'Artemis Suit': 'Artemis', # EN - 'Artemis-Anzug': 'Artemis', # DE - 'Traje Artemis': 'Artemis', # ES - 'Комбинезон Artemis': 'Artemis', # RU 'Dominator Suit': 'Dominator', # EN - 'Dominator-Anzug': 'Dominator', # DE - 'Traje Dominator': 'Dominator', # ES - 'Комбинезон Dominator': 'Dominator', # RU 'Maverick Suit': 'Maverick', # EN + + 'Flug-Anzug': 'Flug', # DE + 'Artemis-Anzug': 'Artemis', # DE + 'Dominator-Anzug': 'Dominator', # DE 'Maverick-Anzug': 'Maverick', # DE + + 'Traje de vuelo': 'de vuelo', # ES + 'Traje Artemis': 'Artemis', # ES + 'Traje Dominator': 'Dominator', # ES 'Traje Maverick': 'Maverick', # ES + + 'Combinaison de vol': 'de vol', # FR + 'Combinaison Artemis': 'Artemis', # FR + 'Combinaison Dominator': 'Dominator', # FR + 'Combinaison Maverick': 'Maverick', # FR + + 'Летный комбинезон': 'Летный', # RU + 'Комбинезон Artemis': 'Artemis', # RU + 'Комбинезон Dominator': 'Dominator', # RU 'Комбинезон Maverick': 'Maverick', # RU } @@ -525,18 +533,24 @@ edmc_suit_symbol_localised = { 'tacticalsuit': 'Dominator Suit', 'utilitysuit': 'Maverick Suit', }, - r'Russian\RU': { - 'flightsuit': 'Летный комбинезон', - 'explorationsuit': 'Комбинезон Artemis', - 'tacticalsuit': 'Комбинезон Dominator', - 'utilitysuit': 'Комбинезон Maverick', - }, r'German\DE': { 'flightsuit': 'Flug-Anzug', 'explorationsuit': 'Artemis-Anzug', 'tacticalsuit': 'Dominator-Anzug', 'utilitysuit': 'Maverick-Anzug', }, + r'French\FR': { + 'flightsuit': 'Combinaison de vol', + 'explorationsuit': 'Combinaison Artemis', + 'tacticalsuit': 'Combinaison Dominator', + 'utilitysuit': 'Combinaison Maverick', + }, + r'Russian\RU': { + 'flightsuit': 'Летный комбинезон', + 'explorationsuit': 'Комбинезон Artemis', + 'tacticalsuit': 'Комбинезон Dominator', + 'utilitysuit': 'Комбинезон Maverick', + }, r'Spanish\ES': { 'flightsuit': 'Traje de vuelo', 'explorationsuit': 'Traje Artemis', From 04c3b20c99272d82bd444c5a8a1157017a9e511e Mon Sep 17 00:00:00 2001 From: Athanasius Date: Wed, 26 May 2021 15:28:35 +0100 Subject: [PATCH 15/17] Suits: Portugese (Brazil) (short)names localisation Also aligned all of the languages in the shortnames dict. --- edmc_data.py | 51 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/edmc_data.py b/edmc_data.py index 29513dda..1f6036cd 100644 --- a/edmc_data.py +++ b/edmc_data.py @@ -498,30 +498,35 @@ ship_name_map = { # Odyssey Suit Names edmc_suit_shortnames = { - 'Flight Suit': 'Flight', # EN - 'Artemis Suit': 'Artemis', # EN - 'Dominator Suit': 'Dominator', # EN - 'Maverick Suit': 'Maverick', # EN + 'Flight Suit': 'Flight', # EN + 'Artemis Suit': 'Artemis', # EN + 'Dominator Suit': 'Dominator', # EN + 'Maverick Suit': 'Maverick', # EN - 'Flug-Anzug': 'Flug', # DE - 'Artemis-Anzug': 'Artemis', # DE - 'Dominator-Anzug': 'Dominator', # DE - 'Maverick-Anzug': 'Maverick', # DE + 'Flug-Anzug': 'Flug', # DE + 'Artemis-Anzug': 'Artemis', # DE + 'Dominator-Anzug': 'Dominator', # DE + 'Maverick-Anzug': 'Maverick', # DE - 'Traje de vuelo': 'de vuelo', # ES - 'Traje Artemis': 'Artemis', # ES - 'Traje Dominator': 'Dominator', # ES - 'Traje Maverick': 'Maverick', # ES + 'Traje de vuelo': 'de vuelo', # ES + 'Traje Artemis': 'Artemis', # ES + 'Traje Dominator': 'Dominator', # ES + 'Traje Maverick': 'Maverick', # ES - 'Combinaison de vol': 'de vol', # FR - 'Combinaison Artemis': 'Artemis', # FR - 'Combinaison Dominator': 'Dominator', # FR - 'Combinaison Maverick': 'Maverick', # FR + 'Combinaison de vol': 'de vol', # FR + 'Combinaison Artemis': 'Artemis', # FR + 'Combinaison Dominator': 'Dominator', # FR + 'Combinaison Maverick': 'Maverick', # FR - 'Летный комбинезон': 'Летный', # RU - 'Комбинезон Artemis': 'Artemis', # RU - 'Комбинезон Dominator': 'Dominator', # RU - 'Комбинезон Maverick': 'Maverick', # RU + 'Traje voador': 'voador', # PT-BR + 'Traje Artemis': 'Artemis', # PT-BR + 'Traje Dominator': 'Dominator', # PT-BR + 'Traje Maverick': 'Maverick', # PT-BR + + 'Летный комбинезон': 'Летный', # RU + 'Комбинезон Artemis': 'Artemis', # RU + 'Комбинезон Dominator': 'Dominator', # RU + 'Комбинезон Maverick': 'Maverick', # RU } edmc_suit_symbol_localised = { @@ -545,6 +550,12 @@ edmc_suit_symbol_localised = { 'tacticalsuit': 'Combinaison Dominator', 'utilitysuit': 'Combinaison Maverick', }, + r'Portuguese\BR': { + 'flightsuit': 'Traje voador', + 'explorationsuit': 'Traje Artemis', + 'tacticalsuit': 'Traje Dominator', + 'utilitysuit': 'Traje Maverick', + }, r'Russian\RU': { 'flightsuit': 'Летный комбинезон', 'explorationsuit': 'Комбинезон Artemis', From 4d5d9ae645954166e8d3649381a37547a3729f95 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Thu, 27 May 2021 09:21:13 +0100 Subject: [PATCH 16/17] config: appversion: Use `+DIRTY` to ensure SemVer compliance. It's also more succinct. We know what it means. --- config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.py b/config.py index fb644a73..d958aad8 100644 --- a/config.py +++ b/config.py @@ -96,7 +96,7 @@ def git_shorthash_from_head() -> str: """ Determine short hash for current git HEAD. - Includes -DIRTY if any changes have been made from HEAD + Includes +DIRTY if any changes have been made from HEAD :return: str - None if we couldn't determine the short hash. """ @@ -122,7 +122,7 @@ def git_shorthash_from_head() -> str: with contextlib.suppress(Exception): result = subprocess.run('git diff --stat HEAD'.split(), capture_output=True) if len(result.stdout) > 0: - shorthash += '-WORKING-DIR-IS-DIRTY' + shorthash += '+DIRTY' if len(result.stderr) > 0: logger.warning(f'Data from git on stderr:\n{str(result.stderr)}') From e9973d239a8a2e5b739e0af5b24c47ac58d9c2fc Mon Sep 17 00:00:00 2001 From: Athanasius Date: Thu, 27 May 2021 11:09:52 +0100 Subject: [PATCH 17/17] Suits: Comment out 'duplicate' PT-BR shortnames They're the same key, and value, as the ES ones. PyCharm highlighted this, flake8 did not complain. There's a comment as to why they're commented out, but still present in that form. --- edmc_data.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/edmc_data.py b/edmc_data.py index 1f6036cd..45f424fc 100644 --- a/edmc_data.py +++ b/edmc_data.py @@ -519,9 +519,10 @@ edmc_suit_shortnames = { 'Combinaison Maverick': 'Maverick', # FR 'Traje voador': 'voador', # PT-BR - 'Traje Artemis': 'Artemis', # PT-BR - 'Traje Dominator': 'Dominator', # PT-BR - 'Traje Maverick': 'Maverick', # PT-BR + # These are duplicates of the ES ones, but kept here for clarity + # 'Traje Artemis': 'Artemis', # PT-BR + # 'Traje Dominator': 'Dominator', # PT-BR + # 'Traje Maverick': 'Maverick', # PT-BR 'Летный комбинезон': 'Летный', # RU 'Комбинезон Artemis': 'Artemis', # RU