//! 成长领域事件。 //! //! 领域事件用于表达经验、升级和章节账本已经发生的事实;是否持久化为 SpacetimeDB //! event table 或向前端投影,由外层 adapter 决定。 use crate::domain::{PlayerProgressionGrantSource, RuntimeEntityLevelProfile}; use serde::{Deserialize, Serialize}; #[cfg(feature = "spacetime-types")] use spacetimedb::SpacetimeType; #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub enum ProgressionDomainEvent { PlayerExperienceGranted(PlayerExperienceGrantedEvent), ChapterProgressionLedgerApplied(ChapterProgressionLedgerAppliedEvent), ChapterAutoLevelProfileResolved(ChapterAutoLevelProfileResolvedEvent), } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct PlayerExperienceGrantedEvent { pub user_id: String, pub amount: u32, pub source: PlayerProgressionGrantSource, pub level: u32, pub pending_level_ups: u32, pub occurred_at_micros: i64, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct ChapterProgressionLedgerAppliedEvent { pub user_id: String, pub chapter_id: String, pub granted_quest_xp: u32, pub granted_hostile_xp: u32, pub hostile_defeat_increment: u32, pub occurred_at_micros: i64, } #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct ChapterAutoLevelProfileResolvedEvent { pub profile: RuntimeEntityLevelProfile, pub occurred_at_micros: i64, }