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
}
}