use serde::{Deserialize, Serialize};
use strum::EnumString;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, EnumString, Serialize, Deserialize)]
#[strum(ascii_case_insensitive)]
pub enum Verb {
#[strum(serialize = "look", serialize = "l", serialize = "gaze")]
Look,
#[strum(
serialize = "examine",
serialize = "x",
serialize = "inspect",
serialize = "check",
serialize = "describe",
serialize = "observe",
serialize = "study",
serialize = "watch",
serialize = "search"
)]
Examine,
#[strum(serialize = "exits")]
Exits,
#[strum(serialize = "inventory", serialize = "inv", serialize = "i")]
Inventory,
#[strum(
serialize = "wait",
serialize = "z",
serialize = "pass",
serialize = "delay",
serialize = "sleep",
serialize = "nap",
serialize = "rest",
serialize = "think",
serialize = "meditate"
)]
Wait,
#[strum(
serialize = "take",
serialize = "get",
serialize = "grab",
serialize = "carry",
serialize = "hold",
serialize = "pick"
)]
Take,
#[strum(serialize = "drop", serialize = "discard")]
Drop,
#[strum(serialize = "throw", serialize = "toss", serialize = "hurl")]
Throw,
#[strum(serialize = "put", serialize = "place", serialize = "set")]
Put,
#[strum(serialize = "use", serialize = "operate", serialize = "activate")]
Use,
#[strum(serialize = "open")]
Open,
#[strum(serialize = "close", serialize = "shut")]
Close,
#[strum(serialize = "unlock")]
Unlock,
#[strum(serialize = "lock")]
Lock,
#[strum(serialize = "switch")]
Switch,
#[strum(
serialize = "push",
serialize = "press",
serialize = "shove",
serialize = "poke",
serialize = "prod",
serialize = "nudge"
)]
Push,
#[strum(
serialize = "pull",
serialize = "yank",
serialize = "tug",
serialize = "loosen"
)]
Pull,
#[strum(serialize = "turn", serialize = "rotate", serialize = "twist")]
Turn,
#[strum(serialize = "squeeze")]
Squeeze,
#[strum(serialize = "rub", serialize = "polish", serialize = "scratch")]
Rub,
#[strum(serialize = "wave")]
Wave,
#[strum(serialize = "swing")]
Swing,
#[strum(serialize = "burn", serialize = "ignite")]
Burn,
#[strum(serialize = "cut", serialize = "slice")]
Cut,
#[strum(serialize = "tie", serialize = "attach")]
Tie,
#[strum(serialize = "wear", serialize = "don")]
Wear,
#[strum(serialize = "insert")]
Insert,
#[strum(serialize = "fill", serialize = "empty")]
Fill,
#[strum(serialize = "remove", serialize = "doff")]
Remove,
#[strum(serialize = "smell", serialize = "sniff")]
Smell,
#[strum(serialize = "listen", serialize = "hear")]
Listen,
#[strum(serialize = "touch", serialize = "feel")]
Touch,
#[strum(serialize = "taste", serialize = "lick")]
Taste,
#[strum(serialize = "eat", serialize = "consume")]
Eat,
#[strum(serialize = "drink", serialize = "sip", serialize = "quaff")]
Drink,
#[strum(serialize = "read", serialize = "peruse")]
Read,
#[strum(serialize = "consult")]
Consult,
#[strum(
serialize = "go",
serialize = "walk",
serialize = "run",
serialize = "head",
serialize = "move",
serialize = "proceed",
serialize = "travel"
)]
Go,
#[strum(serialize = "enter")]
Enter,
#[strum(serialize = "climb", serialize = "ascend")]
Climb,
#[strum(serialize = "jump", serialize = "leap", serialize = "hop")]
Jump,
#[strum(
serialize = "talk",
serialize = "speak",
serialize = "greet",
serialize = "hail"
)]
Talk,
#[strum(serialize = "ask", serialize = "tell", serialize = "answer")]
Ask,
#[strum(serialize = "kiss")]
Kiss,
#[strum(
serialize = "attack",
serialize = "fight",
serialize = "hit",
serialize = "kill",
serialize = "punch",
serialize = "strike",
serialize = "break",
serialize = "smash",
serialize = "kick"
)]
Attack,
#[strum(serialize = "wake", serialize = "awaken", serialize = "rouse")]
Wake,
#[strum(serialize = "give", serialize = "offer", serialize = "hand")]
Give,
#[strum(serialize = "show", serialize = "display", serialize = "present")]
Show,
#[strum(serialize = "apologise", serialize = "apologize", serialize = "sorry")]
Apologise,
#[strum(serialize = "buy", serialize = "purchase")]
Buy,
#[strum(
serialize = "leave",
serialize = "bye",
serialize = "goodbye",
serialize = "farewell"
)]
Leave,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum RefusalCategory {
Default,
Taste,
Consume,
Violence,
Affection,
Manipulation,
Jump,
Exchange,
Wake,
}
impl Verb {
pub const fn default_refusal_category(self) -> RefusalCategory {
match self {
Verb::Taste => RefusalCategory::Taste,
Verb::Eat | Verb::Drink => RefusalCategory::Consume,
Verb::Attack | Verb::Burn | Verb::Cut => RefusalCategory::Violence,
Verb::Kiss | Verb::Apologise => RefusalCategory::Affection,
Verb::Open
| Verb::Close
| Verb::Unlock
| Verb::Lock
| Verb::Switch
| Verb::Push
| Verb::Pull
| Verb::Turn
| Verb::Squeeze
| Verb::Rub
| Verb::Wave
| Verb::Swing
| Verb::Tie
| Verb::Wear
| Verb::Remove
| Verb::Insert
| Verb::Fill
| Verb::Use
| Verb::Take
| Verb::Drop
| Verb::Throw
| Verb::Put => RefusalCategory::Manipulation,
Verb::Jump => RefusalCategory::Jump,
Verb::Give | Verb::Show | Verb::Buy => RefusalCategory::Exchange,
Verb::Wake => RefusalCategory::Wake,
Verb::Look
| Verb::Examine
| Verb::Exits
| Verb::Inventory
| Verb::Wait
| Verb::Smell
| Verb::Listen
| Verb::Touch
| Verb::Read
| Verb::Consult
| Verb::Go
| Verb::Enter
| Verb::Climb
| Verb::Talk
| Verb::Ask
| Verb::Leave => RefusalCategory::Default,
}
}
pub const fn accepts_examine_fallback(self) -> bool {
matches!(
self,
Verb::Use
| Verb::Open
| Verb::Close
| Verb::Unlock
| Verb::Lock
| Verb::Switch
| Verb::Push
| Verb::Pull
| Verb::Turn
| Verb::Squeeze
| Verb::Rub
| Verb::Wave
| Verb::Swing
| Verb::Tie
| Verb::Wear
| Verb::Remove
| Verb::Insert
| Verb::Fill
| Verb::Read
| Verb::Consult
| Verb::Talk
| Verb::Ask
)
}
}