babalae/better-genshin-impact · error · InvalidOperationException

未能完整识别普通攻击、元素战技和元素爆发三个天赋。

Error message

未能完整识别普通攻击、元素战技和元素爆发三个天赋。

What it means

After iterating all talent points, the set of recognized talent types must equal exactly {普通攻击, 元素战技, 元素爆发}. If OCR/normalization missed one type or duplicated another, the trio is incomplete and the result would be wrong, so the handler throws rather than return partial data.

Solutions

  1. Improve capture timing (wait for the talent detail panel to fully render before reading).
  2. Adjust the talent-title OCR ROI or preprocessing if the UI layout changed.
  3. Retry the talent sub-flow once on failure before aborting the whole character.

Example fix

// before
if (!_readTalentTypes.SetEquals([AttackTalentType, SkillTalentType, BurstTalentType]))
    throw new InvalidOperationException(...);

// after: retry the talent flow once, then fail
catch (InvalidOperationException) when (talentRetries++ < 1) { _workflowState = FindTalentEntries; return StateHandlerResult.Success; }
Defensive patterns

Strategy: retry

Validate before calling

// Before declaring success, the handler already checks completeness;
// reduce transient OCR failures by ensuring the panel is fully rendered.

Try / catch

try { /* talent read loop */ }
catch (InvalidOperationException ex) when (ex.Message.Contains("未能完整识别"))
{ /* retry the FindTalentEntries→OpenTalent→ReadTalent flow once */ }

Prevention

When it happens

Trigger: `NormalizeTalentType` returned empty for one of the three points (OCR failed to read the talent name); a talent point's OCR resolved to the same type twice; `TryFindTalentPoints` picked a non-talent 'Lv' region.

Common situations: Low OCR confidence on the talent title region; UI animation/partial render during capture; a layout change shifting which 'Lv' text gets picked.

Related errors


AI-assisted analysis of babalae/better-genshin-impact@a7cb36712d (2026-08-13). Data as JSON: /api/errors/143b464c340160d4. Report an issue: GitHub.

Appendix: source

Thrown at BetterGenshinImpact/GameTask/CharacterDevelopment/CharacterDevelopmentTask.cs:820

        var (type, level, hasBonus) = await ReadTalentDetailWithRetry();

        if (!_readTalentTypes.Add(type))
        {
            return StateHandlerResult.Retry;
        }

        ApplyTalentResult(CurrentResult, type, level, hasBonus);

        _talentIndex++;
        if (_talentIndex < _talentPoints.Count)
        {
            _workflowState = CharacterDevelopmentState.OpenTalent;
        }
        else
        {
            if (!_readTalentTypes.SetEquals([AttackTalentType, SkillTalentType, BurstTalentType]))
            {
                throw new InvalidOperationException("未能完整识别普通攻击、元素战技和元素爆发三个天赋。");
            }

            Simulation.SendInput.Keyboard.KeyPress(User32.VK.VK_ESCAPE);
            _workflowState = CharacterDevelopmentState.SwitchCategory;
        }

        return StateHandlerResult.Success;
    }

    [StateHandler(CharacterDevelopmentState.ReturnMainUi, RetryTimeout = 15000, RetryInterval = 500, TransitionTimeout = 7000)]
    private async Task<StateHandlerResult> HandleReturnMainUi(BvPage page)
    {
        await _returnMainUiTask.Start(_ct);
        _workflowState = CharacterDevelopmentState.Completed;
        return StateHandlerResult.Success;
    }

    #endregion

View on GitHub (pinned to a7cb36712d)