1
Fork 0
mirror of https://github.com/redstrate/Physis.git synced 2025-04-26 14:17: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:
Joshua Goins 2024-04-16 21:14:59 -04:00
parent f067b653b1
commit da774529da
4 changed files with 65 additions and 90 deletions

View file

@ -61,7 +61,6 @@ libz-sys = { version = "1.1" }
# nice to have features rust is lacking at the moment
modular-bitfield = "0.11"
paste = "1"
# needed for half-float support which FFXIV uses in its model data
half = { version = "2", optional = true }

View file

@ -48,9 +48,6 @@ pub mod common;
/// Methods for installing game and boot patches.
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.
pub mod blowfish;

View file

@ -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
}
}
};
}

View file

@ -46,52 +46,71 @@ pub enum Race {
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,
/// and a gender.
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`.
@ -118,15 +137,13 @@ pub fn get_supported_subraces(race: Race) -> [Subrace; 2] {
#[cfg(test)]
mod tests {
use crate::race::internal_race::{convert_to_internal, RaceTest};
use super::*;
#[test]
fn test_convert_to_internal() {
fn test_convert_race_num() {
assert_eq!(
convert_to_internal(Race::Hyur, Subrace::Midlander, Gender::Female).unwrap(),
RaceTest::HyurMidlanderFemale
get_race_id(Race::Roegadyn, Subrace::SeaWolf, Gender::Male),
Some(901)
);
}
}