use serde::{Deserialize, Serialize};
use crate::types::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Scene {
pub id: SceneId,
pub location: LocationId,
pub beat: BeatId,
pub lines: Vec<SceneLine>,
pub choices: Vec<Choice>,
#[serde(default)]
pub conditions: Vec<Condition>,
pub state_effects: Vec<StateEffect>,
pub pacing: PacingTag,
#[serde(default)]
pub memory_refs: Vec<MemoryRef>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SceneLine {
pub speaker: SpeakerId,
pub text: String,
#[serde(default)]
pub conditions: Vec<Condition>,
pub emotion: Option<EmotionTag>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Choice {
pub label: String,
#[serde(default)]
pub conditions: Vec<Condition>,
pub effects: Vec<StateEffect>,
pub next: SceneTransition,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SceneTransition {
Scene(SceneId),
Beat(BeatId),
Combat(EncounterId),
End,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Condition {
Flag { id: FlagId, value: FlagValue },
Reputation { axis: ReputationAxis, op: CompareOp, threshold: i32 },
PartyMember { character: CharacterId, present: bool },
Witness { id: WitnessId, alive: bool },
HasMemoryObject(MemoryObjectId),
RelayBranch(RelayBranch),
PrologueChoice(PrologueChoice),
HasEvidence(EvidenceId),
HasSkill { character: CharacterId, skill: SkillId },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum StateEffect {
SetFlag { id: FlagId, value: FlagValue },
AdjustReputation { axis: ReputationAxis, delta: i32 },
AddPartyMember(CharacterId),
RemovePartyMember(CharacterId),
UnlockSkill { character: CharacterId, skill: SkillId },
AddEvidence(EvidenceId),
SetWitnessState { id: WitnessId, alive: bool, integrity: i32 },
AddMemoryObject(MemoryObjectId),
TransformMemoryObject { id: MemoryObjectId, new_state: String },
AdjustResource { resource: ResourceKind, delta: i32 },
SetRelationship { a: CharacterId, b: CharacterId, value: i32 },
ApplyInjury { character: CharacterId, injury: InjuryId },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryRef {
pub object: MemoryObjectId,
pub callback_type: MemoryCallbackType,
pub target_chapter: Option<ChapterId>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MemoryCallbackType {
Echo,
Carry,
Transform,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum PacingTag {
Exploration,
Pressure,
Intimate,
Crisis,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum EmotionTag {
Neutral,
Warm,
Tense,
Bitter,
Dry,
Grief,
Quiet,
}