mirror of
https://github.com/redstrate/Physis.git
synced 2025-04-27 06:27:45 +00:00
Remove overcomplicated internal race macro to a big match statement
There's really no reason to use macros for this, let's rewrite it in a big match statement.
This commit is contained in:
parent
f067b653b1
commit
da774529da
4 changed files with 65 additions and 90 deletions
|
@ -61,7 +61,6 @@ libz-sys = { version = "1.1" }
|
||||||
|
|
||||||
# nice to have features rust is lacking at the moment
|
# nice to have features rust is lacking at the moment
|
||||||
modular-bitfield = "0.11"
|
modular-bitfield = "0.11"
|
||||||
paste = "1"
|
|
||||||
|
|
||||||
# needed for half-float support which FFXIV uses in its model data
|
# needed for half-float support which FFXIV uses in its model data
|
||||||
half = { version = "2", optional = true }
|
half = { version = "2", optional = true }
|
||||||
|
|
|
@ -48,9 +48,6 @@ pub mod common;
|
||||||
/// Methods for installing game and boot patches.
|
/// Methods for installing game and boot patches.
|
||||||
pub mod patch;
|
pub mod patch;
|
||||||
|
|
||||||
#[macro_use]
|
|
||||||
mod macros;
|
|
||||||
|
|
||||||
/// Implementation of the Blowfish ECB block cipher used by the retail client. It's used to encrypt arguments in the launcher, to prevent login token snooping.
|
/// Implementation of the Blowfish ECB block cipher used by the retail client. It's used to encrypt arguments in the launcher, to prevent login token snooping.
|
||||||
pub mod blowfish;
|
pub mod blowfish;
|
||||||
|
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2023 Joshua Goins <josh@redstrate.com>
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
/// Creates a enum list of combined race identifiers. For example, (Hyur, Midlander, Male) becomes a new variant called HyurMidlanderMale.
|
|
||||||
#[macro_export]
|
|
||||||
#[doc(hidden)]
|
|
||||||
macro_rules! define_race_enum {
|
|
||||||
(
|
|
||||||
pub enum $name:ident {
|
|
||||||
$(
|
|
||||||
$([$id:expr]($race:ident, $gender:ident $(, $subrace:ident)?))*
|
|
||||||
),+$(,)?
|
|
||||||
}
|
|
||||||
) => {
|
|
||||||
paste! {
|
|
||||||
#[derive(PartialEq, Eq, Debug)]
|
|
||||||
|
|
||||||
pub enum $name {
|
|
||||||
$(
|
|
||||||
$([<$race $($subrace)? $gender>] = $id)*
|
|
||||||
,
|
|
||||||
)+
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
paste! {
|
|
||||||
pub fn convert_to_internal(race : Race, subrace : Subrace, gender : Gender) -> Option<$name> {
|
|
||||||
$(
|
|
||||||
$(if race == $race $(&& subrace == $subrace)? && gender == $gender {
|
|
||||||
return Some($name::[<$race $($subrace)? $gender>])
|
|
||||||
})*
|
|
||||||
)+
|
|
||||||
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
113
src/race.rs
113
src/race.rs
|
@ -46,52 +46,71 @@ pub enum Race {
|
||||||
Viera,
|
Viera,
|
||||||
}
|
}
|
||||||
|
|
||||||
mod internal_race {
|
|
||||||
use paste::paste;
|
|
||||||
|
|
||||||
use crate::define_race_enum;
|
|
||||||
use crate::race::Gender;
|
|
||||||
use crate::race::Gender::*;
|
|
||||||
use crate::race::Race;
|
|
||||||
use crate::race::Race::*;
|
|
||||||
use crate::race::Subrace;
|
|
||||||
use crate::race::Subrace::*;
|
|
||||||
|
|
||||||
define_race_enum! {
|
|
||||||
pub enum RaceTest {
|
|
||||||
[101](Hyur, Male, Midlander),
|
|
||||||
[201](Hyur, Female, Midlander),
|
|
||||||
[301](Hyur, Male, Highlander),
|
|
||||||
[401](Hyur, Female, Highlander),
|
|
||||||
|
|
||||||
[501](Elezen, Male),
|
|
||||||
[601](Elezen, Female),
|
|
||||||
|
|
||||||
[701](Miqote, Male),
|
|
||||||
[801](Miqote, Female),
|
|
||||||
|
|
||||||
[901](Roegadyn, Male),
|
|
||||||
[1001](Roegadyn, Female),
|
|
||||||
|
|
||||||
[1101](Lalafell, Male),
|
|
||||||
[1201](Lalafell, Female),
|
|
||||||
|
|
||||||
[1301](AuRa, Male),
|
|
||||||
[1401](AuRa, Female),
|
|
||||||
|
|
||||||
[1501](Hrothgar, Male),
|
|
||||||
[1601](Hrothgar, Female),
|
|
||||||
|
|
||||||
[1701](Viera, Male),
|
|
||||||
[1801](Viera, Female)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Gets a proper race identifier (such as 101, for Hyur-Midlander-Males) given a race, a subrace,
|
/// Gets a proper race identifier (such as 101, for Hyur-Midlander-Males) given a race, a subrace,
|
||||||
/// and a gender.
|
/// and a gender.
|
||||||
pub fn get_race_id(race: Race, subrace: Subrace, gender: Gender) -> Option<i32> {
|
pub fn get_race_id(race: Race, subrace: Subrace, gender: Gender) -> Option<i32> {
|
||||||
Some(internal_race::convert_to_internal(race, subrace, gender).unwrap() as i32)
|
// TODO: should we check for invalid subraces like the Hyur branch does?
|
||||||
|
match race {
|
||||||
|
Race::Hyur => {
|
||||||
|
match subrace {
|
||||||
|
Subrace::Midlander => {
|
||||||
|
match gender {
|
||||||
|
Gender::Male => Some(101),
|
||||||
|
Gender::Female => Some(201)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Subrace::Highlander => {
|
||||||
|
match gender {
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Race::Hrothgar => {
|
||||||
|
match gender {
|
||||||
|
Gender::Male => Some(1501),
|
||||||
|
Gender::Female => Some(1601) // TODO: is this accurate as of dawntrail?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Race::Viera => {
|
||||||
|
match gender {
|
||||||
|
Gender::Male => Some(1701),
|
||||||
|
Gender::Female => Some(1801)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Builds the path to the skeleton (sklb) file for a given `race`, `subrace` and `gender`.
|
/// Builds the path to the skeleton (sklb) file for a given `race`, `subrace` and `gender`.
|
||||||
|
@ -118,15 +137,13 @@ pub fn get_supported_subraces(race: Race) -> [Subrace; 2] {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::race::internal_race::{convert_to_internal, RaceTest};
|
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_convert_to_internal() {
|
fn test_convert_race_num() {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
convert_to_internal(Race::Hyur, Subrace::Midlander, Gender::Female).unwrap(),
|
get_race_id(Race::Roegadyn, Subrace::SeaWolf, Gender::Male),
|
||||||
RaceTest::HyurMidlanderFemale
|
Some(901)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue