BattleMoveHitResolutionStep.kt
package io.github.lishangbu.avalon.game.battle.engine.core.runtime.flow
import io.github.lishangbu.avalon.game.battle.engine.core.constant.BattleAttributeKeys
import io.github.lishangbu.avalon.game.battle.engine.core.runtime.support.EventContextAttributeReader
/**
* 命中判定 phase step。
*
* @property hitResolutionPolicy battle 命中判定策略。
*/
class BattleMoveHitResolutionStep(
private val hitResolutionPolicy: BattleHitResolutionPolicy,
) : BattleMoveResolutionStep {
/**
* 当前步骤在 pipeline 中的执行顺序。
*/
override val order: Int = 200
/**
* 计算当前出招是否命中。
*/
override fun execute(context: BattleMoveResolutionContext) {
val explicitResult = EventContextAttributeReader.readBoolean(BattleAttributeKeys.HIT_SUCCESSFUL, context.attributes)
if (explicitResult == null && context.forcedHitSuccessful != null) {
context.hitSuccessful = requireNotNull(context.forcedHitSuccessful)
return
}
context.hitSuccessful =
hitResolutionPolicy.determine(
accuracy = context.accuracy,
evasion = context.evasion,
attributes = context.attributes,
)
}
}