use crate::interactive_fiction::data::condition::Condition;
use crate::interactive_fiction::data::effect::Effect;
use crate::interactive_fiction::data::ids::NodeId;
use crate::interactive_fiction::data::text::Text;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Quest {
pub name: String,
pub start: NodeId,
pub stages: BTreeMap<NodeId, QuestStage>,
}
impl Quest {
pub fn new(name: impl Into<String>, start: NodeId) -> Self {
Self {
name: name.into(),
start,
stages: BTreeMap::new(),
}
}
pub fn with_stage(mut self, id: NodeId, stage: QuestStage) -> Self {
self.stages.insert(id, stage);
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuestStage {
pub kind: QuestStageKind,
pub description: Text,
pub on_enter: Vec<Effect>,
pub transitions: Vec<QuestTransition>,
}
impl QuestStage {
pub fn active(description: Text) -> Self {
Self {
kind: QuestStageKind::Active,
description,
on_enter: Vec::new(),
transitions: Vec::new(),
}
}
pub fn success(description: Text) -> Self {
Self {
kind: QuestStageKind::Success,
description,
on_enter: Vec::new(),
transitions: Vec::new(),
}
}
pub fn failure(description: Text) -> Self {
Self {
kind: QuestStageKind::Failure,
description,
on_enter: Vec::new(),
transitions: Vec::new(),
}
}
pub fn with_on_enter(mut self, effects: Vec<Effect>) -> Self {
self.on_enter = effects;
self
}
pub fn with_transition(mut self, transition: QuestTransition) -> Self {
self.transitions.push(transition);
self
}
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum QuestStageKind {
Active,
Success,
Failure,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuestTransition {
pub to: NodeId,
pub condition: Condition,
pub effects: Vec<Effect>,
}
impl QuestTransition {
pub fn new(to: NodeId, condition: Condition) -> Self {
Self {
to,
condition,
effects: Vec::new(),
}
}
pub fn with_effects(mut self, effects: Vec<Effect>) -> Self {
self.effects = effects;
self
}
}