167 lines
5.1 KiB
Rust
167 lines
5.1 KiB
Rust
pub mod auto_translate;
|
|
pub mod duties;
|
|
pub mod jobs;
|
|
pub mod roulettes;
|
|
pub mod territory_names;
|
|
pub mod treasure_maps;
|
|
pub mod worlds;
|
|
|
|
pub use self::{
|
|
auto_translate::AUTO_TRANSLATE,
|
|
duties::DUTIES,
|
|
jobs::JOBS,
|
|
roulettes::ROULETTES,
|
|
territory_names::TERRITORY_NAMES,
|
|
treasure_maps::TREASURE_MAPS,
|
|
worlds::WORLDS,
|
|
};
|
|
|
|
use std::{
|
|
cmp::Ordering,
|
|
str::FromStr,
|
|
};
|
|
use std::borrow::Cow;
|
|
use crate::listing::{DutyCategory, DutyType};
|
|
|
|
#[derive(Debug, Copy, Clone)]
|
|
pub enum Language {
|
|
English,
|
|
Japanese,
|
|
German,
|
|
French,
|
|
}
|
|
|
|
impl Language {
|
|
pub fn code(&self) -> &'static str {
|
|
match self {
|
|
Self::English => "en",
|
|
Self::Japanese => "ja",
|
|
Self::German => "de",
|
|
Self::French => "fr",
|
|
}
|
|
}
|
|
|
|
pub fn name(&self) -> &'static str {
|
|
match self {
|
|
Self::English => "english",
|
|
Self::Japanese => "日本語",
|
|
Self::German => "deutsch",
|
|
Self::French => "français",
|
|
}
|
|
}
|
|
|
|
pub fn from_codes(val: Option<&str>) -> Self {
|
|
let val = match val {
|
|
Some(v) => v,
|
|
None => return Self::English,
|
|
};
|
|
|
|
let mut parts: Vec<(&str, f32)> = val.split(',')
|
|
.map(|part| {
|
|
let sub_parts: Vec<&str> = part.split(';').collect();
|
|
if sub_parts.len() == 1 {
|
|
(sub_parts[0], 1.0)
|
|
} else if let Ok(val) = f32::from_str(sub_parts[0]) {
|
|
(sub_parts[0], val)
|
|
} else {
|
|
(sub_parts[0], 0.0)
|
|
}
|
|
})
|
|
.collect();
|
|
parts.sort_unstable_by(|a, b| b.1.partial_cmp(&a.1).unwrap_or(Ordering::Less));
|
|
if parts.len() == 0 {
|
|
return Self::English;
|
|
}
|
|
|
|
for (lang, _) in parts {
|
|
let first = lang.split('-').next().unwrap();
|
|
match first {
|
|
"en" => return Self::English,
|
|
"ja" => return Self::Japanese,
|
|
"de" => return Self::German,
|
|
"fr" => return Self::French,
|
|
_ => {},
|
|
}
|
|
}
|
|
|
|
Self::English
|
|
}
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct LocalisedText {
|
|
pub en: &'static str,
|
|
pub ja: &'static str,
|
|
pub de: &'static str,
|
|
pub fr: &'static str,
|
|
}
|
|
|
|
impl LocalisedText {
|
|
pub fn text(&self, lang: &Language) -> &'static str {
|
|
match lang {
|
|
Language::English => self.en,
|
|
Language::Japanese => self.ja,
|
|
Language::German => self.de,
|
|
Language::French => self.fr,
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn duty_name<'a>(duty_type: DutyType, category: DutyCategory, duty: u16, lang: Language) -> Cow<'a, str> {
|
|
match (duty_type, category) {
|
|
(DutyType::Other, DutyCategory::Fates) => {
|
|
if let Some(name) = crate::ffxiv::TERRITORY_NAMES.get(&u32::from(duty)) {
|
|
return Cow::from(name.text(&lang));
|
|
}
|
|
|
|
return Cow::from("FATEs");
|
|
}
|
|
(DutyType::Other, DutyCategory::TheHunt) => return Cow::from(match lang {
|
|
Language::English => "The Hunt",
|
|
Language::Japanese => "モブハント",
|
|
Language::German => "Hohe Jagd",
|
|
Language::French => "Contrats de chasse",
|
|
}),
|
|
(DutyType::Other, DutyCategory::Duty) if duty == 0 => return Cow::from(match lang {
|
|
Language::English => "None",
|
|
Language::Japanese => "設定なし",
|
|
Language::German => "Nicht festgelegt",
|
|
Language::French => "Non spécifiée",
|
|
}),
|
|
(DutyType::Other, DutyCategory::DeepDungeons) if duty == 1 => return Cow::from(match lang {
|
|
Language::English => "The Palace of the Dead",
|
|
Language::Japanese => "死者の宮殿",
|
|
Language::German => "Palast der Toten",
|
|
Language::French => "Palais des morts",
|
|
}),
|
|
(DutyType::Other, DutyCategory::DeepDungeons) if duty == 2 => return Cow::from(match lang {
|
|
Language::English => "Heaven-on-High",
|
|
Language::Japanese => "アメノミハシラ",
|
|
Language::German => "Himmelssäule",
|
|
Language::French => "Pilier des Cieux",
|
|
}),
|
|
(DutyType::Normal, _) => {
|
|
if let Some(info) = crate::ffxiv::DUTIES.get(&u32::from(duty)) {
|
|
return Cow::from(info.name.text(&lang));
|
|
}
|
|
}
|
|
(DutyType::Roulette, _) => {
|
|
if let Some(info) = crate::ffxiv::ROULETTES.get(&u32::from(duty)) {
|
|
return Cow::from(info.name.text(&lang));
|
|
}
|
|
}
|
|
(_, DutyCategory::QuestBattles) => return Cow::from(match lang {
|
|
Language::English => "Quest Battles",
|
|
Language::Japanese => "クエストバトル",
|
|
Language::German => "Auftragskampf",
|
|
Language::French => "Batailles de quête",
|
|
}),
|
|
(_, DutyCategory::TreasureHunt) => if let Some(name) = crate::ffxiv::TREASURE_MAPS.get(&u32::from(duty)) {
|
|
return Cow::from(name.text(&lang));
|
|
}
|
|
_ => {}
|
|
}
|
|
|
|
Cow::from(format!("{:?}", category))
|
|
}
|