feat: add non-combat jobs and classifications
This commit is contained in:
parent
8f7de9824b
commit
ae699f2749
|
@ -0,0 +1,60 @@
|
||||||
|
//! Job classification types
|
||||||
|
|
||||||
|
use errors::UnknownVariant;
|
||||||
|
|
||||||
|
use std::fmt::{Display, Formatter, Result as FmtResult};
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
/// The classification of jobs available in the game.
|
||||||
|
///
|
||||||
|
/// `{War, Magic}` refer to [`Job`], while `{Land, Hand}` refer to [`NonCombatJob`].
|
||||||
|
///
|
||||||
|
/// [`Job`]: ::jobs::Job
|
||||||
|
/// [`NonCombatJob`]: ::jobs::NonCombatJob
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
pub enum Classification {
|
||||||
|
War,
|
||||||
|
Magic,
|
||||||
|
Land,
|
||||||
|
Hand,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Classification {
|
||||||
|
pub const ALL: [Classification; 4] = [
|
||||||
|
Classification::War,
|
||||||
|
Classification::Magic,
|
||||||
|
Classification::Land,
|
||||||
|
Classification::Hand,
|
||||||
|
];
|
||||||
|
|
||||||
|
pub fn as_str(&self) -> &'static str {
|
||||||
|
match *self {
|
||||||
|
Classification::War => "Disciple of War",
|
||||||
|
Classification::Magic => "Disciple of Magic",
|
||||||
|
Classification::Land => "Disciple of the Land",
|
||||||
|
Classification::Hand => "Disciple of the Hand",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for Classification {
|
||||||
|
type Err = UnknownVariant;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
let class = match s.to_lowercase().as_str() {
|
||||||
|
"disciple of war" | "war" => Classification::War,
|
||||||
|
"disciple of magic" | "magic" => Classification::Magic,
|
||||||
|
"disciple of the land" | "land" => Classification::Land,
|
||||||
|
"disciple of the hand" | "hand" => Classification::Hand,
|
||||||
|
_ => return Err(UnknownVariant("Classification", s.into()))
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(class)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for Classification {
|
||||||
|
fn fmt(&self, f: &mut Formatter) -> FmtResult {
|
||||||
|
write!(f, "{}", self.as_str())
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,18 @@
|
||||||
|
//! Job types
|
||||||
|
|
||||||
|
pub mod classification;
|
||||||
|
pub mod non_combat;
|
||||||
|
|
||||||
|
pub use self::classification::Classification;
|
||||||
|
pub use self::non_combat::NonCombatJob;
|
||||||
|
|
||||||
use errors::UnknownVariant;
|
use errors::UnknownVariant;
|
||||||
use roles::Role;
|
use roles::Role;
|
||||||
|
|
||||||
use std::fmt::{Display, Formatter, Result as FmtResult};
|
use std::fmt::{Display, Formatter, Result as FmtResult};
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
/// The Disciple of War and Disciple of Magic jobs available in the game.
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub enum Job {
|
pub enum Job {
|
||||||
// DPS
|
// DPS
|
||||||
|
@ -52,6 +61,9 @@ impl Job {
|
||||||
Job::Warrior,
|
Job::Warrior,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/// Returns the string representation of this job.
|
||||||
|
///
|
||||||
|
/// Jobs are title-cased and have spaces between words (e.g. "Bard" and "Black Mage").
|
||||||
pub fn as_str(&self) -> &'static str {
|
pub fn as_str(&self) -> &'static str {
|
||||||
match *self {
|
match *self {
|
||||||
Job::Bard => "Bard",
|
Job::Bard => "Bard",
|
||||||
|
@ -74,6 +86,7 @@ impl Job {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the [`Role`] for this job.
|
||||||
pub fn role(&self) -> Role {
|
pub fn role(&self) -> Role {
|
||||||
match *self {
|
match *self {
|
||||||
Job::Bard |
|
Job::Bard |
|
||||||
|
@ -95,11 +108,39 @@ impl Job {
|
||||||
Job::Warrior => Role::Tank,
|
Job::Warrior => Role::Tank,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the [`Classification`] for this job.
|
||||||
|
pub fn classification(&self) -> Classification {
|
||||||
|
match *self {
|
||||||
|
Job::Bard |
|
||||||
|
Job::DarkKnight |
|
||||||
|
Job::Dragoon |
|
||||||
|
Job::Machinist |
|
||||||
|
Job::Monk |
|
||||||
|
Job::Ninja |
|
||||||
|
Job::Paladin |
|
||||||
|
Job::Samurai |
|
||||||
|
Job::Warrior => Classification::War,
|
||||||
|
|
||||||
|
Job::Astrologian |
|
||||||
|
Job::BlackMage |
|
||||||
|
Job::RedMage |
|
||||||
|
Job::Scholar |
|
||||||
|
Job::Summoner |
|
||||||
|
Job::WhiteMage => Classification::Magic,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FromStr for Job {
|
impl FromStr for Job {
|
||||||
type Err = UnknownVariant;
|
type Err = UnknownVariant;
|
||||||
|
|
||||||
|
/// Parses a string `s` to return a value of this type.
|
||||||
|
///
|
||||||
|
/// This accepts the name of the variant as a string, the name of the variant as a string with
|
||||||
|
/// spaces between words, and the shortened job code for each variant (e.g. "BLM" for Black Mage).
|
||||||
|
///
|
||||||
|
/// This is case-insensitive.
|
||||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
let job = match s.to_lowercase().as_str() {
|
let job = match s.to_lowercase().as_str() {
|
||||||
"bard" | "brd" => Job::Bard,
|
"bard" | "brd" => Job::Bard,
|
|
@ -0,0 +1,107 @@
|
||||||
|
//! Non-combat job types
|
||||||
|
|
||||||
|
use jobs::classification::Classification;
|
||||||
|
use errors::UnknownVariant;
|
||||||
|
|
||||||
|
use std::fmt::{Display, Formatter, Result as FmtResult};
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
|
/// The Disciple of the Land and Disciple of the Hand jobs available in the game.
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
pub enum NonCombatJob {
|
||||||
|
// Gatherers
|
||||||
|
Botanist,
|
||||||
|
Fisher,
|
||||||
|
Miner,
|
||||||
|
|
||||||
|
// Crafters
|
||||||
|
Alchemist,
|
||||||
|
Armorer,
|
||||||
|
Blacksmith,
|
||||||
|
Carpenter,
|
||||||
|
Culinarian,
|
||||||
|
Goldsmith,
|
||||||
|
Leatherworker,
|
||||||
|
Weaver,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl NonCombatJob {
|
||||||
|
pub const ALL: [NonCombatJob; 11] = [
|
||||||
|
NonCombatJob::Botanist,
|
||||||
|
NonCombatJob::Fisher,
|
||||||
|
NonCombatJob::Miner,
|
||||||
|
|
||||||
|
NonCombatJob::Alchemist,
|
||||||
|
NonCombatJob::Armorer,
|
||||||
|
NonCombatJob::Blacksmith,
|
||||||
|
NonCombatJob::Carpenter,
|
||||||
|
NonCombatJob::Culinarian,
|
||||||
|
NonCombatJob::Goldsmith,
|
||||||
|
NonCombatJob::Leatherworker,
|
||||||
|
NonCombatJob::Weaver,
|
||||||
|
];
|
||||||
|
|
||||||
|
pub fn as_str(&self) -> &'static str {
|
||||||
|
match *self {
|
||||||
|
NonCombatJob::Botanist => "Botanist",
|
||||||
|
NonCombatJob::Fisher => "Fisher",
|
||||||
|
NonCombatJob::Miner => "Miner",
|
||||||
|
|
||||||
|
NonCombatJob::Alchemist => "Alchemist",
|
||||||
|
NonCombatJob::Armorer => "Armorer",
|
||||||
|
NonCombatJob::Blacksmith => "Blacksmith",
|
||||||
|
NonCombatJob::Carpenter => "Carpenter",
|
||||||
|
NonCombatJob::Culinarian => "Culinarian",
|
||||||
|
NonCombatJob::Goldsmith => "Goldsmith",
|
||||||
|
NonCombatJob::Leatherworker => "Leatherworker",
|
||||||
|
NonCombatJob::Weaver => "Weaver",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn classification(&self) -> Classification {
|
||||||
|
match *self {
|
||||||
|
NonCombatJob::Botanist |
|
||||||
|
NonCombatJob::Fisher |
|
||||||
|
NonCombatJob::Miner => Classification::Land,
|
||||||
|
|
||||||
|
NonCombatJob::Alchemist |
|
||||||
|
NonCombatJob::Armorer |
|
||||||
|
NonCombatJob::Blacksmith |
|
||||||
|
NonCombatJob::Carpenter |
|
||||||
|
NonCombatJob::Culinarian |
|
||||||
|
NonCombatJob::Goldsmith |
|
||||||
|
NonCombatJob::Leatherworker |
|
||||||
|
NonCombatJob::Weaver => Classification::Hand,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for NonCombatJob {
|
||||||
|
type Err = UnknownVariant;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
let job = match s.to_lowercase().as_str() {
|
||||||
|
"botanist" => NonCombatJob::Botanist,
|
||||||
|
"fisher" => NonCombatJob::Fisher,
|
||||||
|
"miner" => NonCombatJob::Miner,
|
||||||
|
|
||||||
|
"alchemist" => NonCombatJob::Alchemist,
|
||||||
|
"armorer" => NonCombatJob::Armorer,
|
||||||
|
"blacksmith" => NonCombatJob::Blacksmith,
|
||||||
|
"carpenter" => NonCombatJob::Carpenter,
|
||||||
|
"culinarian" => NonCombatJob::Culinarian,
|
||||||
|
"goldsmith" => NonCombatJob::Goldsmith,
|
||||||
|
"leatherworker" => NonCombatJob::Leatherworker,
|
||||||
|
"weaver" => NonCombatJob::Weaver,
|
||||||
|
_ => return Err(UnknownVariant("NonCombatJob", s.into()))
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(job)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for NonCombatJob {
|
||||||
|
fn fmt(&self, f: &mut Formatter) -> FmtResult {
|
||||||
|
write!(f, "{}", self.as_str())
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,6 +7,6 @@ pub mod roles;
|
||||||
pub mod worlds;
|
pub mod worlds;
|
||||||
|
|
||||||
pub use self::data_centers::DataCenter;
|
pub use self::data_centers::DataCenter;
|
||||||
pub use self::jobs::Job;
|
pub use self::jobs::{Job, NonCombatJob, Classification};
|
||||||
pub use self::roles::Role;
|
pub use self::roles::Role;
|
||||||
pub use self::worlds::World;
|
pub use self::worlds::World;
|
||||||
|
|
Loading…
Reference in New Issue