From 297552fd1c8c83858e49bf270db8bf30e6c09f18 Mon Sep 17 00:00:00 2001 From: LemonNexus Date: Mon, 9 Feb 2026 19:01:23 +0000 Subject: [PATCH] fix(ui): improve armor set piece slot detection - Added name-based slot detection as fallback when Type field doesn't match - Added more slot mapping variations (chest, armguards, thighguards, etc.) - Added _get_slot_from_name() helper for name-based detection - Now correctly equips all 7 pieces of armor sets like Frontier Adjusted --- ui/loadout_manager.py | 67 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 10 deletions(-) diff --git a/ui/loadout_manager.py b/ui/loadout_manager.py index e136cc4..b188738 100644 --- a/ui/loadout_manager.py +++ b/ui/loadout_manager.py @@ -1610,7 +1610,7 @@ class LoadoutManagerDialog(QDialog): """Handle full armor set selection from API.""" from core.nexus_full_api import get_nexus_api - # Get all armors to find matching pieces + # Get all armors to find matching pieces with full data api = get_nexus_api() all_armors = api.get_all_armors() @@ -1619,16 +1619,21 @@ class LoadoutManagerDialog(QDialog): 'head': self.slot_widgets[ArmorSlot.HEAD], 'torso': self.slot_widgets[ArmorSlot.TORSO], 'harness': self.slot_widgets[ArmorSlot.TORSO], + 'chest': self.slot_widgets[ArmorSlot.TORSO], 'arms': self.slot_widgets[ArmorSlot.ARMS], 'arm guards': self.slot_widgets[ArmorSlot.ARMS], + 'armguards': self.slot_widgets[ArmorSlot.ARMS], 'hands': self.slot_widgets[ArmorSlot.HANDS], 'gloves': self.slot_widgets[ArmorSlot.HANDS], 'legs': self.slot_widgets[ArmorSlot.LEGS], 'thigh guards': self.slot_widgets[ArmorSlot.LEGS], + 'thighguards': self.slot_widgets[ArmorSlot.LEGS], 'shins': self.slot_widgets[ArmorSlot.SHINS], 'shin guards': self.slot_widgets[ArmorSlot.SHINS], + 'shinguards': self.slot_widgets[ArmorSlot.SHINS], 'feet': self.slot_widgets[ArmorSlot.FEET], 'foot guards': self.slot_widgets[ArmorSlot.FEET], + 'footguards': self.slot_widgets[ArmorSlot.FEET], } pieces_found = 0 @@ -1644,15 +1649,37 @@ class LoadoutManagerDialog(QDialog): break if matching_armor: - # Determine slot from armor type + # Get slot from the armor's Type field or parse from name armor_type = matching_armor.type.lower() slot_widget = None - # Find matching slot - for type_key, widget in slot_mapping.items(): - if type_key in armor_type: - slot_widget = widget - break + # First try direct Type match + if armor_type in slot_mapping: + slot_widget = slot_mapping[armor_type] + else: + # Try parsing from armor type + for type_key, widget in slot_mapping.items(): + if type_key in armor_type: + slot_widget = widget + break + + # If still no match, try parsing from name + if not slot_widget: + name_lower = piece_name.lower() + if 'helmet' in name_lower or 'cap' in name_lower: + slot_widget = self.slot_widgets[ArmorSlot.HEAD] + elif 'harness' in name_lower or 'chest' in name_lower or 'torso' in name_lower: + slot_widget = self.slot_widgets[ArmorSlot.TORSO] + elif 'arm' in name_lower or 'shoulder' in name_lower: + slot_widget = self.slot_widgets[ArmorSlot.ARMS] + elif 'glove' in name_lower or 'hand' in name_lower: + slot_widget = self.slot_widgets[ArmorSlot.HANDS] + elif 'thigh' in name_lower or ('leg' in name_lower and 'shin' not in name_lower): + slot_widget = self.slot_widgets[ArmorSlot.LEGS] + elif 'shin' in name_lower: + slot_widget = self.slot_widgets[ArmorSlot.SHINS] + elif 'foot' in name_lower or 'boot' in name_lower: + slot_widget = self.slot_widgets[ArmorSlot.FEET] if slot_widget: # Create ArmorPiece from NexusArmor @@ -1660,7 +1687,7 @@ class LoadoutManagerDialog(QDialog): piece = ArmorPiece( item_id=matching_armor.item_id, name=matching_armor.name, - slot=self._get_slot_from_type(armor_type), + slot=self._get_slot_from_type(armor_type) if armor_type in slot_mapping else self._get_slot_from_name(piece_name), protection=ProtectionProfile( impact=matching_armor.protection_impact, cut=matching_armor.protection_cut, @@ -1676,7 +1703,7 @@ class LoadoutManagerDialog(QDialog): slot_widget.set_piece(piece) pieces_found += 1 else: - pieces_not_found.append(f"{piece_name} (unknown slot)") + pieces_not_found.append(f"{piece_name} (unknown slot: {armor_type})") else: pieces_not_found.append(piece_name) @@ -1698,7 +1725,7 @@ class LoadoutManagerDialog(QDialog): armor_type = armor_type.lower() if 'head' in armor_type or 'helmet' in armor_type: return ArmorSlot.HEAD - elif 'torso' in armor_type or 'harness' in armor_type: + elif 'torso' in armor_type or 'harness' in armor_type or 'chest' in armor_type: return ArmorSlot.TORSO elif 'arm' in armor_type: return ArmorSlot.ARMS @@ -1713,6 +1740,26 @@ class LoadoutManagerDialog(QDialog): else: return ArmorSlot.TORSO # Default + def _get_slot_from_name(self, piece_name: str) -> 'ArmorSlot': + """Map armor piece name to ArmorSlot enum.""" + name_lower = piece_name.lower() + if 'helmet' in name_lower or 'cap' in name_lower: + return ArmorSlot.HEAD + elif 'harness' in name_lower or 'chest' in name_lower or 'torso' in name_lower: + return ArmorSlot.TORSO + elif 'arm' in name_lower or 'shoulder' in name_lower: + return ArmorSlot.ARMS + elif 'glove' in name_lower or 'hand' in name_lower: + return ArmorSlot.HANDS + elif 'thigh' in name_lower or ('leg' in name_lower and 'shin' not in name_lower): + return ArmorSlot.LEGS + elif 'shin' in name_lower: + return ArmorSlot.SHINS + elif 'foot' in name_lower or 'boot' in name_lower: + return ArmorSlot.FEET + else: + return ArmorSlot.TORSO # Default + def _on_select_healing_from_api(self): """Open healing tool selector dialog from Nexus API.""" from ui.healing_selector import HealingSelectorDialog