2023-08-06 08:25:04 -04:00
|
|
|
// SPDX-FileCopyrightText: 2023 Joshua Goins <josh@redstrate.com>
|
|
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
2025-03-31 15:33:57 -04:00
|
|
|
use binrw::binrw;
|
|
|
|
|
|
|
|
#[binrw]
|
|
|
|
#[brw(repr = u8)]
|
2025-03-13 00:05:14 -04:00
|
|
|
#[derive(PartialEq, Eq, Clone, Debug)]
|
2022-07-19 19:29:41 -04:00
|
|
|
#[repr(u8)]
|
2022-07-27 21:41:05 -04:00
|
|
|
/// Gender of the character.
|
2022-07-19 19:29:41 -04:00
|
|
|
pub enum Gender {
|
2025-03-31 15:33:57 -04:00
|
|
|
Male = 0,
|
|
|
|
Female = 1,
|
2022-07-19 19:29:41 -04:00
|
|
|
}
|
|
|
|
|
2025-03-31 15:33:57 -04:00
|
|
|
#[binrw]
|
|
|
|
#[brw(repr = u8)]
|
2025-03-13 00:05:14 -04:00
|
|
|
#[derive(PartialEq, Eq, Clone, Debug)]
|
2022-07-19 19:29:41 -04:00
|
|
|
#[repr(u8)]
|
2025-03-31 15:38:42 -04:00
|
|
|
/// The race's "tribe". Each race has two tribes, which are usually very similar (even down to the ids!)
|
|
|
|
/// with the exception of Hyurs, which have two very distinct tribes.
|
|
|
|
pub enum Tribe {
|
2025-03-31 15:33:57 -04:00
|
|
|
Midlander = 1,
|
|
|
|
Highlander = 2,
|
|
|
|
Wildwood = 3,
|
|
|
|
Duskwight = 4,
|
|
|
|
Plainsfolk = 5,
|
|
|
|
Dunesfolk = 6,
|
|
|
|
Seeker = 7,
|
|
|
|
Keeper = 8,
|
|
|
|
SeaWolf = 9,
|
|
|
|
Hellsguard = 10,
|
|
|
|
Raen = 11,
|
|
|
|
Xaela = 12,
|
|
|
|
Hellion = 13,
|
|
|
|
Lost = 14,
|
|
|
|
Rava = 15,
|
|
|
|
Veena = 16,
|
2022-07-19 19:29:41 -04:00
|
|
|
}
|
|
|
|
|
2025-03-31 15:33:57 -04:00
|
|
|
#[binrw]
|
|
|
|
#[brw(repr = u8)]
|
2025-03-13 00:05:14 -04:00
|
|
|
#[derive(PartialEq, Eq, Clone, Debug)]
|
2022-07-19 19:29:41 -04:00
|
|
|
#[repr(u8)]
|
2022-07-27 21:41:05 -04:00
|
|
|
/// The major races of Eorzea.
|
2022-07-19 19:29:41 -04:00
|
|
|
pub enum Race {
|
2025-03-31 15:33:57 -04:00
|
|
|
Hyur = 1,
|
|
|
|
Elezen = 2,
|
|
|
|
Lalafell = 3,
|
|
|
|
Miqote = 4,
|
|
|
|
Roegadyn = 5,
|
|
|
|
AuRa = 6,
|
|
|
|
Hrothgar = 7,
|
|
|
|
Viera = 8,
|
2022-07-19 19:29:41 -04:00
|
|
|
}
|
|
|
|
|
2025-03-31 15:38:42 -04:00
|
|
|
/// Gets a proper race identifier (such as 101, for Hyur-Midlander-Males) given a race, a tribe,
|
2022-07-19 19:29:41 -04:00
|
|
|
/// and a gender.
|
2025-03-31 15:38:42 -04:00
|
|
|
pub fn get_race_id(race: Race, tribe: Tribe, gender: Gender) -> Option<i32> {
|
|
|
|
// TODO: should we check for invalid tribes like the Hyur branch does?
|
2024-04-16 21:14:59 -04:00
|
|
|
match race {
|
2025-03-31 15:38:42 -04:00
|
|
|
Race::Hyur => match tribe {
|
|
|
|
Tribe::Midlander => match gender {
|
2024-04-20 13:18:03 -04:00
|
|
|
Gender::Male => Some(101),
|
|
|
|
Gender::Female => Some(201),
|
|
|
|
},
|
2025-03-31 15:38:42 -04:00
|
|
|
Tribe::Highlander => match gender {
|
2024-04-20 13:18:03 -04:00
|
|
|
Gender::Male => Some(301),
|
|
|
|
Gender::Female => Some(401),
|
|
|
|
},
|
|
|
|
_ => None,
|
|
|
|
},
|
|
|
|
Race::Elezen => match gender {
|
|
|
|
Gender::Male => Some(501),
|
|
|
|
Gender::Female => Some(601),
|
|
|
|
},
|
|
|
|
Race::Lalafell => match gender {
|
|
|
|
Gender::Male => Some(501),
|
|
|
|
Gender::Female => Some(601),
|
|
|
|
},
|
|
|
|
Race::Miqote => match gender {
|
|
|
|
Gender::Male => Some(701),
|
|
|
|
Gender::Female => Some(801),
|
|
|
|
},
|
|
|
|
Race::Roegadyn => match gender {
|
|
|
|
Gender::Male => Some(901),
|
|
|
|
Gender::Female => Some(1001),
|
|
|
|
},
|
|
|
|
Race::AuRa => match gender {
|
|
|
|
Gender::Male => Some(1301),
|
|
|
|
Gender::Female => Some(1401),
|
|
|
|
},
|
2024-04-16 21:14:59 -04:00
|
|
|
Race::Hrothgar => {
|
|
|
|
match gender {
|
|
|
|
Gender::Male => Some(1501),
|
2024-04-20 13:18:03 -04:00
|
|
|
Gender::Female => Some(1601), // TODO: is this accurate as of dawntrail?
|
2024-04-16 21:14:59 -04:00
|
|
|
}
|
|
|
|
}
|
2024-04-20 13:18:03 -04:00
|
|
|
Race::Viera => match gender {
|
|
|
|
Gender::Male => Some(1701),
|
|
|
|
Gender::Female => Some(1801),
|
|
|
|
},
|
2024-04-16 21:14:59 -04:00
|
|
|
}
|
2022-07-19 19:29:41 -04:00
|
|
|
}
|
|
|
|
|
2025-03-31 15:38:42 -04:00
|
|
|
/// Builds the path to the skeleton (sklb) file for a given `race`, `tribe` and `gender`.
|
|
|
|
pub fn build_skeleton_path(race: Race, tribe: Tribe, gender: Gender) -> String {
|
2022-10-13 13:25:57 -04:00
|
|
|
format!(
|
|
|
|
"chara/human/c{0:04}/skeleton/base/b0001/skl_c{0:04}b0001.sklb",
|
2025-03-31 15:38:42 -04:00
|
|
|
get_race_id(race, tribe, gender).unwrap()
|
2022-10-13 13:25:57 -04:00
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2025-03-31 15:38:42 -04:00
|
|
|
/// Returns the two tribes associated with a given `race`. For example, `Hyur` would return `[Midlander, Highlander]`.
|
|
|
|
pub fn get_supported_tribes(race: Race) -> [Tribe; 2] {
|
2023-07-07 16:03:01 -04:00
|
|
|
match race {
|
2025-03-31 15:38:42 -04:00
|
|
|
Race::Hyur => [Tribe::Midlander, Tribe::Highlander],
|
|
|
|
Race::Elezen => [Tribe::Wildwood, Tribe::Duskwight],
|
|
|
|
Race::Lalafell => [Tribe::Plainsfolk, Tribe::Dunesfolk],
|
|
|
|
Race::Miqote => [Tribe::Seeker, Tribe::Keeper],
|
|
|
|
Race::Roegadyn => [Tribe::SeaWolf, Tribe::Hellsguard],
|
|
|
|
Race::AuRa => [Tribe::Raen, Tribe::Xaela],
|
|
|
|
Race::Hrothgar => [Tribe::Hellion, Tribe::Lost],
|
|
|
|
Race::Viera => [Tribe::Raen, Tribe::Veena],
|
2023-07-07 16:03:01 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-07-19 19:29:41 -04:00
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
2023-07-07 16:03:01 -04:00
|
|
|
use super::*;
|
|
|
|
|
2022-07-19 19:29:41 -04:00
|
|
|
#[test]
|
2024-04-16 21:14:59 -04:00
|
|
|
fn test_convert_race_num() {
|
2022-08-16 11:52:07 -04:00
|
|
|
assert_eq!(
|
2025-03-31 15:38:42 -04:00
|
|
|
get_race_id(Race::Roegadyn, Tribe::SeaWolf, Gender::Male),
|
2024-04-16 21:14:59 -04:00
|
|
|
Some(901)
|
2022-08-16 11:52:07 -04:00
|
|
|
);
|
2022-07-19 19:29:41 -04:00
|
|
|
}
|
2022-08-16 11:52:07 -04:00
|
|
|
}
|