WildBattleAiChoiceProvider.kt

package io.github.lishangbu.avalon.game.battle.engine.application.ai

import io.github.lishangbu.avalon.game.battle.engine.core.constant.BattleStatIds
import io.github.lishangbu.avalon.game.battle.engine.core.model.BattleType
import io.github.lishangbu.avalon.game.battle.engine.core.runtime.support.BattleStatAliasResolver
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionChoice
import io.github.lishangbu.avalon.game.battle.engine.core.session.BattleSessionQuery
import io.github.lishangbu.avalon.game.battle.engine.core.session.WaitChoice
import io.github.lishangbu.avalon.game.battle.engine.spi.ai.BattleAiChoiceProvider
import org.springframework.stereotype.Component

@Component
class WildBattleAiChoiceProvider : BattleAiChoiceProvider {
    override fun supports(battleKind: BattleType): Boolean = battleKind == BattleType.WILD

    override fun provide(session: BattleSessionQuery): List<BattleSessionChoice> {
        val capturableSideId = session.snapshot.battle.capturableSideId ?: return emptyList()
        return session.choiceStatuses
            .filter { status -> status.sideId == capturableSideId }
            .flatMap { status -> status.missingUnitIds }
            .map { unitId ->
                val speed =
                    session.snapshot.units[unitId]
                        ?.stats
                        ?.let { stats -> BattleStatAliasResolver.readValue(stats, BattleStatIds.SPEED) }
                        ?: 0
                WaitChoice(unitId = unitId, speed = speed)
            }
    }
}