aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-05-28 07:12:43 -0700
committerFuwn <[email protected]>2025-05-28 07:12:43 -0700
commit035008f3ee1bf5ee84a0cd290d37f222a1cd5e61 (patch)
tree950ffad958908892a40ed9cb69c0db6a23e59a3a
downloadgenshin-artifact-playground-035008f3ee1bf5ee84a0cd290d37f222a1cd5e61.tar.xz
genshin-artifact-playground-035008f3ee1bf5ee84a0cd290d37f222a1cd5e61.zip
feat: Initial commitHEADmain
-rw-r--r--.gitignore2
-rw-r--r--README.md222
-rw-r--r--artifact_analysis.py249
-rw-r--r--artifact_optimizer.py441
-rw-r--r--characters.json65
-rw-r--r--data.json1
-rw-r--r--demo_optimizer.py165
-rw-r--r--demo_results.json6308
-rw-r--r--interactive_optimizer.py340
-rw-r--r--optimization_results.txt209
10 files changed, 8002 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..19a8efe
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+venv
+.ropeproject
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..595923b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,222 @@
+# Genshin Impact Artifact Optimizer
+
+An automated artifact optimization system based on the scoring methodology by Sevy. This tool helps you find the best artifact builds for multiple characters by intelligently distributing your artifact inventory based on priority order.
+
+## šŸŽÆ Features
+
+- **Character Priority System**: Assign artifacts to characters in your specified priority order
+- **Intelligent Scoring**: Uses the proven scoring system that accounts for all relevant substats
+- **Energy Recharge Compliance**: Automatically checks if builds meet ER requirements
+- **Flexible Main Stats**: Supports character-specific ideal main stat preferences
+- **4-Star Fallback**: Uses 4-star artifacts when suitable 5-star pieces aren't available
+- **Interactive Interface**: Easy-to-use command-line interface for character selection
+- **Detailed Reporting**: Comprehensive build analysis with scores and recommendations
+
+## šŸ“Š Scoring Methodology
+
+Based on the artifact scoring system that converts substat rolls into a 0-100 score:
+
+### Special Numbers (Stat Weights)
+- **CRIT Rate**: 3.0
+- **CRIT DMG**: 6.0
+- **ATK%**: 5.0
+- **HP%**: 5.0
+- **DEF%**: 6.0
+- **Energy Recharge**: 5.5
+- **Elemental Mastery**: 20.0
+- **Flat ATK**: 45.0
+- **Flat HP**: 700.0
+- **Flat DEF**: 50.0
+
+### Score Calculation
+For each artifact:
+1. Divide each relevant substat value by its special number
+2. Sum all the values (represents substat roll count)
+3. Divide by 9 (max possible rolls) and multiply by 100
+
+### Quality Tiers
+- **44+ Good**: Can clear Abyss with difficulty
+- **55+ Great**: Comfortable Abyss clearing
+- **66+ Amazing**: Well-built character, strong performance
+- **77+ Insane**: Excellent builds, Abyss feels easy
+- **88+ God-like**: Exceptional builds, lottery-winner luck
+- **99+ Exodia**: Theoretical perfection
+
+## šŸš€ Quick Start
+
+### Prerequisites
+- Python 3.6+
+- Genshin Impact artifact data (JSON format)
+
+### Basic Usage
+
+1. **Automated Mode** (uses predefined character priority):
+```bash
+python artifact_optimizer.py
+```
+
+2. **Interactive Mode** (select your own characters):
+```bash
+python interactive_optimizer.py
+```
+
+### Data Files Required
+
+**data.json** - Your artifact inventory in the format:
+```json
+{
+ "format": "GOOD",
+ "version": 2,
+ "artifacts": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {"key": "critRate_", "value": 10.1},
+ {"key": "critDMG_", "value": 14.0},
+ {"key": "hp_", "value": 16.9},
+ {"key": "enerRech_", "value": 11.7}
+ ],
+ "id": 1
+ }
+ ]
+}
+```
+
+**characters.json** - Character build requirements:
+```json
+{
+ "Furina": {
+ "er_requirement": {"min": 180, "max": 200},
+ "ideal_main_stats": {
+ "sands": ["HP%", "ER%"],
+ "goblet": ["HP%", "Hydro DMG Bonus"],
+ "circlet": ["CRIT Rate", "CRIT DMG"]
+ },
+ "substat_priority": ["ER%", "CRIT Rate", "CRIT DMG", "HP%", "Flat HP"]
+ }
+}
+```
+
+## šŸŽ® Interactive Mode Features
+
+### Character Selection
+- View all available characters
+- Add characters to priority list in any order
+- Remove characters from priority list
+- View detailed character requirements
+
+### Character Information Display
+- Energy Recharge requirements
+- Ideal main stats for each artifact slot
+- Substat priority ranking
+- Special notes and considerations
+
+### Optimization Settings
+- Enable/disable 4-star fallback artifacts
+- Adjust ER requirement flexibility
+- Customize scoring parameters
+
+## šŸ“‹ Example Output
+
+```
+==================== FURINA ====================
+šŸ“Š Average Artifact Score: 59.46/100
+āœ… Energy Recharge: 180.3% (180-200%)
+
+šŸ“‹ ARTIFACT BUILD:
+
+Flower (GoldenTroupe) - Level 16 ⭐⭐⭐⭐⭐
+ Main Stat: hp
+ Score: 87.12/100
+ Substats:
+ • critDMG_: 14.0%
+ • hp_: 16.9%
+ • enerRech_: 11.7%
+ • critRate_: 6.2%
+```
+
+## šŸ”§ How It Works
+
+### Priority-Based Assignment
+1. Characters are processed in your specified priority order
+2. For each character, the system finds the best possible 5-piece build
+3. Once artifacts are assigned, they're removed from the pool
+4. Later characters get the best remaining artifacts
+
+### Smart Main Stat Filtering
+- Only considers artifacts with suitable main stats for each character
+- Falls back to 4-star artifacts if no suitable 5-star pieces exist
+- Respects character-specific requirements (e.g., Chiori needs DEF%)
+
+### Energy Recharge Validation
+- Calculates total ER from main stats and substats
+- Supports complex ER requirements (multiple scenarios)
+- Provides flexibility buffer for realistic builds
+
+### Build Quality Assessment
+- Scores each individual artifact for the specific character
+- Averages scores across all 5 pieces
+- Adjusts scores based on ER requirement compliance
+
+## šŸ“ File Structure
+
+```
+test/
+ā”œā”€ā”€ artifact_optimizer.py # Core optimization engine
+ā”œā”€ā”€ interactive_optimizer.py # Interactive user interface
+ā”œā”€ā”€ data.json # Your artifact inventory
+ā”œā”€ā”€ characters.json # Character requirements
+ā”œā”€ā”€ README.md # This file
+└── optimization_results.txt # Generated results
+```
+
+## šŸŽÆ Supported Characters
+
+Currently includes optimized builds for:
+- **Furina**: HP/Hydro DPS hybrid
+- **Escoffier**: Cryo DPS
+- **Fischl**: Electro off-field DPS
+- **Chiori**: Geo DEF-scaling DPS
+
+Add more characters by extending the `characters.json` file.
+
+## šŸ’” Tips for Best Results
+
+1. **Prioritize wisely**: Put your most important characters first
+2. **Include ER requirements**: Builds that can't rotate are useless
+3. **Don't over-optimize**: 66+ scores are excellent for most content
+4. **Consider set bonuses**: The optimizer focuses on substats, manually verify set effects
+5. **Level your artifacts**: Higher level = better main stats = higher scores
+
+## šŸ”® Future Enhancements
+
+- Set bonus consideration in scoring
+- Weapon-specific optimizations
+- Team composition analysis
+- GUI interface
+- Database integration
+- Cloud save support
+
+## šŸ“– Credits
+
+- Scoring methodology inspired by Sevy's artifact rating system
+- Built for the Genshin Impact theorycrafting community
+- Special thanks to all TCers who contribute to character guides
+
+## šŸ› Troubleshooting
+
+**"No suitable build found"**: Character needs specific main stats not available in your inventory
+
+**Low scores across all builds**: Your artifact quality may need improvement through farming
+
+**ER requirements not met**: Consider ER% sands or prioritize ER substats
+
+**Missing character data**: Add character requirements to `characters.json`
+
+---
+
+*Happy artifact farming, Traveler! May your rolls be blessed by RNGesus.* šŸŽ²āœØ \ No newline at end of file
diff --git a/artifact_analysis.py b/artifact_analysis.py
new file mode 100644
index 0000000..dab4693
--- /dev/null
+++ b/artifact_analysis.py
@@ -0,0 +1,249 @@
+import json
+from collections import defaultdict, Counter
+from typing import Dict, List
+
+class ArtifactAnalyzer:
+ def __init__(self):
+ self.artifacts = []
+ self.characters = {}
+
+ def load_data(self):
+ """Load artifact and character data"""
+ with open('data.json', 'r') as f:
+ data = json.load(f)
+ self.artifacts = data['artifacts']
+
+ with open('characters.json', 'r') as f:
+ self.characters = json.load(f)
+
+ def analyze_artifact_distribution(self):
+ """Analyze artifact set and slot distribution"""
+ print("="*60)
+ print("šŸ“¦ ARTIFACT INVENTORY ANALYSIS")
+ print("="*60)
+
+ # Basic counts
+ total_artifacts = len(self.artifacts)
+ five_star_count = sum(1 for art in self.artifacts if art['rarity'] == 5)
+ four_star_count = sum(1 for art in self.artifacts if art['rarity'] == 4)
+
+ print(f"Total Artifacts: {total_artifacts}")
+ print(f"5⭐ Artifacts: {five_star_count} ({five_star_count/total_artifacts*100:.1f}%)")
+ print(f"4⭐ Artifacts: {four_star_count} ({four_star_count/total_artifacts*100:.1f}%)")
+
+ # Set distribution
+ set_counts = Counter(art['setKey'] for art in self.artifacts)
+ print(f"\nšŸŽ­ Artifact Sets ({len(set_counts)} unique sets):")
+ for set_name, count in set_counts.most_common():
+ print(f" {set_name}: {count} pieces")
+
+ # Slot distribution
+ slot_counts = Counter(art['slotKey'] for art in self.artifacts)
+ print(f"\nšŸŽÆ Slot Distribution:")
+ slot_names = {'flower': 'Flower', 'plume': 'Feather', 'sands': 'Sands',
+ 'goblet': 'Goblet', 'circlet': 'Circlet'}
+ for slot, count in slot_counts.items():
+ print(f" {slot_names.get(slot, slot)}: {count} pieces")
+
+ def analyze_main_stats(self):
+ """Analyze main stat distribution by slot"""
+ print(f"\nšŸ“Š MAIN STAT ANALYSIS")
+ print("="*60)
+
+ # Group by slot
+ slot_main_stats = defaultdict(Counter)
+ for art in self.artifacts:
+ slot_main_stats[art['slotKey']][art['mainStatKey']] += 1
+
+ slot_names = {'flower': 'Flower', 'plume': 'Feather', 'sands': 'Sands',
+ 'goblet': 'Goblet', 'circlet': 'Circlet'}
+
+ for slot, main_stats in slot_main_stats.items():
+ print(f"\n{slot_names.get(slot, slot)}:")
+ total_slot = sum(main_stats.values())
+ for main_stat, count in main_stats.most_common():
+ percentage = count / total_slot * 100
+ print(f" {main_stat}: {count} ({percentage:.1f}%)")
+
+ def analyze_levels_and_quality(self):
+ """Analyze artifact levels and upgrade status"""
+ print(f"\nšŸ“ˆ ARTIFACT QUALITY ANALYSIS")
+ print("="*60)
+
+ # Level distribution
+ level_counts = Counter(art['level'] for art in self.artifacts)
+ print(f"Level Distribution:")
+ for level in sorted(level_counts.keys(), reverse=True):
+ count = level_counts[level]
+ percentage = count / len(self.artifacts) * 100
+ print(f" Level {level}: {count} ({percentage:.1f}%)")
+
+ # Maxed artifacts
+ maxed_5star = sum(1 for art in self.artifacts if art['level'] == 20 and art['rarity'] == 5)
+ maxed_4star = sum(1 for art in self.artifacts if art['level'] >= 16 and art['rarity'] == 4)
+
+ print(f"\nMaxed Artifacts:")
+ print(f" 5⭐ Level 20: {maxed_5star}")
+ print(f" 4⭐ Level 16+: {maxed_4star}")
+
+ # Average level by rarity
+ five_star_levels = [art['level'] for art in self.artifacts if art['rarity'] == 5]
+ four_star_levels = [art['level'] for art in self.artifacts if art['rarity'] == 4]
+
+ if five_star_levels:
+ avg_5star = sum(five_star_levels) / len(five_star_levels)
+ print(f"\nAverage Levels:")
+ print(f" 5⭐ Average: {avg_5star:.1f}")
+
+ if four_star_levels:
+ avg_4star = sum(four_star_levels) / len(four_star_levels)
+ print(f" 4⭐ Average: {avg_4star:.1f}")
+
+ def analyze_character_assignments(self):
+ """Analyze which characters have artifacts assigned"""
+ print(f"\nšŸ‘„ CHARACTER ASSIGNMENT ANALYSIS")
+ print("="*60)
+
+ # Count assignments
+ assignments = Counter()
+ unassigned_count = 0
+
+ for art in self.artifacts:
+ location = art.get('location', '')
+ if location and location.strip():
+ assignments[location] += 1
+ else:
+ unassigned_count += 1
+
+ print(f"Assigned Artifacts: {sum(assignments.values())}")
+ print(f"Unassigned Artifacts: {unassigned_count}")
+ print(f"Assignment Rate: {sum(assignments.values())/len(self.artifacts)*100:.1f}%")
+
+ if assignments:
+ print(f"\nCharacter Assignments:")
+ for char, count in assignments.most_common():
+ print(f" {char}: {count} pieces")
+
+ # Show set composition for each character
+ char_artifacts = [art for art in self.artifacts if art.get('location') == char]
+ char_sets = Counter(art['setKey'] for art in char_artifacts)
+ set_summary = ", ".join(f"{set_name}({count})" for set_name, count in char_sets.items())
+ print(f" Sets: {set_summary}")
+
+ def analyze_substats(self):
+ """Analyze substat distribution and quality"""
+ print(f"\n⚔ SUBSTAT ANALYSIS")
+ print("="*60)
+
+ # Count substat occurrences
+ substat_counts = Counter()
+ substat_values = defaultdict(list)
+
+ for art in self.artifacts:
+ for substat in art.get('substats', []):
+ key = substat['key']
+ value = substat['value']
+ substat_counts[key] += 1
+ substat_values[key].append(value)
+
+ print(f"Substat Frequency (across all artifacts):")
+ for stat, count in substat_counts.most_common():
+ avg_value = sum(substat_values[stat]) / len(substat_values[stat])
+ max_value = max(substat_values[stat])
+ print(f" {stat}: {count} rolls (avg: {avg_value:.1f}, max: {max_value:.1f})")
+
+ # High-value substats
+ print(f"\nHigh-Value Substat Instances:")
+ high_value_thresholds = {
+ 'critRate_': 10.0,
+ 'critDMG_': 20.0,
+ 'atk_': 15.0,
+ 'hp_': 15.0,
+ 'def_': 18.0,
+ 'enerRech_': 20.0,
+ 'eleMas': 60.0
+ }
+
+ for art in self.artifacts:
+ high_value_substats = []
+ for substat in art.get('substats', []):
+ key = substat['key']
+ value = substat['value']
+ threshold = high_value_thresholds.get(key, float('inf'))
+ if value >= threshold:
+ high_value_substats.append(f"{key}:{value}")
+
+ if high_value_substats:
+ set_name = art['setKey']
+ slot = art['slotKey']
+ level = art['level']
+ print(f" {set_name} {slot} L{level}: {', '.join(high_value_substats)}")
+
+ def analyze_optimization_potential(self):
+ """Analyze potential for optimization"""
+ print(f"\nšŸŽÆ OPTIMIZATION POTENTIAL")
+ print("="*60)
+
+ # Unassigned high-level artifacts
+ unassigned_maxed = [art for art in self.artifacts
+ if not art.get('location', '').strip()
+ and ((art['rarity'] == 5 and art['level'] == 20) or
+ (art['rarity'] == 4 and art['level'] >= 16))]
+
+ print(f"Unassigned High-Level Artifacts: {len(unassigned_maxed)}")
+
+ if unassigned_maxed:
+ print("Available for optimization:")
+ slot_counts = Counter(art['slotKey'] for art in unassigned_maxed)
+ for slot, count in slot_counts.items():
+ print(f" {slot}: {count} pieces")
+
+ # Character coverage
+ known_chars = set(self.characters.keys())
+ assigned_chars = set(art.get('location', '') for art in self.artifacts
+ if art.get('location', '').strip())
+
+ print(f"\nCharacter Coverage:")
+ print(f" Known characters: {len(known_chars)}")
+ print(f" Characters with artifacts: {len(assigned_chars)}")
+
+ unoptimized_chars = known_chars - assigned_chars
+ if unoptimized_chars:
+ print(f" Unoptimized characters: {', '.join(unoptimized_chars)}")
+
+ # Set bonus potential
+ print(f"\nSet Bonus Analysis:")
+ for set_name, count in Counter(art['setKey'] for art in self.artifacts).items():
+ if count >= 4:
+ bonus_type = "4-piece" if count >= 4 else "2-piece"
+ print(f" {set_name}: {count} pieces (can form {bonus_type} set)")
+
+ def run_full_analysis(self):
+ """Run complete artifact analysis"""
+ print("šŸ” GENSHIN IMPACT ARTIFACT ANALYSIS")
+ print("="*80)
+
+ self.load_data()
+
+ self.analyze_artifact_distribution()
+ self.analyze_main_stats()
+ self.analyze_levels_and_quality()
+ self.analyze_character_assignments()
+ self.analyze_substats()
+ self.analyze_optimization_potential()
+
+ print(f"\n{'='*80}")
+ print("šŸ“‹ ANALYSIS COMPLETE")
+ print("="*80)
+ print("Use this information to:")
+ print("• Identify which artifacts need upgrading")
+ print("• Find optimization opportunities")
+ print("• Plan future artifact farming")
+ print("• Optimize character builds")
+
+def main():
+ analyzer = ArtifactAnalyzer()
+ analyzer.run_full_analysis()
+
+if __name__ == "__main__":
+ main() \ No newline at end of file
diff --git a/artifact_optimizer.py b/artifact_optimizer.py
new file mode 100644
index 0000000..fddf25f
--- /dev/null
+++ b/artifact_optimizer.py
@@ -0,0 +1,441 @@
+import json
+import copy
+from typing import Dict, List, Tuple, Optional
+
+class ArtifactOptimizer:
+ def __init__(self):
+ # Special numbers for scoring (from the post)
+ self.stat_weights = {
+ 'hp_': 5.0, # HP%
+ 'hp': 700.0, # Flat HP
+ 'atk_': 5.0, # ATK%
+ 'atk': 45.0, # Flat ATK
+ 'def_': 6.0, # DEF%
+ 'def': 50.0, # Flat DEF
+ 'eleMas': 20.0, # Elemental Mastery
+ 'enerRech_': 5.5, # Energy Recharge%
+ 'critRate_': 3.0, # CRIT Rate%
+ 'critDMG_': 6.0 # CRIT DMG%
+ }
+
+ # Slot mappings
+ self.slot_names = {
+ 'flower': 'Flower',
+ 'plume': 'Feather',
+ 'sands': 'Sands',
+ 'goblet': 'Goblet',
+ 'circlet': 'Circlet'
+ }
+
+ def load_data(self, artifacts_file: str, characters_file: str):
+ """Load artifact and character data from JSON files"""
+ with open(artifacts_file, 'r') as f:
+ self.artifact_data = json.load(f)
+
+ with open(characters_file, 'r') as f:
+ self.character_data = json.load(f)
+
+ self.artifacts = self.artifact_data['artifacts']
+
+ def get_character_relevant_stats(self, character: str) -> List[str]:
+ """Get the stats that are relevant for a character based on their substat priority"""
+ char_data = self.character_data.get(character, {})
+ substat_priority = char_data.get('substat_priority', [])
+
+ # Convert display names to internal stat keys
+ stat_mapping = {
+ 'ER%': 'enerRech_',
+ 'CRIT Rate': 'critRate_',
+ 'CRIT DMG': 'critDMG_',
+ 'HP%': 'hp_',
+ 'Flat HP': 'hp',
+ 'ATK%': 'atk_',
+ 'Flat ATK': 'atk',
+ 'DEF%': 'def_',
+ 'Flat DEF': 'def',
+ 'Elemental Mastery': 'eleMas'
+ }
+
+ relevant_stats = []
+ for stat in substat_priority:
+ if stat in stat_mapping:
+ relevant_stats.append(stat_mapping[stat])
+
+ return relevant_stats
+
+ def calculate_artifact_score(self, artifact: Dict, character: str) -> float:
+ """Calculate artifact score for a specific character"""
+ relevant_stats = self.get_character_relevant_stats(character)
+
+ total_value = 0.0
+
+ # Score substats
+ for substat in artifact.get('substats', []):
+ stat_key = substat['key']
+ stat_value = substat['value']
+
+ if stat_key in relevant_stats and stat_key in self.stat_weights:
+ total_value += stat_value / self.stat_weights[stat_key]
+
+ # Convert to percentage score (max 9 substat rolls possible)
+ score = (total_value / 9.0) * 100.0
+ return score
+
+ def is_set_suitable(self, artifact: Dict, character: str) -> bool:
+ """Check if artifact's set is suitable for the character"""
+ char_data = self.character_data.get(character, {})
+ required_sets = char_data.get('required_sets', [])
+
+ # If no required sets specified, accept any set
+ if not required_sets:
+ return True
+
+ return artifact['setKey'] in required_sets
+
+ def is_main_stat_suitable(self, artifact: Dict, character: str) -> bool:
+ """Check if artifact's main stat is suitable for the character"""
+ char_data = self.character_data.get(character, {})
+ ideal_main_stats = char_data.get('ideal_main_stats', {})
+
+ slot = artifact['slotKey']
+ main_stat = artifact['mainStatKey']
+
+ # Convert internal stat keys to display names for comparison
+ stat_display_mapping = {
+ 'hp': 'HP',
+ 'atk': 'ATK',
+ 'hp_': 'HP%',
+ 'atk_': 'ATK%',
+ 'def_': 'DEF%',
+ 'enerRech_': 'ER%',
+ 'eleMas': 'Elemental Mastery',
+ 'critRate_': 'CRIT Rate',
+ 'critDMG_': 'CRIT DMG',
+ 'heal_': 'Healing Bonus',
+ 'physical_dmg_': 'Physical DMG Bonus',
+ 'anemo_dmg_': 'Anemo DMG Bonus',
+ 'geo_dmg_': 'Geo DMG Bonus',
+ 'electro_dmg_': 'Electro DMG Bonus',
+ 'dendro_dmg_': 'Dendro DMG Bonus',
+ 'hydro_dmg_': 'Hydro DMG Bonus',
+ 'pyro_dmg_': 'Pyro DMG Bonus',
+ 'cryo_dmg_': 'Cryo DMG Bonus'
+ }
+
+ main_stat_display = stat_display_mapping.get(main_stat, main_stat)
+
+ # Flower and Feather have fixed main stats
+ if slot == 'flower':
+ return main_stat == 'hp'
+ elif slot == 'plume':
+ return main_stat == 'atk'
+
+ # Check if main stat is in the ideal list for this slot
+ slot_ideals = ideal_main_stats.get(slot, [])
+
+ # If no ideal main stats specified for this slot, accept any reasonable main stat
+ if not slot_ideals:
+ # Accept common main stats for each slot
+ if slot == 'sands':
+ return main_stat in ['atk_', 'hp_', 'def_', 'enerRech_', 'eleMas']
+ elif slot == 'goblet':
+ return main_stat in ['atk_', 'hp_', 'def_', 'eleMas'] or main_stat.endswith('_dmg_')
+ elif slot == 'circlet':
+ return main_stat in ['atk_', 'hp_', 'def_', 'critRate_', 'critDMG_', 'heal_', 'eleMas']
+
+ return main_stat_display in slot_ideals
+
+ def check_er_requirement(self, artifacts: List[Dict], character: str) -> Dict:
+ """Check if the artifact set meets ER requirements"""
+ char_data = self.character_data.get(character, {})
+ er_req = char_data.get('er_requirement', {})
+
+ # Calculate total ER from artifacts
+ total_er = 100.0 # Base ER
+
+ for artifact in artifacts:
+ # Main stat ER
+ if artifact['mainStatKey'] == 'enerRech_':
+ if artifact['level'] == 20:
+ total_er += 51.8 # Max ER% main stat at level 20
+ else:
+ # Approximate ER based on level
+ total_er += 51.8 * (artifact['level'] / 20.0)
+
+ # Substat ER
+ for substat in artifact.get('substats', []):
+ if substat['key'] == 'enerRech_':
+ total_er += substat['value']
+
+ # Determine requirement type
+ if isinstance(er_req, dict):
+ if 'min' in er_req:
+ # Simple min/max requirement
+ req_min = er_req['min']
+ req_max = er_req.get('max', req_min)
+ meets_req = req_min <= total_er <= req_max + 20 # Allow some flexibility
+ req_type = f"{req_min}-{req_max}%"
+ else:
+ # Multiple scenarios (like Fischl)
+ meets_req = False
+ req_type = "Various scenarios"
+ for scenario, req_data in er_req.items():
+ if req_data['min'] <= total_er <= req_data['max'] + 20:
+ meets_req = True
+ req_type = f"{scenario}: {req_data['min']}-{req_data['max']}%"
+ break
+ else:
+ meets_req = True
+ req_type = "No specific requirement"
+
+ return {
+ 'total_er': total_er,
+ 'meets_requirement': meets_req,
+ 'requirement_type': req_type
+ }
+
+ def get_available_artifacts_by_slot(self, slot: str, exclude_ids: set, character: str = None, min_rarity: int = 5) -> List[Dict]:
+ """Get all available artifacts for a specific slot, optionally filtered by character requirements"""
+ available = []
+ for artifact in self.artifacts:
+ if (artifact['slotKey'] == slot and
+ artifact['id'] not in exclude_ids and
+ artifact['rarity'] >= min_rarity):
+
+ # If character specified, check set requirements
+ if character and not self.is_set_suitable(artifact, character):
+ continue
+
+ available.append(artifact)
+ return available
+
+ def find_best_build_for_character(self, character: str, exclude_ids: set) -> Tuple[List[Dict], float, Dict, Dict]:
+ """Find the best artifact build for a character"""
+ slots = ['flower', 'plume', 'sands', 'goblet', 'circlet']
+ best_build = None
+ best_score = -1
+ best_er_info = None
+
+ # Get available artifacts for each slot and collect debug info
+ slot_artifacts = {}
+ debug_info = {}
+
+ # First try with 5-star artifacts only
+ for slot in slots:
+ available_5star = self.get_available_artifacts_by_slot(slot, exclude_ids, character, min_rarity=5)
+ suitable_5star = [art for art in available_5star if self.is_main_stat_suitable(art, character)]
+
+ # If no suitable 5-star artifacts, include 4-star as fallback
+ if len(suitable_5star) == 0:
+ available_all = self.get_available_artifacts_by_slot(slot, exclude_ids, character, min_rarity=4)
+ suitable_all = [art for art in available_all if self.is_main_stat_suitable(art, character)]
+ slot_artifacts[slot] = suitable_all
+ used_fallback = len(suitable_all) > 0
+ else:
+ slot_artifacts[slot] = suitable_5star
+ available_all = available_5star
+ used_fallback = False
+
+ # Collect debug information
+ char_data = self.character_data.get(character, {})
+ required_sets = char_data.get('required_sets', [])
+
+ main_stats_found = list(set(art['mainStatKey'] for art in available_all))
+ suitable_main_stats_found = list(set(art['mainStatKey'] for art in slot_artifacts[slot]))
+ sets_found = list(set(art['setKey'] for art in available_all))
+
+ debug_info[slot] = {
+ 'total_available': len(available_all),
+ 'suitable_main_stats': len(slot_artifacts[slot]),
+ 'main_stats_found': main_stats_found,
+ 'suitable_main_stats_found': suitable_main_stats_found,
+ 'sets_found': sets_found,
+ 'required_sets': required_sets,
+ 'used_4star_fallback': used_fallback
+ }
+
+ # Try all combinations (this is computationally expensive but thorough)
+ from itertools import product
+
+ artifact_combinations = list(product(*[slot_artifacts[slot] for slot in slots]))
+
+ for combination in artifact_combinations:
+ if len(set(art['id'] for art in combination)) != 5:
+ continue # Skip if any artifacts are duplicated
+
+ # Calculate total score
+ total_score = sum(self.calculate_artifact_score(art, character) for art in combination)
+ avg_score = total_score / 5
+
+ # Check ER requirement
+ er_info = self.check_er_requirement(list(combination), character)
+
+ # Prioritize builds that meet ER requirements
+ adjusted_score = avg_score
+ if er_info['meets_requirement']:
+ adjusted_score += 10 # Bonus for meeting ER req
+
+ if adjusted_score > best_score:
+ best_score = adjusted_score
+ best_build = list(combination)
+ best_er_info = er_info
+
+ return best_build, best_score - (10 if best_er_info and best_er_info['meets_requirement'] else 0), best_er_info, debug_info
+
+ def optimize_builds(self, character_priority: List[str]) -> Dict:
+ """Optimize artifact builds for characters in priority order"""
+ results = {}
+ used_artifact_ids = set()
+
+ for character in character_priority:
+ if character not in self.character_data:
+ print(f"Warning: Character '{character}' not found in character data")
+ continue
+
+ print(f"Finding best build for {character}...")
+
+ best_build, score, er_info, debug_info = self.find_best_build_for_character(character, used_artifact_ids)
+
+ if best_build:
+ # Mark these artifacts as used
+ for artifact in best_build:
+ used_artifact_ids.add(artifact['id'])
+
+ # Calculate individual artifact scores
+ artifact_scores = []
+ for artifact in best_build:
+ art_score = self.calculate_artifact_score(artifact, character)
+ artifact_scores.append({
+ 'artifact': artifact,
+ 'score': art_score
+ })
+
+ results[character] = {
+ 'build': best_build,
+ 'average_score': score,
+ 'artifact_scores': artifact_scores,
+ 'er_info': er_info,
+ 'debug_info': debug_info
+ }
+ else:
+ results[character] = {
+ 'build': None,
+ 'average_score': 0,
+ 'artifact_scores': [],
+ 'er_info': {'total_er': 100, 'meets_requirement': False, 'requirement_type': 'No artifacts available'},
+ 'debug_info': debug_info
+ }
+
+ return results
+
+ def format_results(self, results: Dict) -> str:
+ """Format the optimization results for display"""
+ output = []
+ output.append("=" * 80)
+ output.append("ARTIFACT OPTIMIZATION RESULTS")
+ output.append("=" * 80)
+
+ for character, data in results.items():
+ output.append(f"\n{'='*20} {character.upper()} {'='*20}")
+
+ if not data['build']:
+ output.append("āŒ No suitable build found")
+
+ # Add debug information
+ debug_info = data.get('debug_info', {})
+ output.append("\nšŸ” DEBUG INFO:")
+ for slot, info in debug_info.items():
+ fallback_note = " (using 4⭐ fallback)" if info.get('used_4star_fallback') else ""
+ output.append(f" {slot}: {info['suitable_main_stats']}/{info['total_available']} suitable artifacts{fallback_note}")
+ if info.get('required_sets'):
+ output.append(f" Required sets: {', '.join(info['required_sets'])}")
+ if info.get('sets_found'):
+ output.append(f" Available sets: {', '.join(info['sets_found'])}")
+ if info['main_stats_found']:
+ output.append(f" Available main stats: {', '.join(info['main_stats_found'])}")
+ if info['suitable_main_stats_found']:
+ output.append(f" Suitable main stats: {', '.join(info['suitable_main_stats_found'])}")
+
+ continue
+
+ output.append(f"šŸ“Š Average Artifact Score: {data['average_score']:.2f}/100")
+
+ # ER Information
+ er_info = data['er_info']
+ er_status = "āœ…" if er_info['meets_requirement'] else "āš ļø"
+ output.append(f"{er_status} Energy Recharge: {er_info['total_er']:.1f}% ({er_info['requirement_type']})")
+
+ output.append("\nšŸ“‹ ARTIFACT BUILD:")
+
+ for i, art_data in enumerate(data['artifact_scores']):
+ artifact = art_data['artifact']
+ score = art_data['score']
+
+ slot_name = self.slot_names[artifact['slotKey']]
+ set_name = artifact['setKey']
+ main_stat = artifact['mainStatKey']
+ level = artifact['level']
+ rarity = artifact['rarity']
+ rarity_stars = '⭐' * rarity
+
+ output.append(f"\n{slot_name} ({set_name}) - Level {level} {rarity_stars}")
+ output.append(f" Main Stat: {main_stat}")
+ output.append(f" Score: {score:.2f}/100")
+ output.append(f" Substats:")
+
+ for substat in artifact['substats']:
+ stat_key = substat['key']
+ stat_value = substat['value']
+
+ # Format the value appropriately
+ if stat_key in ['hp', 'atk', 'def', 'eleMas']:
+ formatted_value = f"{stat_value:.0f}"
+ else:
+ formatted_value = f"{stat_value:.1f}%"
+
+ output.append(f" • {stat_key}: {formatted_value}")
+
+ # Summary
+ output.append(f"\n{'='*20} SUMMARY {'='*20}")
+ total_chars = len(results)
+ successful_builds = sum(1 for data in results.values() if data['build'] is not None)
+
+ output.append(f"Characters processed: {total_chars}")
+ output.append(f"Successful builds: {successful_builds}")
+ output.append(f"Failed builds: {total_chars - successful_builds}")
+
+ if successful_builds > 0:
+ avg_score = sum(data['average_score'] for data in results.values() if data['build']) / successful_builds
+ output.append(f"Average build quality: {avg_score:.2f}/100")
+
+ return "\n".join(output)
+
+def main():
+ # Initialize optimizer
+ optimizer = ArtifactOptimizer()
+
+ # Load data
+ optimizer.load_data('data.json', 'characters.json')
+
+ # Define character priority (example)
+ character_priority = ['Furina', 'Escoffier', 'Fischl', 'Chiori']
+
+ print("Starting artifact optimization...")
+ print(f"Character priority: {' -> '.join(character_priority)}")
+ print(f"Total artifacts available: {len(optimizer.artifacts)}")
+
+ # Optimize builds
+ results = optimizer.optimize_builds(character_priority)
+
+ # Display results
+ formatted_output = optimizer.format_results(results)
+ print(formatted_output)
+
+ # Save results to file
+ with open('optimization_results.txt', 'w') as f:
+ f.write(formatted_output)
+
+ print(f"\nResults saved to 'optimization_results.txt'")
+
+if __name__ == "__main__":
+ main()
diff --git a/characters.json b/characters.json
new file mode 100644
index 0000000..11f9aa7
--- /dev/null
+++ b/characters.json
@@ -0,0 +1,65 @@
+{
+ "Furina": {
+ "er_requirement": {
+ "min": 180,
+ "max": 200
+ },
+ "ideal_main_stats": {
+ "sands": ["HP%", "ER%"],
+ "goblet": ["HP%", "Hydro DMG Bonus"],
+ "circlet": ["CRIT Rate", "CRIT DMG"]
+ },
+ "substat_priority": ["ER%", "CRIT Rate", "CRIT DMG", "HP%", "Flat HP"],
+ "required_sets": ["GoldenTroupe"]
+ },
+ "Escoffier": {
+ "er_requirement": {
+ "min": 180,
+ "max": 200
+ },
+ "ideal_main_stats": {
+ "sands": ["ATK%", "ER%"],
+ "goblet": ["Cryo DMG Bonus", "ATK%"],
+ "circlet": ["CRIT Rate", "CRIT DMG"]
+ },
+ "substat_priority": ["ER%", "CRIT Rate", "CRIT DMG", "ATK%"],
+ "required_sets": ["GoldenTroupe"]
+ },
+ "Fischl": {
+ "er_requirement": {
+ "off_field_every_rotation": {
+ "min": 120,
+ "max": 140
+ },
+ "off_field_every_other": {
+ "min": 100,
+ "max": 100
+ },
+ "on_field": {
+ "min": 110,
+ "max": 130
+ }
+ },
+ "ideal_main_stats": {
+ "sands": ["ATK%", "Elemental Mastery"],
+ "goblet": ["Electro DMG Bonus", "Physical DMG Bonus"],
+ "circlet": ["CRIT Rate", "CRIT DMG"]
+ },
+ "substat_priority": ["ER%", "CRIT Rate", "CRIT DMG", "ATK%"],
+ "required_sets": ["GoldenTroupe"]
+ },
+ "Chiori": {
+ "er_requirement": {
+ "min": 100,
+ "max": 110
+ },
+ "ideal_main_stats": {
+ "sands": ["DEF%"],
+ "goblet": ["Geo DMG Bonus", "DEF%"],
+ "circlet": ["CRIT Rate", "CRIT DMG", "DEF%"]
+ },
+ "substat_priority": ["CRIT Rate", "CRIT DMG", "DEF%", "ATK%", "ER%"],
+ "notes": ["Avoid triple DEF% main stats."],
+ "required_sets": ["GoldenTroupe"]
+ }
+}
diff --git a/data.json b/data.json
new file mode 100644
index 0000000..7656a0f
--- /dev/null
+++ b/data.json
@@ -0,0 +1 @@
+{"format":"GOOD","version":2,"kamera_version":"1.3.17","source":"Inventory_Kamera","artifacts":[{"setKey":"GoldenTroupe","slotKey":"flower","rarity":5,"mainStatKey":"hp","level":20,"substats":[{"key":"eleMas","value":19.0},{"key":"atk_","value":14.0},{"key":"enerRech_","value":23.3},{"key":"hp_","value":5.8}],"location":"Fischl","lock":true,"id":0},{"setKey":"GoldenTroupe","slotKey":"flower","rarity":5,"mainStatKey":"hp","level":20,"substats":[{"key":"enerRech_","value":9.1},{"key":"critDMG_","value":12.4},{"key":"atk","value":37.0},{"key":"atk_","value":11.7}],"location":"Escoffier","lock":true,"id":1},{"setKey":"GoldenTroupe","slotKey":"sands","rarity":5,"mainStatKey":"enerRech_","level":20,"substats":[{"key":"def","value":58.0},{"key":"atk_","value":4.7},{"key":"critRate_","value":6.2},{"key":"hp","value":508.0}],"location":"","lock":true,"id":2},{"setKey":"GoldenTroupe","slotKey":"circlet","rarity":5,"mainStatKey":"critRate_","level":20,"substats":[{"key":"def","value":44.0},{"key":"critDMG_","value":15.5},{"key":"hp","value":448.0},{"key":"def_","value":13.9}],"location":"","lock":true,"id":3},{"setKey":"CrimsonWitchOfFlames","slotKey":"circlet","rarity":5,"mainStatKey":"critRate_","level":20,"substats":[{"key":"hp","value":538.0},{"key":"critDMG_","value":26.4},{"key":"hp_","value":11.1},{"key":"eleMas","value":19.0}],"location":"HuTao","lock":true,"id":5},{"setKey":"CrimsonWitchOfFlames","slotKey":"goblet","rarity":5,"mainStatKey":"hydro_dmg_","level":17,"substats":[{"key":"atk","value":39.0},{"key":"hp","value":508.0},{"key":"hp_","value":5.8},{"key":"critRate_","value":7.4}],"location":"HuTao","lock":true,"id":6},{"setKey":"GoldenTroupe","slotKey":"flower","rarity":5,"mainStatKey":"hp","level":16,"substats":[{"key":"def_","value":5.1},{"key":"critDMG_","value":14.0},{"key":"hp_","value":16.9},{"key":"enerRech_","value":11.7}],"location":"Furina","lock":true,"id":7},{"setKey":"GoldenTroupe","slotKey":"plume","rarity":5,"mainStatKey":"atk","level":16,"substats":[{"key":"critDMG_","value":7.8},{"key":"enerRech_","value":12.3},{"key":"critRate_","value":3.5},{"key":"def","value":65.0}],"location":"Furina","lock":true,"id":8},{"setKey":"GoldenTroupe","slotKey":"sands","rarity":5,"mainStatKey":"atk_","level":16,"substats":[{"key":"critDMG_","value":7.8},{"key":"hp","value":448.0},{"key":"critRate_","value":6.6},{"key":"enerRech_","value":12.3}],"location":"Furina","lock":true,"id":9},{"setKey":"TheExile","slotKey":"circlet","rarity":4,"mainStatKey":"hp_","level":14,"substats":[{"key":"hp","value":215.0},{"key":"def","value":13.0},{"key":"eleMas","value":30.0},{"key":"enerRech_","value":4.7}],"location":"","lock":false,"id":10},{"setKey":"LongNightsOath","slotKey":"flower","rarity":5,"mainStatKey":"hp","level":12,"substats":[{"key":"hp_","value":11.1},{"key":"critDMG_","value":7.8},{"key":"enerRech_","value":5.8},{"key":"atk","value":33.0}],"location":"","lock":true,"id":12},{"setKey":"LongNightsOath","slotKey":"plume","rarity":5,"mainStatKey":"atk","level":12,"substats":[{"key":"eleMas","value":16.0},{"key":"def_","value":5.1},{"key":"hp","value":538.0},{"key":"critRate_","value":6.2}],"location":"Varesa","lock":true,"id":13},{"setKey":"LongNightsOath","slotKey":"sands","rarity":5,"mainStatKey":"hp_","level":12,"substats":[{"key":"hp","value":239.0},{"key":"critDMG_","value":21.8},{"key":"eleMas","value":47.0},{"key":"def","value":23.0}],"location":"","lock":true,"id":14},{"setKey":"LongNightsOath","slotKey":"goblet","rarity":5,"mainStatKey":"atk_","level":12,"substats":[{"key":"def_","value":6.6},{"key":"critDMG_","value":7.0},{"key":"eleMas","value":42.0},{"key":"critRate_","value":7.4}],"location":"Varesa","lock":true,"id":15},{"setKey":"LongNightsOath","slotKey":"circlet","rarity":5,"mainStatKey":"critDMG_","level":12,"substats":[{"key":"hp","value":807.0},{"key":"atk","value":37.0},{"key":"eleMas","value":21.0},{"key":"def_","value":6.6}],"location":"","lock":true,"id":16},{"setKey":"LongNightsOath","slotKey":"circlet","rarity":5,"mainStatKey":"critRate_","level":12,"substats":[{"key":"def","value":35.0},{"key":"atk_","value":9.9},{"key":"critDMG_","value":6.2},{"key":"hp","value":269.0}],"location":"Varesa","lock":true,"id":17},{"setKey":"GoldenTroupe","slotKey":"plume","rarity":5,"mainStatKey":"atk","level":12,"substats":[{"key":"enerRech_","value":17.5},{"key":"atk_","value":9.9},{"key":"def_","value":7.3},{"key":"eleMas","value":21.0}],"location":"Escoffier","lock":true,"id":18},{"setKey":"GoldenTroupe","slotKey":"plume","rarity":5,"mainStatKey":"atk","level":12,"substats":[{"key":"def","value":16.0},{"key":"critDMG_","value":13.2},{"key":"hp","value":209.0},{"key":"hp_","value":9.9}],"location":"","lock":true,"id":19},{"setKey":"GoldenTroupe","slotKey":"sands","rarity":5,"mainStatKey":"atk_","level":12,"substats":[{"key":"atk","value":16.0},{"key":"def","value":23.0},{"key":"hp","value":418.0},{"key":"enerRech_","value":16.8}],"location":"Fischl","lock":true,"id":20},{"setKey":"GoldenTroupe","slotKey":"sands","rarity":5,"mainStatKey":"atk_","level":12,"substats":[{"key":"eleMas","value":44.0},{"key":"atk","value":14.0},{"key":"enerRech_","value":11.7},{"key":"critDMG_","value":6.2}],"location":"Escoffier","lock":true,"id":21},{"setKey":"GoldenTroupe","slotKey":"goblet","rarity":5,"mainStatKey":"atk_","level":12,"substats":[{"key":"critRate_","value":7.0},{"key":"hp_","value":5.3},{"key":"enerRech_","value":5.2},{"key":"hp","value":508.0}],"location":"Furina","lock":true,"id":22},{"setKey":"GoldenTroupe","slotKey":"circlet","rarity":5,"mainStatKey":"critRate_","level":12,"substats":[{"key":"hp_","value":9.9},{"key":"atk","value":37.0},{"key":"critDMG_","value":7.8},{"key":"def","value":19.0}],"location":"Furina","lock":true,"id":23},{"setKey":"GoldenTroupe","slotKey":"circlet","rarity":5,"mainStatKey":"critDMG_","level":12,"substats":[{"key":"hp_","value":9.9},{"key":"enerRech_","value":5.2},{"key":"atk_","value":8.2},{"key":"def","value":21.0}],"location":"Escoffier","lock":true,"id":24},{"setKey":"CrimsonWitchOfFlames","slotKey":"flower","rarity":5,"mainStatKey":"hp","level":12,"substats":[{"key":"eleMas","value":33.0},{"key":"atk_","value":10.5},{"key":"hp_","value":5.3},{"key":"def_","value":11.7}],"location":"HuTao","lock":true,"id":25},{"setKey":"CrimsonWitchOfFlames","slotKey":"plume","rarity":5,"mainStatKey":"atk","level":12,"substats":[{"key":"hp","value":209.0},{"key":"eleMas","value":44.0},{"key":"def","value":39.0},{"key":"atk_","value":5.8}],"location":"HuTao","lock":true,"id":26},{"setKey":"ViridescentVenerer","slotKey":"plume","rarity":5,"mainStatKey":"atk","level":12,"substats":[{"key":"enerRech_","value":16.8},{"key":"critRate_","value":2.7},{"key":"atk_","value":8.2},{"key":"hp","value":299.0}],"location":"Jean","lock":true,"id":27},{"setKey":"ViridescentVenerer","slotKey":"sands","rarity":5,"mainStatKey":"atk_","level":12,"substats":[{"key":"def","value":23.0},{"key":"hp_","value":11.1},{"key":"def_","value":13.9},{"key":"critRate_","value":3.1}],"location":"Jean","lock":true,"id":28},{"setKey":"GoldenTroupe","slotKey":"plume","rarity":4,"mainStatKey":"atk","level":12,"substats":[{"key":"hp_","value":3.7},{"key":"critDMG_","value":4.4},{"key":"def_","value":9.9},{"key":"def","value":15.0}],"location":"","lock":true,"id":29},{"setKey":"GoldenTroupe","slotKey":"goblet","rarity":5,"mainStatKey":"physical_dmg_","level":11,"substats":[{"key":"enerRech_","value":5.8},{"key":"hp_","value":5.3},{"key":"atk","value":18.0},{"key":"atk_","value":10.5}],"location":"","lock":true,"id":30},{"setKey":"Scholar","slotKey":"goblet","rarity":4,"mainStatKey":"atk_","level":11,"substats":[{"key":"hp","value":167.0},{"key":"eleMas","value":13.0},{"key":"def","value":13.0},{"key":"hp_","value":4.2}],"location":"","lock":false,"id":31},{"setKey":"Instructor","slotKey":"plume","rarity":4,"mainStatKey":"atk","level":9,"substats":[{"key":"def","value":15.0},{"key":"def_","value":4.7},{"key":"atk_","value":3.3},{"key":"eleMas","value":17.0}],"location":"","lock":false,"id":32},{"setKey":"FinaleOfTheDeepGalleries","slotKey":"flower","rarity":5,"mainStatKey":"hp","level":8,"substats":[{"key":"atk","value":19.0},{"key":"critRate_","value":3.1},{"key":"critDMG_","value":7.8},{"key":"atk_","value":9.9}],"location":"","lock":false,"id":33},{"setKey":"FinaleOfTheDeepGalleries","slotKey":"flower","rarity":5,"mainStatKey":"hp","level":8,"substats":[{"key":"atk_","value":5.8},{"key":"atk","value":16.0},{"key":"def","value":37.0},{"key":"critRate_","value":3.5}],"location":"","lock":true,"id":34},{"setKey":"PrayersForWisdom","slotKey":"circlet","rarity":4,"mainStatKey":"atk_","level":8,"substats":[{"key":"hp_","value":8.9},{"key":"eleMas","value":19.0},{"key":"atk","value":11.0},{"key":"def","value":13.0}],"location":"","lock":false,"id":35},{"setKey":"TheExile","slotKey":"goblet","rarity":4,"mainStatKey":"atk_","level":8,"substats":[{"key":"atk","value":14.0},{"key":"def_","value":5.3},{"key":"critRate_","value":2.8},{"key":"hp","value":167.0}],"location":"","lock":false,"id":36},{"setKey":"Instructor","slotKey":"flower","rarity":4,"mainStatKey":"hp","level":8,"substats":[{"key":"enerRech_","value":4.1},{"key":"eleMas","value":19.0},{"key":"def","value":15.0},{"key":"critRate_","value":2.2}],"location":"","lock":false,"id":37},{"setKey":"PrayersForIllumination","slotKey":"circlet","rarity":4,"mainStatKey":"atk_","level":7,"substats":[{"key":"hp","value":215.0},{"key":"def","value":19.0},{"key":"eleMas","value":15.0},{"key":"atk","value":14.0}],"location":"","lock":false,"id":38},{"setKey":"CrimsonWitchOfFlames","slotKey":"plume","rarity":4,"mainStatKey":"atk","level":7,"substats":[{"key":"hp","value":191.0},{"key":"critRate_","value":3.1},{"key":"def_","value":5.3}],"location":"","lock":false,"id":39},{"setKey":"Scholar","slotKey":"plume","rarity":4,"mainStatKey":"atk","level":7,"substats":[{"key":"def","value":15.0},{"key":"hp","value":215.0},{"key":"enerRech_","value":5.2}],"location":"Xilonen","lock":false,"id":40},{"setKey":"Instructor","slotKey":"sands","rarity":4,"mainStatKey":"enerRech_","level":7,"substats":[{"key":"hp","value":239.0},{"key":"atk_","value":3.7},{"key":"critRate_","value":2.8}],"location":"Iansan","lock":false,"id":41},{"setKey":"FinaleOfTheDeepGalleries","slotKey":"plume","rarity":5,"mainStatKey":"atk","level":4,"substats":[{"key":"critDMG_","value":5.4},{"key":"critRate_","value":3.5},{"key":"eleMas","value":19.0},{"key":"hp_","value":5.3}],"location":"","lock":false,"id":42},{"setKey":"LongNightsOath","slotKey":"circlet","rarity":5,"mainStatKey":"critDMG_","level":4,"substats":[{"key":"def","value":23.0},{"key":"atk","value":19.0},{"key":"hp","value":299.0},{"key":"enerRech_","value":4.5}],"location":"","lock":true,"id":43},{"setKey":"GoldenTroupe","slotKey":"goblet","rarity":5,"mainStatKey":"hp_","level":4,"substats":[{"key":"hp","value":269.0},{"key":"eleMas","value":16.0},{"key":"enerRech_","value":4.5},{"key":"def","value":21.0}],"location":"","lock":true,"id":44},{"setKey":"GoldenTroupe","slotKey":"goblet","rarity":5,"mainStatKey":"def_","level":4,"substats":[{"key":"hp","value":239.0},{"key":"def","value":21.0},{"key":"critDMG_","value":7.0},{"key":"critRate_","value":2.7}],"location":"","lock":true,"id":45},{"setKey":"GoldenTroupe","slotKey":"goblet","rarity":5,"mainStatKey":"hp_","level":4,"substats":[{"key":"atk_","value":4.1},{"key":"enerRech_","value":5.8},{"key":"def_","value":5.8},{"key":"def","value":21.0}],"location":"Escoffier","lock":true,"id":46},{"setKey":"GoldenTroupe","slotKey":"circlet","rarity":5,"mainStatKey":"def_","level":4,"substats":[{"key":"hp","value":299.0},{"key":"atk","value":19.0},{"key":"critRate_","value":7.0},{"key":"eleMas","value":19.0}],"location":"","lock":true,"id":47},{"setKey":"GoldenTroupe","slotKey":"circlet","rarity":5,"mainStatKey":"critRate_","level":4,"substats":[{"key":"def_","value":5.8},{"key":"atk","value":18.0},{"key":"critDMG_","value":7.0},{"key":"hp_","value":4.7}],"location":"","lock":true,"id":48},{"setKey":"GoldenTroupe","slotKey":"circlet","rarity":5,"mainStatKey":"hp_","level":4,"substats":[{"key":"hp","value":299.0},{"key":"atk","value":14.0},{"key":"eleMas","value":16.0},{"key":"def","value":19.0}],"location":"","lock":true,"id":49},{"setKey":"ViridescentVenerer","slotKey":"goblet","rarity":5,"mainStatKey":"physical_dmg_","level":4,"substats":[{"key":"atk","value":19.0},{"key":"hp","value":538.0},{"key":"atk_","value":4.7},{"key":"def_","value":5.1}],"location":"Jean","lock":true,"id":50},{"setKey":"LongNightsOath","slotKey":"flower","rarity":5,"mainStatKey":"hp","level":0,"substats":[{"key":"atk","value":18.0},{"key":"atk_","value":4.7},{"key":"enerRech_","value":6.5},{"key":"eleMas","value":21.0}],"location":"","lock":true,"id":51},{"setKey":"LongNightsOath","slotKey":"sands","rarity":5,"mainStatKey":"eleMas","level":0,"substats":[{"key":"critDMG_","value":7.8},{"key":"critRate_","value":3.5},{"key":"atk","value":16.0},{"key":"def_","value":7.3}],"location":"Varesa","lock":true,"id":52},{"setKey":"GoldenTroupe","slotKey":"plume","rarity":5,"mainStatKey":"atk","level":0,"substats":[{"key":"hp","value":299.0},{"key":"atk_","value":4.7},{"key":"enerRech_","value":5.8},{"key":"def","value":16.0}],"location":"","lock":false,"id":53},{"setKey":"GoldenTroupe","slotKey":"sands","rarity":5,"mainStatKey":"atk_","level":0,"substats":[{"key":"def","value":23.0},{"key":"critDMG_","value":7.8},{"key":"atk","value":19.0},{"key":"enerRech_","value":5.2}],"location":"","lock":true,"id":54},{"setKey":"GoldenTroupe","slotKey":"goblet","rarity":5,"mainStatKey":"atk_","level":0,"substats":[{"key":"critDMG_","value":6.2},{"key":"eleMas","value":19.0},{"key":"def","value":19.0},{"key":"hp","value":269.0}],"location":"","lock":false,"id":55},{"setKey":"GoldenTroupe","slotKey":"goblet","rarity":5,"mainStatKey":"dendro_dmg_","level":0,"substats":[{"key":"def","value":19.0},{"key":"def_","value":6.6},{"key":"eleMas","value":23.0}],"location":"","lock":false,"id":56},{"setKey":"GoldenTroupe","slotKey":"circlet","rarity":5,"mainStatKey":"heal_","level":0,"substats":[{"key":"atk","value":19.0},{"key":"atk_","value":5.3},{"key":"def","value":21.0}],"location":"","lock":false,"id":57},{"setKey":"ViridescentVenerer","slotKey":"flower","rarity":5,"mainStatKey":"hp","level":0,"substats":[{"key":"atk_","value":4.1},{"key":"atk","value":16.0},{"key":"enerRech_","value":5.8}],"location":"Jean","lock":false,"id":58},{"setKey":"ViridescentVenerer","slotKey":"circlet","rarity":5,"mainStatKey":"heal_","level":0,"substats":[{"key":"hp","value":209.0},{"key":"eleMas","value":21.0},{"key":"hp_","value":4.1}],"location":"Jean","lock":true,"id":59},{"setKey":"GoldenTroupe","slotKey":"flower","rarity":4,"mainStatKey":"hp","level":0,"substats":[{"key":"atk","value":11.0},{"key":"atk_","value":4.7}],"location":"","lock":false,"id":60},{"setKey":"GoldenTroupe","slotKey":"plume","rarity":4,"mainStatKey":"atk","level":0,"substats":[{"key":"eleMas","value":17.0},{"key":"critRate_","value":2.8}],"location":"","lock":false,"id":61},{"setKey":"GoldenTroupe","slotKey":"sands","rarity":4,"mainStatKey":"hp_","level":0,"substats":[{"key":"critDMG_","value":6.2},{"key":"def","value":19.0}],"location":"","lock":false,"id":62},{"setKey":"GoldenTroupe","slotKey":"sands","rarity":4,"mainStatKey":"def_","level":0,"substats":[{"key":"atk_","value":4.2},{"key":"atk","value":11.0}],"location":"","lock":false,"id":63},{"setKey":"GoldenTroupe","slotKey":"circlet","rarity":4,"mainStatKey":"critDMG_","level":0,"substats":[{"key":"def","value":17.0},{"key":"eleMas","value":15.0}],"location":"","lock":false,"id":64},{"setKey":"GoldenTroupe","slotKey":"circlet","rarity":4,"mainStatKey":"hp_","level":0,"substats":[{"key":"atk_","value":4.7},{"key":"def_","value":5.3}],"location":"","lock":false,"id":65},{"setKey":"MarechausseeHunter","slotKey":"flower","rarity":4,"mainStatKey":"hp","level":0,"substats":[{"key":"atk","value":11.0},{"key":"atk_","value":3.3},{"key":"def_","value":4.7}],"location":"","lock":false,"id":66},{"setKey":"MarechausseeHunter","slotKey":"plume","rarity":4,"mainStatKey":"atk","level":0,"substats":[{"key":"hp","value":167.0},{"key":"critRate_","value":2.2}],"location":"","lock":false,"id":67},{"setKey":"MarechausseeHunter","slotKey":"sands","rarity":4,"mainStatKey":"atk_","level":0,"substats":[{"key":"hp_","value":4.7},{"key":"atk","value":11.0},{"key":"def","value":19.0}],"location":"","lock":false,"id":68},{"setKey":"MarechausseeHunter","slotKey":"circlet","rarity":4,"mainStatKey":"atk_","level":0,"substats":[{"key":"enerRech_","value":5.2},{"key":"def","value":19.0}],"location":"","lock":false,"id":69},{"setKey":"Scholar","slotKey":"circlet","rarity":4,"mainStatKey":"critRate_","level":0,"substats":[{"key":"def_","value":4.1},{"key":"hp","value":167.0}],"location":"Xilonen","lock":false,"id":70},{"setKey":"Berserker","slotKey":"goblet","rarity":4,"mainStatKey":"atk_","level":0,"substats":[{"key":"atk","value":11.0},{"key":"critRate_","value":2.5}],"location":"Iansan","lock":false,"id":71},{"setKey":"Berserker","slotKey":"circlet","rarity":4,"mainStatKey":"atk_","level":0,"substats":[{"key":"atk","value":14.0},{"key":"hp_","value":3.7}],"location":"Iansan","lock":false,"id":72},{"setKey":"DefendersWill","slotKey":"flower","rarity":4,"mainStatKey":"hp","level":0,"substats":[{"key":"def","value":17.0},{"key":"enerRech_","value":5.2}],"location":"Xilonen","lock":false,"id":73},{"setKey":"DefendersWill","slotKey":"sands","rarity":4,"mainStatKey":"def_","level":0,"substats":[{"key":"def","value":17.0},{"key":"enerRech_","value":4.1}],"location":"Xilonen","lock":false,"id":74},{"setKey":"ResolutionOfSojourner","slotKey":"flower","rarity":4,"mainStatKey":"hp","level":0,"substats":[{"key":"critDMG_","value":5.0},{"key":"def","value":13.0},{"key":"def_","value":4.7}],"location":"Iansan","lock":false,"id":75},{"setKey":"ResolutionOfSojourner","slotKey":"plume","rarity":4,"mainStatKey":"atk","level":0,"substats":[{"key":"eleMas","value":19.0},{"key":"critDMG_","value":6.2}],"location":"Iansan","lock":false,"id":76}]} \ No newline at end of file
diff --git a/demo_optimizer.py b/demo_optimizer.py
new file mode 100644
index 0000000..48ea776
--- /dev/null
+++ b/demo_optimizer.py
@@ -0,0 +1,165 @@
+import json
+from artifact_optimizer import ArtifactOptimizer
+
+def run_demo():
+ """Demonstrate the artifact optimizer with different priority scenarios"""
+
+ # Initialize optimizer
+ optimizer = ArtifactOptimizer()
+ optimizer.load_data('data.json', 'characters.json')
+
+ print("="*80)
+ print("šŸŽ® GENSHIN ARTIFACT OPTIMIZER DEMO")
+ print("="*80)
+ print(f"šŸ“¦ Total artifacts available: {len(optimizer.artifacts)}")
+ print(f"šŸ‘„ Characters available: {', '.join(optimizer.character_data.keys())}")
+
+ # Define different priority scenarios
+ scenarios = [
+ {
+ "name": "DPS Priority",
+ "description": "Prioritize main DPS characters first",
+ "priority": ["Fischl", "Chiori", "Furina", "Escoffier"]
+ },
+ {
+ "name": "Support Priority",
+ "description": "Prioritize support characters first",
+ "priority": ["Furina", "Escoffier", "Fischl", "Chiori"]
+ },
+ {
+ "name": "ER Demanding First",
+ "description": "Prioritize characters with high ER requirements",
+ "priority": ["Escoffier", "Furina", "Fischl", "Chiori"]
+ },
+ {
+ "name": "Reverse Order",
+ "description": "Completely reverse priority order",
+ "priority": ["Chiori", "Fischl", "Escoffier", "Furina"]
+ }
+ ]
+
+ # Store results for comparison
+ all_results = {}
+
+ # Run each scenario
+ for i, scenario in enumerate(scenarios, 1):
+ print(f"\n{'='*60}")
+ print(f"SCENARIO {i}: {scenario['name']}")
+ print(f"{'='*60}")
+ print(f"šŸ“ {scenario['description']}")
+ print(f"šŸŽÆ Priority: {' -> '.join(scenario['priority'])}")
+
+ # Run optimization
+ results = optimizer.optimize_builds(scenario['priority'])
+ all_results[scenario['name']] = results
+
+ # Quick summary
+ successful = sum(1 for data in results.values() if data['build'] is not None)
+ if successful > 0:
+ avg_score = sum(data['average_score'] for data in results.values() if data['build']) / successful
+ er_compliant = sum(1 for data in results.values()
+ if data['build'] and data['er_info']['meets_requirement'])
+
+ print(f"āœ… Successful builds: {successful}/4")
+ print(f"šŸ“Š Average quality: {avg_score:.1f}/100")
+ print(f"⚔ ER compliant: {er_compliant}/4")
+
+ # Show individual scores
+ print("\nšŸ“‹ Individual Scores:")
+ for char, data in results.items():
+ if data['build']:
+ er_status = "āœ…" if data['er_info']['meets_requirement'] else "āš ļø"
+ print(f" {char}: {data['average_score']:.1f}/100 {er_status}")
+ else:
+ print(f" {char}: No build found āŒ")
+ else:
+ print("āŒ No successful builds found!")
+
+ # Comparison analysis
+ print(f"\n{'='*80}")
+ print("šŸ“Š SCENARIO COMPARISON")
+ print(f"{'='*80}")
+
+ comparison_data = []
+ for scenario_name, results in all_results.items():
+ successful = sum(1 for data in results.values() if data['build'] is not None)
+ if successful > 0:
+ avg_score = sum(data['average_score'] for data in results.values() if data['build']) / successful
+ er_compliant = sum(1 for data in results.values()
+ if data['build'] and data['er_info']['meets_requirement'])
+
+ comparison_data.append({
+ 'scenario': scenario_name,
+ 'successful_builds': successful,
+ 'average_score': avg_score,
+ 'er_compliant': er_compliant,
+ 'total_score': successful * avg_score # Weighted score
+ })
+
+ # Sort by total weighted score
+ comparison_data.sort(key=lambda x: x['total_score'], reverse=True)
+
+ print("šŸ† Ranking (by total weighted score):")
+ for i, data in enumerate(comparison_data, 1):
+ print(f" {i}. {data['scenario']}")
+ print(f" Builds: {data['successful_builds']}/4 | "
+ f"Avg Score: {data['average_score']:.1f} | "
+ f"ER Compliant: {data['er_compliant']}/4 | "
+ f"Total: {data['total_score']:.1f}")
+
+ # Character-specific analysis
+ print(f"\nšŸ“ˆ CHARACTER PERFORMANCE ACROSS SCENARIOS")
+ print(f"{'='*60}")
+
+ characters = list(optimizer.character_data.keys())
+ for char in characters:
+ print(f"\nšŸ” {char}:")
+ char_scores = []
+ for scenario_name, results in all_results.items():
+ if results[char]['build']:
+ score = results[char]['average_score']
+ er_ok = results[char]['er_info']['meets_requirement']
+ char_scores.append(score)
+ status = "āœ…" if er_ok else "āš ļø"
+ print(f" {scenario_name}: {score:.1f}/100 {status}")
+ else:
+ print(f" {scenario_name}: No build āŒ")
+
+ if char_scores:
+ print(f" šŸ“Š Score range: {min(char_scores):.1f} - {max(char_scores):.1f}")
+ print(f" šŸ“Š Average: {sum(char_scores)/len(char_scores):.1f}")
+
+ # Priority impact analysis
+ print(f"\nšŸŽÆ PRIORITY IMPACT ANALYSIS")
+ print(f"{'='*60}")
+
+ print("Key Findings:")
+
+ # Find which characters benefit most from high priority
+ char_variance = {}
+ for char in characters:
+ scores = []
+ for results in all_results.values():
+ if results[char]['build']:
+ scores.append(results[char]['average_score'])
+
+ if len(scores) > 1:
+ variance = max(scores) - min(scores)
+ char_variance[char] = variance
+
+ if char_variance:
+ most_affected = max(char_variance.items(), key=lambda x: x[1])
+ least_affected = min(char_variance.items(), key=lambda x: x[1])
+
+ print(f"• Most affected by priority: {most_affected[0]} (variance: {most_affected[1]:.1f})")
+ print(f"• Least affected by priority: {least_affected[0]} (variance: {least_affected[1]:.1f})")
+
+ # Save detailed results
+ with open('demo_results.json', 'w') as f:
+ json.dump(all_results, f, indent=2, default=str)
+
+ print(f"\nšŸ’¾ Detailed results saved to 'demo_results.json'")
+ print(f"\nšŸŽ‰ Demo completed! Try different scenarios to see how priority affects builds.")
+
+if __name__ == "__main__":
+ run_demo() \ No newline at end of file
diff --git a/demo_results.json b/demo_results.json
new file mode 100644
index 0000000..78ecec9
--- /dev/null
+++ b/demo_results.json
@@ -0,0 +1,6308 @@
+{
+ "DPS Priority": {
+ "Fischl": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "eleMas",
+ "value": 19.0
+ },
+ {
+ "key": "atk_",
+ "value": 14.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 23.3
+ },
+ {
+ "key": "hp_",
+ "value": 5.8
+ }
+ ],
+ "location": "Fischl",
+ "lock": true,
+ "id": 0
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 17.5
+ },
+ {
+ "key": "atk_",
+ "value": 9.9
+ },
+ {
+ "key": "def_",
+ "value": 7.3
+ },
+ {
+ "key": "eleMas",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 18
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "critRate_",
+ "value": 6.6
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 9
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "physical_dmg_",
+ "level": 11,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "atk",
+ "value": 18.0
+ },
+ {
+ "key": "atk_",
+ "value": 10.5
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 30
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 44.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 15.5
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "def_",
+ "value": 13.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 3
+ }
+ ],
+ "average_score": 52.6053872053872,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "eleMas",
+ "value": 19.0
+ },
+ {
+ "key": "atk_",
+ "value": 14.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 23.3
+ },
+ {
+ "key": "hp_",
+ "value": 5.8
+ }
+ ],
+ "location": "Fischl",
+ "lock": true,
+ "id": 0
+ },
+ "score": 78.18181818181817
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 17.5
+ },
+ {
+ "key": "atk_",
+ "value": 9.9
+ },
+ {
+ "key": "def_",
+ "value": 7.3
+ },
+ {
+ "key": "eleMas",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 18
+ },
+ "score": 57.35353535353536
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "critRate_",
+ "value": 6.6
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 9
+ },
+ "score": 63.73737373737374
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "physical_dmg_",
+ "level": 11,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "atk",
+ "value": 18.0
+ },
+ {
+ "key": "atk_",
+ "value": 10.5
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 30
+ },
+ "score": 35.05050505050505
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 44.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 15.5
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "def_",
+ "value": 13.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 3
+ },
+ "score": 28.703703703703702
+ }
+ ],
+ "er_info": {
+ "total_er": 158.90000000000003,
+ "meets_requirement": true,
+ "requirement_type": "off_field_every_rotation: 120-140%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 3,
+ "suitable_main_stats": 3,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "plume": {
+ "total_available": 4,
+ "suitable_main_stats": 4,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 5,
+ "suitable_main_stats": 4,
+ "main_stats_found": [
+ "enerRech_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "atk_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "goblet": {
+ "total_available": 7,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "atk_",
+ "def_",
+ "hp_",
+ "dendro_dmg_",
+ "physical_dmg_"
+ ],
+ "suitable_main_stats_found": [
+ "physical_dmg_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 7,
+ "suitable_main_stats": 4,
+ "main_stats_found": [
+ "critRate_",
+ "heal_",
+ "def_",
+ "hp_",
+ "critDMG_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_",
+ "critDMG_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ },
+ "Chiori": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 9.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 12.4
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "atk_",
+ "value": 11.7
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 1
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ },
+ {
+ "key": "critRate_",
+ "value": 3.5
+ },
+ {
+ "key": "def",
+ "value": 65.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 8
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 4,
+ "mainStatKey": "def_",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk_",
+ "value": 4.2
+ },
+ {
+ "key": "atk",
+ "value": 11.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 63
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "def_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 239.0
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.0
+ },
+ {
+ "key": "critRate_",
+ "value": 2.7
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 45
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critDMG_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "atk_",
+ "value": 8.2
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 24
+ }
+ ],
+ "average_score": 36.12525252525253,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 9.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 12.4
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "atk_",
+ "value": 11.7
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 1
+ },
+ "score": 67.34680134680136
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ },
+ {
+ "key": "critRate_",
+ "value": 3.5
+ },
+ {
+ "key": "def",
+ "value": 65.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 8
+ },
+ "score": 52.255892255892256
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 4,
+ "mainStatKey": "def_",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk_",
+ "value": 4.2
+ },
+ {
+ "key": "atk",
+ "value": 11.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 63
+ },
+ "score": 9.333333333333334
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "def_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 239.0
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.0
+ },
+ {
+ "key": "critRate_",
+ "value": 2.7
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 45
+ },
+ "score": 22.962962962962965
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critDMG_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "atk_",
+ "value": 8.2
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 24
+ },
+ "score": 28.72727272727273
+ }
+ ],
+ "er_info": {
+ "total_er": 126.6,
+ "meets_requirement": true,
+ "requirement_type": "100-110%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 2,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "plume": {
+ "total_available": 3,
+ "suitable_main_stats": 3,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 6,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "enerRech_",
+ "hp_",
+ "def_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "def_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": true
+ },
+ "goblet": {
+ "total_available": 6,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "hp_",
+ "dendro_dmg_",
+ "def_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "def_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 6,
+ "suitable_main_stats": 4,
+ "main_stats_found": [
+ "critRate_",
+ "heal_",
+ "def_",
+ "hp_",
+ "critDMG_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_",
+ "critDMG_",
+ "def_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ },
+ "Furina": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 16,
+ "substats": [
+ {
+ "key": "def_",
+ "value": 5.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 14.0
+ },
+ {
+ "key": "hp_",
+ "value": 16.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 11.7
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 7
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "def",
+ "value": 16.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 13.2
+ },
+ {
+ "key": "hp",
+ "value": 209.0
+ },
+ {
+ "key": "hp_",
+ "value": 9.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 19
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "enerRech_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 58.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "critRate_",
+ "value": 6.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 2
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "hp_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 269.0
+ },
+ {
+ "key": "eleMas",
+ "value": 16.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 4.5
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 44
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "def",
+ "value": 19.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 23
+ }
+ ],
+ "average_score": 43.54227994227993,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 16,
+ "substats": [
+ {
+ "key": "def_",
+ "value": 5.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 14.0
+ },
+ {
+ "key": "hp_",
+ "value": 16.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 11.7
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 7
+ },
+ "score": 87.1178451178451
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "def",
+ "value": 16.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 13.2
+ },
+ {
+ "key": "hp",
+ "value": 209.0
+ },
+ {
+ "key": "hp_",
+ "value": 9.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 19
+ },
+ "score": 49.76190476190475
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "enerRech_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 58.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "critRate_",
+ "value": 6.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 2
+ },
+ "score": 31.026455026455025
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "hp_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 269.0
+ },
+ {
+ "key": "eleMas",
+ "value": 16.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 4.5
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 44
+ },
+ "score": 13.360750360750362
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "def",
+ "value": 19.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 23
+ },
+ "score": 36.44444444444444
+ }
+ ],
+ "er_info": {
+ "total_er": 168.0,
+ "meets_requirement": false,
+ "requirement_type": "180-200%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 1,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "plume": {
+ "total_available": 2,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 4,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "enerRech_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "enerRech_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "goblet": {
+ "total_available": 5,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "hp_",
+ "dendro_dmg_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "hp_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 5,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "critRate_",
+ "hp_",
+ "def_",
+ "heal_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ },
+ "Escoffier": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 4,
+ "mainStatKey": "hp",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk",
+ "value": 11.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 60
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 0,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 299.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "def",
+ "value": 16.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 53
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "eleMas",
+ "value": 44.0
+ },
+ {
+ "key": "atk",
+ "value": 14.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 11.7
+ },
+ {
+ "key": "critDMG_",
+ "value": 6.2
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 21
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "critRate_",
+ "value": 7.0
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 22
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "def_",
+ "value": 5.8
+ },
+ {
+ "key": "atk",
+ "value": 18.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.0
+ },
+ {
+ "key": "hp_",
+ "value": 4.7
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 48
+ }
+ ],
+ "average_score": 23.423569023569023,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 4,
+ "mainStatKey": "hp",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk",
+ "value": 11.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 60
+ },
+ "score": 10.444444444444445
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 0,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 299.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "def",
+ "value": 16.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 53
+ },
+ "score": 22.161616161616163
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "eleMas",
+ "value": 44.0
+ },
+ {
+ "key": "atk",
+ "value": 14.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 11.7
+ },
+ {
+ "key": "critDMG_",
+ "value": 6.2
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 21
+ },
+ "score": 35.117845117845114
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "critRate_",
+ "value": 7.0
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 22
+ },
+ "score": 36.43097643097643
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "def_",
+ "value": 5.8
+ },
+ {
+ "key": "atk",
+ "value": 18.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.0
+ },
+ {
+ "key": "hp_",
+ "value": 4.7
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 48
+ },
+ "score": 12.962962962962965
+ }
+ ],
+ "er_info": {
+ "total_er": 122.7,
+ "meets_requirement": false,
+ "requirement_type": "180-200%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 1,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": true
+ },
+ "plume": {
+ "total_available": 1,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 3,
+ "suitable_main_stats": 3,
+ "main_stats_found": [
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "atk_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "goblet": {
+ "total_available": 4,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "hp_",
+ "dendro_dmg_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "atk_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 4,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "critRate_",
+ "hp_",
+ "def_",
+ "heal_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ }
+ },
+ "Support Priority": {
+ "Furina": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 16,
+ "substats": [
+ {
+ "key": "def_",
+ "value": 5.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 14.0
+ },
+ {
+ "key": "hp_",
+ "value": 16.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 11.7
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 7
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ },
+ {
+ "key": "critRate_",
+ "value": 3.5
+ },
+ {
+ "key": "def",
+ "value": 65.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 8
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "enerRech_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 58.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "critRate_",
+ "value": 6.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 2
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "hp_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 269.0
+ },
+ {
+ "key": "eleMas",
+ "value": 16.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 4.5
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 44
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "def",
+ "value": 19.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 23
+ }
+ ],
+ "average_score": 44.041077441077434,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 16,
+ "substats": [
+ {
+ "key": "def_",
+ "value": 5.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 14.0
+ },
+ {
+ "key": "hp_",
+ "value": 16.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 11.7
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 7
+ },
+ "score": 87.1178451178451
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ },
+ {
+ "key": "critRate_",
+ "value": 3.5
+ },
+ {
+ "key": "def",
+ "value": 65.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 8
+ },
+ "score": 52.255892255892256
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "enerRech_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 58.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "critRate_",
+ "value": 6.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 2
+ },
+ "score": 31.026455026455025
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "hp_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 269.0
+ },
+ {
+ "key": "eleMas",
+ "value": 16.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 4.5
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 44
+ },
+ "score": 13.360750360750362
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "def",
+ "value": 19.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 23
+ },
+ "score": 36.44444444444444
+ }
+ ],
+ "er_info": {
+ "total_er": 180.3,
+ "meets_requirement": true,
+ "requirement_type": "180-200%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 3,
+ "suitable_main_stats": 3,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "plume": {
+ "total_available": 4,
+ "suitable_main_stats": 4,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 5,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "enerRech_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "enerRech_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "goblet": {
+ "total_available": 7,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "atk_",
+ "def_",
+ "hp_",
+ "dendro_dmg_",
+ "physical_dmg_"
+ ],
+ "suitable_main_stats_found": [
+ "hp_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 7,
+ "suitable_main_stats": 4,
+ "main_stats_found": [
+ "critRate_",
+ "heal_",
+ "def_",
+ "hp_",
+ "critDMG_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_",
+ "critDMG_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ },
+ "Escoffier": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "eleMas",
+ "value": 19.0
+ },
+ {
+ "key": "atk_",
+ "value": 14.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 23.3
+ },
+ {
+ "key": "hp_",
+ "value": 5.8
+ }
+ ],
+ "location": "Fischl",
+ "lock": true,
+ "id": 0
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 17.5
+ },
+ {
+ "key": "atk_",
+ "value": 9.9
+ },
+ {
+ "key": "def_",
+ "value": 7.3
+ },
+ {
+ "key": "eleMas",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 18
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "critRate_",
+ "value": 6.6
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 9
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "critRate_",
+ "value": 7.0
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 22
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critDMG_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "atk_",
+ "value": 8.2
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 24
+ }
+ ],
+ "average_score": 52.88619528619529,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "eleMas",
+ "value": 19.0
+ },
+ {
+ "key": "atk_",
+ "value": 14.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 23.3
+ },
+ {
+ "key": "hp_",
+ "value": 5.8
+ }
+ ],
+ "location": "Fischl",
+ "lock": true,
+ "id": 0
+ },
+ "score": 78.18181818181817
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 17.5
+ },
+ {
+ "key": "atk_",
+ "value": 9.9
+ },
+ {
+ "key": "def_",
+ "value": 7.3
+ },
+ {
+ "key": "eleMas",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 18
+ },
+ "score": 57.35353535353536
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "critRate_",
+ "value": 6.6
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 9
+ },
+ "score": 63.73737373737374
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "critRate_",
+ "value": 7.0
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 22
+ },
+ "score": 36.43097643097643
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critDMG_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "atk_",
+ "value": 8.2
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 24
+ },
+ "score": 28.72727272727273
+ }
+ ],
+ "er_info": {
+ "total_er": 163.5,
+ "meets_requirement": false,
+ "requirement_type": "180-200%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 2,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "plume": {
+ "total_available": 3,
+ "suitable_main_stats": 3,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 4,
+ "suitable_main_stats": 4,
+ "main_stats_found": [
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "atk_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "goblet": {
+ "total_available": 6,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "atk_",
+ "def_",
+ "hp_",
+ "dendro_dmg_",
+ "physical_dmg_"
+ ],
+ "suitable_main_stats_found": [
+ "atk_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 6,
+ "suitable_main_stats": 3,
+ "main_stats_found": [
+ "critRate_",
+ "heal_",
+ "def_",
+ "hp_",
+ "critDMG_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_",
+ "critDMG_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ },
+ "Fischl": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 9.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 12.4
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "atk_",
+ "value": 11.7
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 1
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "def",
+ "value": 16.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 13.2
+ },
+ {
+ "key": "hp",
+ "value": 209.0
+ },
+ {
+ "key": "hp_",
+ "value": 9.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 19
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "eleMas",
+ "value": 44.0
+ },
+ {
+ "key": "atk",
+ "value": 14.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 11.7
+ },
+ {
+ "key": "critDMG_",
+ "value": 6.2
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 21
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "physical_dmg_",
+ "level": 11,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "atk",
+ "value": 18.0
+ },
+ {
+ "key": "atk_",
+ "value": 10.5
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 30
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 44.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 15.5
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "def_",
+ "value": 13.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 3
+ }
+ ],
+ "average_score": 38.132659932659934,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 9.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 12.4
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "atk_",
+ "value": 11.7
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 1
+ },
+ "score": 67.34680134680136
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "def",
+ "value": 16.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 13.2
+ },
+ {
+ "key": "hp",
+ "value": 209.0
+ },
+ {
+ "key": "hp_",
+ "value": 9.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 19
+ },
+ "score": 24.44444444444444
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "eleMas",
+ "value": 44.0
+ },
+ {
+ "key": "atk",
+ "value": 14.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 11.7
+ },
+ {
+ "key": "critDMG_",
+ "value": 6.2
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 21
+ },
+ "score": 35.117845117845114
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "physical_dmg_",
+ "level": 11,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "atk",
+ "value": 18.0
+ },
+ {
+ "key": "atk_",
+ "value": 10.5
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 30
+ },
+ "score": 35.05050505050505
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 44.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 15.5
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "def_",
+ "value": 13.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 3
+ },
+ "score": 28.703703703703702
+ }
+ ],
+ "er_info": {
+ "total_er": 126.6,
+ "meets_requirement": true,
+ "requirement_type": "off_field_every_rotation: 120-140%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 1,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "plume": {
+ "total_available": 2,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 3,
+ "suitable_main_stats": 3,
+ "main_stats_found": [
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "atk_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "goblet": {
+ "total_available": 5,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "atk_",
+ "def_",
+ "hp_",
+ "dendro_dmg_",
+ "physical_dmg_"
+ ],
+ "suitable_main_stats_found": [
+ "physical_dmg_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 5,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "critRate_",
+ "hp_",
+ "def_",
+ "heal_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ },
+ "Chiori": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 4,
+ "mainStatKey": "hp",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk",
+ "value": 11.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 60
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 0,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 299.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "def",
+ "value": 16.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 53
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 4,
+ "mainStatKey": "def_",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk_",
+ "value": 4.2
+ },
+ {
+ "key": "atk",
+ "value": 11.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 63
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "def_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 239.0
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.0
+ },
+ {
+ "key": "critRate_",
+ "value": 2.7
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 45
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "def_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 299.0
+ },
+ {
+ "key": "atk",
+ "value": 19.0
+ },
+ {
+ "key": "critRate_",
+ "value": 7.0
+ },
+ {
+ "key": "eleMas",
+ "value": 19.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 47
+ }
+ ],
+ "average_score": 18.16565656565657,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 4,
+ "mainStatKey": "hp",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk",
+ "value": 11.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 60
+ },
+ "score": 10.444444444444445
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 0,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 299.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "def",
+ "value": 16.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 53
+ },
+ "score": 22.161616161616163
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 4,
+ "mainStatKey": "def_",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk_",
+ "value": 4.2
+ },
+ {
+ "key": "atk",
+ "value": 11.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 63
+ },
+ "score": 9.333333333333334
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "def_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 239.0
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.0
+ },
+ {
+ "key": "critRate_",
+ "value": 2.7
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 45
+ },
+ "score": 22.962962962962965
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "def_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 299.0
+ },
+ {
+ "key": "atk",
+ "value": 19.0
+ },
+ {
+ "key": "critRate_",
+ "value": 7.0
+ },
+ {
+ "key": "eleMas",
+ "value": 19.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 47
+ },
+ "score": 25.92592592592593
+ }
+ ],
+ "er_info": {
+ "total_er": 105.8,
+ "meets_requirement": true,
+ "requirement_type": "100-110%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 1,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": true
+ },
+ "plume": {
+ "total_available": 1,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 4,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "hp_",
+ "def_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "def_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": true
+ },
+ "goblet": {
+ "total_available": 4,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "hp_",
+ "dendro_dmg_",
+ "def_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "def_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 4,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "critRate_",
+ "hp_",
+ "def_",
+ "heal_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_",
+ "def_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ }
+ },
+ "ER Demanding First": {
+ "Escoffier": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "eleMas",
+ "value": 19.0
+ },
+ {
+ "key": "atk_",
+ "value": 14.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 23.3
+ },
+ {
+ "key": "hp_",
+ "value": 5.8
+ }
+ ],
+ "location": "Fischl",
+ "lock": true,
+ "id": 0
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 17.5
+ },
+ {
+ "key": "atk_",
+ "value": 9.9
+ },
+ {
+ "key": "def_",
+ "value": 7.3
+ },
+ {
+ "key": "eleMas",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 18
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "enerRech_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 58.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "critRate_",
+ "value": 6.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 2
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "critRate_",
+ "value": 7.0
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 22
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critDMG_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "atk_",
+ "value": 8.2
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 24
+ }
+ ],
+ "average_score": 46.82020202020202,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "eleMas",
+ "value": 19.0
+ },
+ {
+ "key": "atk_",
+ "value": 14.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 23.3
+ },
+ {
+ "key": "hp_",
+ "value": 5.8
+ }
+ ],
+ "location": "Fischl",
+ "lock": true,
+ "id": 0
+ },
+ "score": 78.18181818181817
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 17.5
+ },
+ {
+ "key": "atk_",
+ "value": 9.9
+ },
+ {
+ "key": "def_",
+ "value": 7.3
+ },
+ {
+ "key": "eleMas",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 18
+ },
+ "score": 57.35353535353536
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "enerRech_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 58.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "critRate_",
+ "value": 6.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 2
+ },
+ "score": 33.407407407407405
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "critRate_",
+ "value": 7.0
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 22
+ },
+ "score": 36.43097643097643
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critDMG_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "atk_",
+ "value": 8.2
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 24
+ },
+ "score": 28.72727272727273
+ }
+ ],
+ "er_info": {
+ "total_er": 203.0,
+ "meets_requirement": true,
+ "requirement_type": "180-200%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 3,
+ "suitable_main_stats": 3,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "plume": {
+ "total_available": 4,
+ "suitable_main_stats": 4,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 5,
+ "suitable_main_stats": 5,
+ "main_stats_found": [
+ "enerRech_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "enerRech_",
+ "atk_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "goblet": {
+ "total_available": 7,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "atk_",
+ "def_",
+ "hp_",
+ "dendro_dmg_",
+ "physical_dmg_"
+ ],
+ "suitable_main_stats_found": [
+ "atk_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 7,
+ "suitable_main_stats": 4,
+ "main_stats_found": [
+ "critRate_",
+ "heal_",
+ "def_",
+ "hp_",
+ "critDMG_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_",
+ "critDMG_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ },
+ "Furina": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 16,
+ "substats": [
+ {
+ "key": "def_",
+ "value": 5.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 14.0
+ },
+ {
+ "key": "hp_",
+ "value": 16.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 11.7
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 7
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ },
+ {
+ "key": "critRate_",
+ "value": 3.5
+ },
+ {
+ "key": "def",
+ "value": 65.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 8
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 4,
+ "mainStatKey": "hp_",
+ "level": 0,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 6.2
+ },
+ {
+ "key": "def",
+ "value": 19.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 62
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "hp_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 269.0
+ },
+ {
+ "key": "eleMas",
+ "value": 16.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 4.5
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 44
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "def",
+ "value": 19.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 23
+ }
+ ],
+ "average_score": 40.132082732082736,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 16,
+ "substats": [
+ {
+ "key": "def_",
+ "value": 5.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 14.0
+ },
+ {
+ "key": "hp_",
+ "value": 16.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 11.7
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 7
+ },
+ "score": 87.1178451178451
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ },
+ {
+ "key": "critRate_",
+ "value": 3.5
+ },
+ {
+ "key": "def",
+ "value": 65.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 8
+ },
+ "score": 52.255892255892256
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 4,
+ "mainStatKey": "hp_",
+ "level": 0,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 6.2
+ },
+ {
+ "key": "def",
+ "value": 19.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 62
+ },
+ "score": 11.481481481481483
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "hp_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 269.0
+ },
+ {
+ "key": "eleMas",
+ "value": 16.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 4.5
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 44
+ },
+ "score": 13.360750360750362
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "def",
+ "value": 19.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 23
+ },
+ "score": 36.44444444444444
+ }
+ ],
+ "er_info": {
+ "total_er": 128.5,
+ "meets_requirement": false,
+ "requirement_type": "180-200%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 2,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "plume": {
+ "total_available": 3,
+ "suitable_main_stats": 3,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 6,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "hp_",
+ "def_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "hp_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": true
+ },
+ "goblet": {
+ "total_available": 6,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "atk_",
+ "def_",
+ "hp_",
+ "dendro_dmg_",
+ "physical_dmg_"
+ ],
+ "suitable_main_stats_found": [
+ "hp_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 6,
+ "suitable_main_stats": 3,
+ "main_stats_found": [
+ "critRate_",
+ "hp_",
+ "def_",
+ "heal_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ },
+ "Fischl": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 9.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 12.4
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "atk_",
+ "value": 11.7
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 1
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "def",
+ "value": 16.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 13.2
+ },
+ {
+ "key": "hp",
+ "value": 209.0
+ },
+ {
+ "key": "hp_",
+ "value": 9.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 19
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "critRate_",
+ "value": 6.6
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 9
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "physical_dmg_",
+ "level": 11,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "atk",
+ "value": 18.0
+ },
+ {
+ "key": "atk_",
+ "value": 10.5
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 30
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 44.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 15.5
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "def_",
+ "value": 13.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 3
+ }
+ ],
+ "average_score": 43.85656565656566,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 9.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 12.4
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "atk_",
+ "value": 11.7
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 1
+ },
+ "score": 67.34680134680136
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "def",
+ "value": 16.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 13.2
+ },
+ {
+ "key": "hp",
+ "value": 209.0
+ },
+ {
+ "key": "hp_",
+ "value": 9.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 19
+ },
+ "score": 24.44444444444444
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "critRate_",
+ "value": 6.6
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 9
+ },
+ "score": 63.73737373737374
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "physical_dmg_",
+ "level": 11,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "atk",
+ "value": 18.0
+ },
+ {
+ "key": "atk_",
+ "value": 10.5
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 30
+ },
+ "score": 35.05050505050505
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 44.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 15.5
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "def_",
+ "value": 13.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 3
+ },
+ "score": 28.703703703703702
+ }
+ ],
+ "er_info": {
+ "total_er": 127.19999999999999,
+ "meets_requirement": true,
+ "requirement_type": "off_field_every_rotation: 120-140%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 1,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "plume": {
+ "total_available": 2,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 4,
+ "suitable_main_stats": 4,
+ "main_stats_found": [
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "atk_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "goblet": {
+ "total_available": 5,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "atk_",
+ "def_",
+ "hp_",
+ "dendro_dmg_",
+ "physical_dmg_"
+ ],
+ "suitable_main_stats_found": [
+ "physical_dmg_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 5,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "critRate_",
+ "hp_",
+ "def_",
+ "heal_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ },
+ "Chiori": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 4,
+ "mainStatKey": "hp",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk",
+ "value": 11.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 60
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 0,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 299.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "def",
+ "value": 16.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 53
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 4,
+ "mainStatKey": "def_",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk_",
+ "value": 4.2
+ },
+ {
+ "key": "atk",
+ "value": 11.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 63
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "def_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 239.0
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.0
+ },
+ {
+ "key": "critRate_",
+ "value": 2.7
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 45
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "def_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 299.0
+ },
+ {
+ "key": "atk",
+ "value": 19.0
+ },
+ {
+ "key": "critRate_",
+ "value": 7.0
+ },
+ {
+ "key": "eleMas",
+ "value": 19.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 47
+ }
+ ],
+ "average_score": 18.16565656565657,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 4,
+ "mainStatKey": "hp",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk",
+ "value": 11.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 60
+ },
+ "score": 10.444444444444445
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 0,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 299.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "def",
+ "value": 16.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 53
+ },
+ "score": 22.161616161616163
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 4,
+ "mainStatKey": "def_",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk_",
+ "value": 4.2
+ },
+ {
+ "key": "atk",
+ "value": 11.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 63
+ },
+ "score": 9.333333333333334
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "def_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 239.0
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.0
+ },
+ {
+ "key": "critRate_",
+ "value": 2.7
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 45
+ },
+ "score": 22.962962962962965
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "def_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 299.0
+ },
+ {
+ "key": "atk",
+ "value": 19.0
+ },
+ {
+ "key": "critRate_",
+ "value": 7.0
+ },
+ {
+ "key": "eleMas",
+ "value": 19.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 47
+ },
+ "score": 25.92592592592593
+ }
+ ],
+ "er_info": {
+ "total_er": 105.8,
+ "meets_requirement": true,
+ "requirement_type": "100-110%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 1,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": true
+ },
+ "plume": {
+ "total_available": 1,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 4,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "def_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "def_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": true
+ },
+ "goblet": {
+ "total_available": 4,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "hp_",
+ "dendro_dmg_",
+ "def_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "def_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 4,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "critRate_",
+ "hp_",
+ "def_",
+ "heal_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_",
+ "def_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ }
+ },
+ "Reverse Order": {
+ "Chiori": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 9.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 12.4
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "atk_",
+ "value": 11.7
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 1
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 17.5
+ },
+ {
+ "key": "atk_",
+ "value": 9.9
+ },
+ {
+ "key": "def_",
+ "value": 7.3
+ },
+ {
+ "key": "eleMas",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 18
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 4,
+ "mainStatKey": "def_",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk_",
+ "value": 4.2
+ },
+ {
+ "key": "atk",
+ "value": 11.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 63
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "def_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 239.0
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.0
+ },
+ {
+ "key": "critRate_",
+ "value": 2.7
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 45
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 44.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 15.5
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "def_",
+ "value": 13.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 3
+ }
+ ],
+ "average_score": 44.991919191919195,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 9.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 12.4
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "atk_",
+ "value": 11.7
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 1
+ },
+ "score": 67.34680134680136
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 17.5
+ },
+ {
+ "key": "atk_",
+ "value": 9.9
+ },
+ {
+ "key": "def_",
+ "value": 7.3
+ },
+ {
+ "key": "eleMas",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 18
+ },
+ "score": 70.87205387205387
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 4,
+ "mainStatKey": "def_",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk_",
+ "value": 4.2
+ },
+ {
+ "key": "atk",
+ "value": 11.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 63
+ },
+ "score": 9.333333333333334
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "def_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 239.0
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.0
+ },
+ {
+ "key": "critRate_",
+ "value": 2.7
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 45
+ },
+ "score": 22.962962962962965
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 44.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 15.5
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "def_",
+ "value": 13.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 3
+ },
+ "score": 54.44444444444445
+ }
+ ],
+ "er_info": {
+ "total_er": 126.6,
+ "meets_requirement": true,
+ "requirement_type": "100-110%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 3,
+ "suitable_main_stats": 3,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "plume": {
+ "total_available": 4,
+ "suitable_main_stats": 4,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 7,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "enerRech_",
+ "hp_",
+ "def_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "def_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": true
+ },
+ "goblet": {
+ "total_available": 7,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "atk_",
+ "def_",
+ "hp_",
+ "dendro_dmg_",
+ "physical_dmg_"
+ ],
+ "suitable_main_stats_found": [
+ "def_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 7,
+ "suitable_main_stats": 5,
+ "main_stats_found": [
+ "critRate_",
+ "heal_",
+ "def_",
+ "hp_",
+ "critDMG_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_",
+ "critDMG_",
+ "def_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ },
+ "Fischl": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "eleMas",
+ "value": 19.0
+ },
+ {
+ "key": "atk_",
+ "value": 14.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 23.3
+ },
+ {
+ "key": "hp_",
+ "value": 5.8
+ }
+ ],
+ "location": "Fischl",
+ "lock": true,
+ "id": 0
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ },
+ {
+ "key": "critRate_",
+ "value": 3.5
+ },
+ {
+ "key": "def",
+ "value": 65.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 8
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "critRate_",
+ "value": 6.6
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 9
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "physical_dmg_",
+ "level": 11,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "atk",
+ "value": 18.0
+ },
+ {
+ "key": "atk_",
+ "value": 10.5
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 30
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critDMG_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "atk_",
+ "value": 8.2
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 24
+ }
+ ],
+ "average_score": 51.59057239057239,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 20,
+ "substats": [
+ {
+ "key": "eleMas",
+ "value": 19.0
+ },
+ {
+ "key": "atk_",
+ "value": 14.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 23.3
+ },
+ {
+ "key": "hp_",
+ "value": 5.8
+ }
+ ],
+ "location": "Fischl",
+ "lock": true,
+ "id": 0
+ },
+ "score": 78.18181818181817
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ },
+ {
+ "key": "critRate_",
+ "value": 3.5
+ },
+ {
+ "key": "def",
+ "value": 65.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 8
+ },
+ "score": 52.255892255892256
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 16,
+ "substats": [
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "hp",
+ "value": 448.0
+ },
+ {
+ "key": "critRate_",
+ "value": 6.6
+ },
+ {
+ "key": "enerRech_",
+ "value": 12.3
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 9
+ },
+ "score": 63.73737373737374
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "physical_dmg_",
+ "level": 11,
+ "substats": [
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "atk",
+ "value": 18.0
+ },
+ {
+ "key": "atk_",
+ "value": 10.5
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 30
+ },
+ "score": 35.05050505050505
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critDMG_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "atk_",
+ "value": 8.2
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 24
+ },
+ "score": 28.72727272727273
+ }
+ ],
+ "er_info": {
+ "total_er": 158.9,
+ "meets_requirement": true,
+ "requirement_type": "off_field_every_rotation: 120-140%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 2,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "plume": {
+ "total_available": 3,
+ "suitable_main_stats": 3,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 5,
+ "suitable_main_stats": 4,
+ "main_stats_found": [
+ "enerRech_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "atk_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "goblet": {
+ "total_available": 6,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "hp_",
+ "dendro_dmg_",
+ "physical_dmg_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "physical_dmg_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 6,
+ "suitable_main_stats": 3,
+ "main_stats_found": [
+ "critRate_",
+ "heal_",
+ "def_",
+ "hp_",
+ "critDMG_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_",
+ "critDMG_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ },
+ "Escoffier": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 16,
+ "substats": [
+ {
+ "key": "def_",
+ "value": 5.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 14.0
+ },
+ {
+ "key": "hp_",
+ "value": 16.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 11.7
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 7
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "def",
+ "value": 16.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 13.2
+ },
+ {
+ "key": "hp",
+ "value": 209.0
+ },
+ {
+ "key": "hp_",
+ "value": 9.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 19
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "eleMas",
+ "value": 44.0
+ },
+ {
+ "key": "atk",
+ "value": 14.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 11.7
+ },
+ {
+ "key": "critDMG_",
+ "value": 6.2
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 21
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "critRate_",
+ "value": 7.0
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 22
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "def",
+ "value": 19.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 23
+ }
+ ],
+ "average_score": 32.0,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 5,
+ "mainStatKey": "hp",
+ "level": 16,
+ "substats": [
+ {
+ "key": "def_",
+ "value": 5.1
+ },
+ {
+ "key": "critDMG_",
+ "value": 14.0
+ },
+ {
+ "key": "hp_",
+ "value": 16.9
+ },
+ {
+ "key": "enerRech_",
+ "value": 11.7
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 7
+ },
+ "score": 49.562289562289564
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 12,
+ "substats": [
+ {
+ "key": "def",
+ "value": 16.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 13.2
+ },
+ {
+ "key": "hp",
+ "value": 209.0
+ },
+ {
+ "key": "hp_",
+ "value": 9.9
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 19
+ },
+ "score": 24.44444444444444
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "eleMas",
+ "value": 44.0
+ },
+ {
+ "key": "atk",
+ "value": 14.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 11.7
+ },
+ {
+ "key": "critDMG_",
+ "value": 6.2
+ }
+ ],
+ "location": "Escoffier",
+ "lock": true,
+ "id": 21
+ },
+ "score": 35.117845117845114
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "atk_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "critRate_",
+ "value": 7.0
+ },
+ {
+ "key": "hp_",
+ "value": 5.3
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 22
+ },
+ "score": 36.43097643097643
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 12,
+ "substats": [
+ {
+ "key": "hp_",
+ "value": 9.9
+ },
+ {
+ "key": "atk",
+ "value": 37.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.8
+ },
+ {
+ "key": "def",
+ "value": 19.0
+ }
+ ],
+ "location": "Furina",
+ "lock": true,
+ "id": 23
+ },
+ "score": 14.444444444444446
+ }
+ ],
+ "er_info": {
+ "total_er": 128.6,
+ "meets_requirement": false,
+ "requirement_type": "180-200%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 1,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "plume": {
+ "total_available": 2,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 4,
+ "suitable_main_stats": 4,
+ "main_stats_found": [
+ "enerRech_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "enerRech_",
+ "atk_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "goblet": {
+ "total_available": 5,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "hp_",
+ "dendro_dmg_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "atk_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 5,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "critRate_",
+ "hp_",
+ "def_",
+ "heal_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ },
+ "Furina": {
+ "build": [
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 4,
+ "mainStatKey": "hp",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk",
+ "value": 11.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 60
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 0,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 299.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "def",
+ "value": 16.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 53
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "enerRech_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 58.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "critRate_",
+ "value": 6.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 2
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "hp_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 269.0
+ },
+ {
+ "key": "eleMas",
+ "value": 16.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 4.5
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 44
+ },
+ {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "def_",
+ "value": 5.8
+ },
+ {
+ "key": "atk",
+ "value": 18.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.0
+ },
+ {
+ "key": "hp_",
+ "value": 4.7
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 48
+ }
+ ],
+ "average_score": 16.851563251563256,
+ "artifact_scores": [
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "flower",
+ "rarity": 4,
+ "mainStatKey": "hp",
+ "level": 0,
+ "substats": [
+ {
+ "key": "atk",
+ "value": 11.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 60
+ },
+ "score": 0.0
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "plume",
+ "rarity": 5,
+ "mainStatKey": "atk",
+ "level": 0,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 299.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "enerRech_",
+ "value": 5.8
+ },
+ {
+ "key": "def",
+ "value": 16.0
+ }
+ ],
+ "location": "",
+ "lock": false,
+ "id": 53
+ },
+ "score": 16.463203463203463
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "sands",
+ "rarity": 5,
+ "mainStatKey": "enerRech_",
+ "level": 20,
+ "substats": [
+ {
+ "key": "def",
+ "value": 58.0
+ },
+ {
+ "key": "atk_",
+ "value": 4.7
+ },
+ {
+ "key": "critRate_",
+ "value": 6.2
+ },
+ {
+ "key": "hp",
+ "value": 508.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 2
+ },
+ "score": 31.026455026455025
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "goblet",
+ "rarity": 5,
+ "mainStatKey": "hp_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "hp",
+ "value": 269.0
+ },
+ {
+ "key": "eleMas",
+ "value": 16.0
+ },
+ {
+ "key": "enerRech_",
+ "value": 4.5
+ },
+ {
+ "key": "def",
+ "value": 21.0
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 44
+ },
+ "score": 13.360750360750362
+ },
+ {
+ "artifact": {
+ "setKey": "GoldenTroupe",
+ "slotKey": "circlet",
+ "rarity": 5,
+ "mainStatKey": "critRate_",
+ "level": 4,
+ "substats": [
+ {
+ "key": "def_",
+ "value": 5.8
+ },
+ {
+ "key": "atk",
+ "value": 18.0
+ },
+ {
+ "key": "critDMG_",
+ "value": 7.0
+ },
+ {
+ "key": "hp_",
+ "value": 4.7
+ }
+ ],
+ "location": "",
+ "lock": true,
+ "id": 48
+ },
+ "score": 23.407407407407412
+ }
+ ],
+ "er_info": {
+ "total_er": 162.1,
+ "meets_requirement": false,
+ "requirement_type": "180-200%"
+ },
+ "debug_info": {
+ "flower": {
+ "total_available": 1,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "hp"
+ ],
+ "suitable_main_stats_found": [
+ "hp"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": true
+ },
+ "plume": {
+ "total_available": 1,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "atk"
+ ],
+ "suitable_main_stats_found": [
+ "atk"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "sands": {
+ "total_available": 3,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "enerRech_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "enerRech_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "goblet": {
+ "total_available": 4,
+ "suitable_main_stats": 2,
+ "main_stats_found": [
+ "hp_",
+ "dendro_dmg_",
+ "atk_"
+ ],
+ "suitable_main_stats_found": [
+ "hp_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ },
+ "circlet": {
+ "total_available": 4,
+ "suitable_main_stats": 1,
+ "main_stats_found": [
+ "critRate_",
+ "hp_",
+ "def_",
+ "heal_"
+ ],
+ "suitable_main_stats_found": [
+ "critRate_"
+ ],
+ "sets_found": [
+ "GoldenTroupe"
+ ],
+ "required_sets": [
+ "GoldenTroupe"
+ ],
+ "used_4star_fallback": false
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/interactive_optimizer.py b/interactive_optimizer.py
new file mode 100644
index 0000000..24b63ed
--- /dev/null
+++ b/interactive_optimizer.py
@@ -0,0 +1,340 @@
+import json
+import sys
+from typing import Dict, List, Tuple, Optional
+from artifact_optimizer import ArtifactOptimizer
+
+class InteractiveArtifactOptimizer:
+ def __init__(self):
+ self.optimizer = ArtifactOptimizer()
+ self.available_characters = []
+
+ def load_data(self):
+ """Load artifact and character data"""
+ try:
+ self.optimizer.load_data('data.json', 'characters.json')
+ self.available_characters = list(self.optimizer.character_data.keys())
+ print("āœ… Data loaded successfully!")
+ print(f"šŸ“¦ Total artifacts: {len(self.optimizer.artifacts)}")
+ print(f"šŸ‘„ Available characters: {len(self.available_characters)}")
+ return True
+ except FileNotFoundError as e:
+ print(f"āŒ Error loading data: {e}")
+ print("Make sure 'data.json' and 'characters.json' are in the current directory.")
+ return False
+ except Exception as e:
+ print(f"āŒ Unexpected error: {e}")
+ return False
+
+ def display_character_info(self, character: str):
+ """Display detailed character information"""
+ char_data = self.optimizer.character_data.get(character, {})
+
+ print(f"\n{'='*50}")
+ print(f"CHARACTER INFO: {character}")
+ print(f"{'='*50}")
+
+ # ER Requirements
+ er_req = char_data.get('er_requirement', {})
+ print("šŸ”‹ Energy Recharge Requirements:")
+ if isinstance(er_req, dict) and 'min' in er_req:
+ print(f" {er_req['min']}-{er_req.get('max', er_req['min'])}%")
+ elif isinstance(er_req, dict):
+ for scenario, req in er_req.items():
+ print(f" {scenario}: {req['min']}-{req['max']}%")
+ else:
+ print(" No specific requirement")
+
+ # Ideal Main Stats
+ ideal_stats = char_data.get('ideal_main_stats', {})
+ if ideal_stats:
+ print("\nšŸŽÆ Ideal Main Stats:")
+ for slot, stats in ideal_stats.items():
+ print(f" {slot.capitalize()}: {', '.join(stats)}")
+
+ # Substat Priority
+ substats = char_data.get('substat_priority', [])
+ if substats:
+ print(f"\nšŸ“Š Substat Priority: {' > '.join(substats)}")
+
+ # Notes
+ notes = char_data.get('notes', [])
+ if notes:
+ print(f"\nšŸ“ Notes:")
+ for note in notes:
+ print(f" • {note}")
+
+ def select_characters(self) -> List[str]:
+ """Interactive character selection"""
+ print(f"\n{'='*60}")
+ print("CHARACTER SELECTION")
+ print(f"{'='*60}")
+
+ print("Available characters:")
+ for i, char in enumerate(self.available_characters, 1):
+ print(f" {i}. {char}")
+
+ selected_chars = []
+
+ while True:
+ print(f"\nšŸ“‹ Current priority order: {' -> '.join(selected_chars) if selected_chars else '(none)'}")
+ print(f"šŸŽÆ Remaining characters: {len(self.available_characters) - len(selected_chars)}")
+
+ print("\nOptions:")
+ print(" • Enter character number to add to priority list")
+ print(" • Type character name directly")
+ print(" • 'info [character]' to view character details")
+ print(" • 'remove [position]' to remove from priority list")
+ print(" • 'done' to finish selection")
+ print(" • 'quit' to exit")
+
+ choice = input("\nāž¤ Your choice: ").strip()
+
+ if choice.lower() == 'quit':
+ sys.exit(0)
+ elif choice.lower() == 'done':
+ if selected_chars:
+ break
+ else:
+ print("āŒ Please select at least one character!")
+ continue
+
+ elif choice.startswith('info '):
+ char_name = choice[5:].strip()
+ if char_name in self.available_characters:
+ self.display_character_info(char_name)
+ else:
+ print(f"āŒ Character '{char_name}' not found!")
+
+ elif choice.startswith('remove '):
+ try:
+ pos = int(choice[7:].strip()) - 1
+ if 0 <= pos < len(selected_chars):
+ removed = selected_chars.pop(pos)
+ print(f"āœ… Removed {removed} from position {pos + 1}")
+ else:
+ print("āŒ Invalid position!")
+ except ValueError:
+ print("āŒ Invalid position number!")
+
+ elif choice.isdigit():
+ try:
+ char_index = int(choice) - 1
+ if 0 <= char_index < len(self.available_characters):
+ char = self.available_characters[char_index]
+ if char not in selected_chars:
+ selected_chars.append(char)
+ print(f"āœ… Added {char} to priority position {len(selected_chars)}")
+ else:
+ print(f"āš ļø {char} is already in the priority list!")
+ else:
+ print("āŒ Invalid character number!")
+ except ValueError:
+ print("āŒ Invalid input!")
+
+ elif choice in self.available_characters:
+ if choice not in selected_chars:
+ selected_chars.append(choice)
+ print(f"āœ… Added {choice} to priority position {len(selected_chars)}")
+ else:
+ print(f"āš ļø {choice} is already in the priority list!")
+
+ else:
+ print("āŒ Invalid choice! Try again.")
+
+ return selected_chars
+
+ def get_optimization_settings(self) -> Dict:
+ """Get optimization settings from user"""
+ print(f"\n{'='*60}")
+ print("OPTIMIZATION SETTINGS")
+ print(f"{'='*60}")
+
+ settings = {}
+
+ # Ask about 4-star fallback
+ while True:
+ use_4star = input("Allow 4-star artifacts as fallback? (y/n) [default: y]: ").strip().lower()
+ if use_4star in ['', 'y', 'yes']:
+ settings['allow_4star_fallback'] = True
+ break
+ elif use_4star in ['n', 'no']:
+ settings['allow_4star_fallback'] = False
+ break
+ else:
+ print("āŒ Please enter 'y' or 'n'")
+
+ # Ask about ER flexibility
+ while True:
+ try:
+ er_flexibility = input("ER requirement flexibility (%) [default: 20]: ").strip()
+ if er_flexibility == '':
+ settings['er_flexibility'] = 20
+ break
+ else:
+ settings['er_flexibility'] = float(er_flexibility)
+ break
+ except ValueError:
+ print("āŒ Please enter a valid number")
+
+ return settings
+
+ def run_optimization(self, character_priority: List[str], settings: Dict):
+ """Run the optimization process"""
+ print(f"\n{'='*60}")
+ print("RUNNING OPTIMIZATION")
+ print(f"{'='*60}")
+
+ print(f"šŸŽÆ Character priority: {' -> '.join(character_priority)}")
+ print(f"āš™ļø Settings: {settings}")
+ print("\nOptimizing...")
+
+ # Run optimization
+ results = self.optimizer.optimize_builds(character_priority)
+
+ # Display results
+ formatted_output = self.optimizer.format_results(results)
+ print(formatted_output)
+
+ # Save results
+ filename = 'interactive_optimization_results.txt'
+ with open(filename, 'w') as f:
+ f.write("INTERACTIVE ARTIFACT OPTIMIZATION RESULTS\n")
+ f.write("="*60 + "\n")
+ f.write(f"Character Priority: {' -> '.join(character_priority)}\n")
+ f.write(f"Settings: {settings}\n")
+ f.write("="*60 + "\n\n")
+ f.write(formatted_output)
+
+ print(f"\nšŸ’¾ Results saved to '{filename}'")
+
+ return results
+
+ def show_summary_stats(self, results: Dict):
+ """Show summary statistics"""
+ print(f"\n{'='*60}")
+ print("SUMMARY STATISTICS")
+ print(f"{'='*60}")
+
+ successful_builds = [data for data in results.values() if data['build'] is not None]
+
+ if successful_builds:
+ scores = [data['average_score'] for data in successful_builds]
+
+ print(f"šŸ“Š Build Quality Distribution:")
+ print(f" Best build: {max(scores):.1f}/100")
+ print(f" Worst build: {min(scores):.1f}/100")
+ print(f" Average: {sum(scores)/len(scores):.1f}/100")
+
+ # Quality tiers
+ tiers = {
+ 'God-like (88+)': len([s for s in scores if s >= 88]),
+ 'Insane (77+)': len([s for s in scores if 77 <= s < 88]),
+ 'Amazing (66+)': len([s for s in scores if 66 <= s < 77]),
+ 'Great (55+)': len([s for s in scores if 55 <= s < 66]),
+ 'Good (44+)': len([s for s in scores if 44 <= s < 55]),
+ 'Below 44': len([s for s in scores if s < 44])
+ }
+
+ print(f"\nšŸ† Quality Tiers:")
+ for tier, count in tiers.items():
+ if count > 0:
+ print(f" {tier}: {count} build(s)")
+
+ # ER compliance
+ er_compliant = sum(1 for data in results.values()
+ if data['build'] and data['er_info']['meets_requirement'])
+
+ print(f"\n⚔ Energy Recharge Compliance:")
+ print(f" Builds meeting ER requirements: {er_compliant}/{len(results)}")
+
+ def main_menu(self):
+ """Main interactive menu"""
+ print("="*60)
+ print("šŸŽ® INTERACTIVE GENSHIN ARTIFACT OPTIMIZER")
+ print("="*60)
+ print("Based on the artifact scoring system by Sevy")
+ print("Automates the optimization process for multiple characters")
+
+ if not self.load_data():
+ return
+
+ while True:
+ print(f"\n{'='*40}")
+ print("MAIN MENU")
+ print(f"{'='*40}")
+ print("1. Start Optimization")
+ print("2. View Character Info")
+ print("3. View Available Characters")
+ print("4. Exit")
+
+ choice = input("\nāž¤ Select option (1-4): ").strip()
+
+ if choice == '1':
+ # Start optimization process
+ character_priority = self.select_characters()
+ if character_priority:
+ settings = self.get_optimization_settings()
+ results = self.run_optimization(character_priority, settings)
+ self.show_summary_stats(results)
+
+ # Ask if user wants to try again
+ while True:
+ again = input("\nšŸ”„ Run another optimization? (y/n): ").strip().lower()
+ if again in ['y', 'yes']:
+ break
+ elif again in ['n', 'no']:
+ continue
+ else:
+ print("āŒ Please enter 'y' or 'n'")
+
+ if again in ['n', 'no']:
+ break
+
+ elif choice == '2':
+ # View character info
+ print("\nAvailable characters:")
+ for i, char in enumerate(self.available_characters, 1):
+ print(f" {i}. {char}")
+
+ char_choice = input("\nEnter character name or number: ").strip()
+
+ if char_choice.isdigit():
+ try:
+ char_index = int(char_choice) - 1
+ if 0 <= char_index < len(self.available_characters):
+ self.display_character_info(self.available_characters[char_index])
+ else:
+ print("āŒ Invalid character number!")
+ except ValueError:
+ print("āŒ Invalid input!")
+ elif char_choice in self.available_characters:
+ self.display_character_info(char_choice)
+ else:
+ print(f"āŒ Character '{char_choice}' not found!")
+
+ elif choice == '3':
+ # View available characters
+ print(f"\nšŸ“‹ Available Characters ({len(self.available_characters)}):")
+ for char in sorted(self.available_characters):
+ print(f" • {char}")
+
+ elif choice == '4':
+ print("\nšŸ‘‹ Thanks for using the Artifact Optimizer!")
+ break
+
+ else:
+ print("āŒ Invalid choice! Please select 1-4.")
+
+def main():
+ """Main entry point"""
+ optimizer = InteractiveArtifactOptimizer()
+ try:
+ optimizer.main_menu()
+ except KeyboardInterrupt:
+ print("\n\nšŸ‘‹ Optimization interrupted. Goodbye!")
+ except Exception as e:
+ print(f"\nāŒ An error occurred: {e}")
+ print("Please check your data files and try again.")
+
+if __name__ == "__main__":
+ main() \ No newline at end of file
diff --git a/optimization_results.txt b/optimization_results.txt
new file mode 100644
index 0000000..f540c19
--- /dev/null
+++ b/optimization_results.txt
@@ -0,0 +1,209 @@
+================================================================================
+ARTIFACT OPTIMIZATION RESULTS
+================================================================================
+
+==================== FURINA ====================
+šŸ“Š Average Artifact Score: 44.04/100
+āœ… Energy Recharge: 180.3% (180-200%)
+
+šŸ“‹ ARTIFACT BUILD:
+
+Flower (GoldenTroupe) - Level 16 ⭐⭐⭐⭐⭐
+ Main Stat: hp
+ Score: 87.12/100
+ Substats:
+ • def_: 5.1%
+ • critDMG_: 14.0%
+ • hp_: 16.9%
+ • enerRech_: 11.7%
+
+Feather (GoldenTroupe) - Level 16 ⭐⭐⭐⭐⭐
+ Main Stat: atk
+ Score: 52.26/100
+ Substats:
+ • critDMG_: 7.8%
+ • enerRech_: 12.3%
+ • critRate_: 3.5%
+ • def: 65
+
+Sands (GoldenTroupe) - Level 20 ⭐⭐⭐⭐⭐
+ Main Stat: enerRech_
+ Score: 31.03/100
+ Substats:
+ • def: 58
+ • atk_: 4.7%
+ • critRate_: 6.2%
+ • hp: 508
+
+Goblet (GoldenTroupe) - Level 4 ⭐⭐⭐⭐⭐
+ Main Stat: hp_
+ Score: 13.36/100
+ Substats:
+ • hp: 269
+ • eleMas: 16
+ • enerRech_: 4.5%
+ • def: 21
+
+Circlet (GoldenTroupe) - Level 12 ⭐⭐⭐⭐⭐
+ Main Stat: critRate_
+ Score: 36.44/100
+ Substats:
+ • hp_: 9.9%
+ • atk: 37
+ • critDMG_: 7.8%
+ • def: 19
+
+==================== ESCOFFIER ====================
+šŸ“Š Average Artifact Score: 52.89/100
+āš ļø Energy Recharge: 163.5% (180-200%)
+
+šŸ“‹ ARTIFACT BUILD:
+
+Flower (GoldenTroupe) - Level 20 ⭐⭐⭐⭐⭐
+ Main Stat: hp
+ Score: 78.18/100
+ Substats:
+ • eleMas: 19
+ • atk_: 14.0%
+ • enerRech_: 23.3%
+ • hp_: 5.8%
+
+Feather (GoldenTroupe) - Level 12 ⭐⭐⭐⭐⭐
+ Main Stat: atk
+ Score: 57.35/100
+ Substats:
+ • enerRech_: 17.5%
+ • atk_: 9.9%
+ • def_: 7.3%
+ • eleMas: 21
+
+Sands (GoldenTroupe) - Level 16 ⭐⭐⭐⭐⭐
+ Main Stat: atk_
+ Score: 63.74/100
+ Substats:
+ • critDMG_: 7.8%
+ • hp: 448
+ • critRate_: 6.6%
+ • enerRech_: 12.3%
+
+Goblet (GoldenTroupe) - Level 12 ⭐⭐⭐⭐⭐
+ Main Stat: atk_
+ Score: 36.43/100
+ Substats:
+ • critRate_: 7.0%
+ • hp_: 5.3%
+ • enerRech_: 5.2%
+ • hp: 508
+
+Circlet (GoldenTroupe) - Level 12 ⭐⭐⭐⭐⭐
+ Main Stat: critDMG_
+ Score: 28.73/100
+ Substats:
+ • hp_: 9.9%
+ • enerRech_: 5.2%
+ • atk_: 8.2%
+ • def: 21
+
+==================== FISCHL ====================
+šŸ“Š Average Artifact Score: 38.13/100
+āœ… Energy Recharge: 126.6% (off_field_every_rotation: 120-140%)
+
+šŸ“‹ ARTIFACT BUILD:
+
+Flower (GoldenTroupe) - Level 20 ⭐⭐⭐⭐⭐
+ Main Stat: hp
+ Score: 67.35/100
+ Substats:
+ • enerRech_: 9.1%
+ • critDMG_: 12.4%
+ • atk: 37
+ • atk_: 11.7%
+
+Feather (GoldenTroupe) - Level 12 ⭐⭐⭐⭐⭐
+ Main Stat: atk
+ Score: 24.44/100
+ Substats:
+ • def: 16
+ • critDMG_: 13.2%
+ • hp: 209
+ • hp_: 9.9%
+
+Sands (GoldenTroupe) - Level 12 ⭐⭐⭐⭐⭐
+ Main Stat: atk_
+ Score: 35.12/100
+ Substats:
+ • eleMas: 44
+ • atk: 14
+ • enerRech_: 11.7%
+ • critDMG_: 6.2%
+
+Goblet (GoldenTroupe) - Level 11 ⭐⭐⭐⭐⭐
+ Main Stat: physical_dmg_
+ Score: 35.05/100
+ Substats:
+ • enerRech_: 5.8%
+ • hp_: 5.3%
+ • atk: 18
+ • atk_: 10.5%
+
+Circlet (GoldenTroupe) - Level 20 ⭐⭐⭐⭐⭐
+ Main Stat: critRate_
+ Score: 28.70/100
+ Substats:
+ • def: 44
+ • critDMG_: 15.5%
+ • hp: 448
+ • def_: 13.9%
+
+==================== CHIORI ====================
+šŸ“Š Average Artifact Score: 18.17/100
+āœ… Energy Recharge: 105.8% (100-110%)
+
+šŸ“‹ ARTIFACT BUILD:
+
+Flower (GoldenTroupe) - Level 0 ⭐⭐⭐⭐
+ Main Stat: hp
+ Score: 10.44/100
+ Substats:
+ • atk: 11
+ • atk_: 4.7%
+
+Feather (GoldenTroupe) - Level 0 ⭐⭐⭐⭐⭐
+ Main Stat: atk
+ Score: 22.16/100
+ Substats:
+ • hp: 299
+ • atk_: 4.7%
+ • enerRech_: 5.8%
+ • def: 16
+
+Sands (GoldenTroupe) - Level 0 ⭐⭐⭐⭐
+ Main Stat: def_
+ Score: 9.33/100
+ Substats:
+ • atk_: 4.2%
+ • atk: 11
+
+Goblet (GoldenTroupe) - Level 4 ⭐⭐⭐⭐⭐
+ Main Stat: def_
+ Score: 22.96/100
+ Substats:
+ • hp: 239
+ • def: 21
+ • critDMG_: 7.0%
+ • critRate_: 2.7%
+
+Circlet (GoldenTroupe) - Level 4 ⭐⭐⭐⭐⭐
+ Main Stat: def_
+ Score: 25.93/100
+ Substats:
+ • hp: 299
+ • atk: 19
+ • critRate_: 7.0%
+ • eleMas: 19
+
+==================== SUMMARY ====================
+Characters processed: 4
+Successful builds: 4
+Failed builds: 0
+Average build quality: 38.31/100 \ No newline at end of file