use crate::interactive_fiction::data::condition::Condition;
use crate::interactive_fiction::data::effect::Effect;
use crate::interactive_fiction::data::ids::{EntityId, ItemId, RoomId};
use crate::interactive_fiction::data::text::Text;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Choice {
pub label: Text,
pub condition: Option<Condition>,
pub visible_when_locked: bool,
pub locked_reason: Option<Text>,
pub action: ChoiceAction,
}
impl Choice {
pub fn new(label: Text, action: ChoiceAction) -> Self {
Self {
label,
condition: None,
visible_when_locked: false,
locked_reason: None,
action,
}
}
pub fn with_condition(mut self, condition: Condition) -> Self {
self.condition = Some(condition);
self
}
pub fn visible_when_locked(mut self, reason: Text) -> Self {
self.visible_when_locked = true;
self.locked_reason = Some(reason);
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ChoiceAction {
Go {
to: RoomId,
exit_index: usize,
},
Take(ItemId),
Drop(ItemId),
Use(ItemId),
Read(ItemId),
Examine(ExamineTarget),
Open(EntityId),
DialogueOption(usize),
LeaveDialogue,
Look,
Inventory,
Wait,
Effects(Vec<Effect>),
}
impl ChoiceAction {
pub const fn advances_turn(&self) -> bool {
match self {
ChoiceAction::Go { .. }
| ChoiceAction::Take(_)
| ChoiceAction::Drop(_)
| ChoiceAction::Use(_)
| ChoiceAction::Wait
| ChoiceAction::Effects(_) => true,
ChoiceAction::Look
| ChoiceAction::Inventory
| ChoiceAction::Examine(_)
| ChoiceAction::Open(_)
| ChoiceAction::Read(_)
| ChoiceAction::DialogueOption(_)
| ChoiceAction::LeaveDialogue => false,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ExamineTarget {
Item(ItemId),
Entity(EntityId),
Keyword(String),
}