use crate::interactive_fiction::data::choice::Choice;
use crate::interactive_fiction::data::condition::Condition;
use crate::interactive_fiction::data::entity::EntityLocation;
use crate::interactive_fiction::data::ids::{
DialogueId, EndingId, EntityId, EventName, FlagKey, ItemId, NodeId, QuestId, RoomId, RuleId,
StatKey, TimerId,
};
use crate::interactive_fiction::data::state::ItemLocation;
use crate::interactive_fiction::data::text::Text;
use crate::interactive_fiction::data::value::Value;
use serde::{Deserialize, Serialize};
#[non_exhaustive]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Effect {
Say(Text),
DescribeRoom,
ClearTranscript,
SetFlag(FlagKey, Value),
UnsetFlag(FlagKey),
AddStat(StatKey, i64),
SetStat(StatKey, i64),
MoveItem(ItemId, ItemLocation),
MovePlayer(RoomId),
MoveEntity(EntityId, EntityLocation),
AdjustDisposition(EntityId, i64),
SetQuestStage(QuestId, NodeId),
BeginDialogue(DialogueId),
EndDialogue,
GotoDialogue(NodeId),
If {
when: Condition,
then: Vec<Effect>,
otherwise: Vec<Effect>,
},
Sequence(Vec<Effect>),
OneOf(Vec<Vec<Effect>>),
OfferChoices(Vec<Choice>),
TriggerEvent(EventName),
FireRule(RuleId),
StartTimer(TimerId),
CancelTimer(TimerId),
ScheduleEvent { event: EventName, in_turns: u32 },
TriggerEnding(EndingId),
}