BattleSessionPublicationRecorder.kt

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

/**
 * BattleSession 发布与读模型写入协调器。
 *
 * 设计意图:
 * - 把 `battle log / structured event / resource ledger` 的发布职责
 *   从 `BattleSession` 主体中拆出去;
 * - 让 `BattleSession` 更聚焦于流程编排,而不是继续堆积一组
 *   append/publish/record 细节方法;
 * - 保持当前 projector 体系不变,只调整会话内部的职责边界。
 */
internal class BattleSessionPublicationRecorder(
    private val session: BattleSession,
    private val eventPublisher: BattleSessionEventPublisher,
) {
    /**
     * 记录一条资源账本。
     */
    fun recordResourceUsage(usage: BattleSessionResourceUsage) {
        publish(
            BattleSessionPublication(
                turn = session.currentSnapshot.battle.turn,
                resourceUsage = usage,
            ),
        )
    }

    /**
     * 记录一条 battle log。
     */
    fun recordLog(message: String) {
        publish(
            BattleSessionPublication(
                turn = session.currentSnapshot.battle.turn,
                battleLogMessage = message,
            ),
        )
    }

    /**
     * 记录一条结构化事件 payload。
     */
    fun recordEvent(payload: BattleSessionEventPayload) {
        publish(
            BattleSessionPublication(
                turn = session.currentSnapshot.battle.turn,
                eventPayload = payload,
            ),
        )
    }

    /**
     * 发布一条 session 内部 publication。
     */
    fun publish(publication: BattleSessionPublication) {
        eventPublisher.publish(session, publication)
    }

    /**
     * 供 projector 追加一条 battle log。
     */
    fun appendBattleLog(message: String) {
        session.battleLogs += message
    }

    /**
     * 供 projector 追加一条结构化事件。
     */
    fun appendEventLog(event: BattleSessionEvent) {
        session.eventLogs += event
    }

    /**
     * 供 projector 追加一条资源账本。
     */
    fun appendResourceUsage(usage: BattleSessionResourceUsage) {
        session.resourceLedger += usage
    }
}