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
This commit is contained in:
LemonNexus 2026-02-09 19:01:23 +00:00
parent 4375a00f0f
commit 297552fd1c
1 changed files with 57 additions and 10 deletions

View File

@ -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