BattleSessionTurnStatus.kt

package io.github.lishangbu.avalon.game.battle.engine.core.session

import io.github.lishangbu.avalon.game.battle.engine.core.model.BattleLifecycle

/**
 * BattleSession 在运行阶段的回合内状态。
 *
 * 设计意图:
 * - 把“当前是等玩家输入、等替补、还是已经可以结算”显式表达出来。
 * - 保持它是运行阶段的派生状态,而不是再写回 `BattleState` 形成第二份真相。
 */
enum class BattleSessionTurnStatus {
    /**
     * 当前回合仍在等待各 side 提交行动。
     */
    AWAITING_CHOICES,

    /**
     * 当前回合已经被濒死/强制换人打断,正在等待替补选择。
     */
    AWAITING_REPLACEMENT,

    /**
     * 当前回合输入已完整,可以正式进入结算。
     */
    READY_TO_RESOLVE,
    ;

    companion object {
        /**
         * 根据全局生命周期和当前回合输入情况推导回合内状态。
         *
         * 约定:
         * - 只有 battle 处于 `RUNNING` 时才存在回合内状态。
         * - 只要有待处理替补请求,就优先视为 `AWAITING_REPLACEMENT`。
         * - 没有替补请求且输入齐全时,视为 `READY_TO_RESOLVE`。
         */
        fun from(
            lifecycle: BattleLifecycle,
            hasPendingReplacement: Boolean,
            readyToResolve: Boolean,
        ): BattleSessionTurnStatus? =
            when (lifecycle) {
                BattleLifecycle.RUNNING -> {
                    when {
                        hasPendingReplacement -> AWAITING_REPLACEMENT
                        readyToResolve -> READY_TO_RESOLVE
                        else -> AWAITING_CHOICES
                    }
                }

                else -> {
                    null
                }
            }
    }
}