use crate::interactive_fiction::data::choice::ExamineTarget;
use crate::interactive_fiction::data::ids::{EntityId, EventName, FlagKey, ItemId, RoomId};
use serde::{Deserialize, Serialize};
#[non_exhaustive]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Trigger {
GameStart,
TurnStart,
TurnEnd,
OnEnter(Option<RoomId>),
OnExit(Option<RoomId>),
OnTake(Option<ItemId>),
OnDrop(Option<ItemId>),
OnUse {
item: Option<ItemId>,
in_room: Option<RoomId>,
},
OnExamine(Option<ExamineTarget>),
OnOpen(Option<EntityId>),
OnFlagSet(FlagKey),
OnFlagUnset(FlagKey),
Named(EventName),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum TriggerKind {
GameStart,
TurnStart,
TurnEnd,
OnEnter,
OnExit,
OnTake,
OnDrop,
OnUse,
OnExamine,
OnOpen,
OnFlagSet,
OnFlagUnset,
Named,
}
impl Trigger {
pub fn kind(&self) -> TriggerKind {
match self {
Trigger::GameStart => TriggerKind::GameStart,
Trigger::TurnStart => TriggerKind::TurnStart,
Trigger::TurnEnd => TriggerKind::TurnEnd,
Trigger::OnEnter(_) => TriggerKind::OnEnter,
Trigger::OnExit(_) => TriggerKind::OnExit,
Trigger::OnTake(_) => TriggerKind::OnTake,
Trigger::OnDrop(_) => TriggerKind::OnDrop,
Trigger::OnUse { .. } => TriggerKind::OnUse,
Trigger::OnExamine(_) => TriggerKind::OnExamine,
Trigger::OnOpen(_) => TriggerKind::OnOpen,
Trigger::OnFlagSet(_) => TriggerKind::OnFlagSet,
Trigger::OnFlagUnset(_) => TriggerKind::OnFlagUnset,
Trigger::Named(_) => TriggerKind::Named,
}
}
}