From 1e6c732fca78c53b58e0dc84f063134153d7c0a8 Mon Sep 17 00:00:00 2001 From: widberg Date: Wed, 12 Jul 2023 19:45:04 -0400 Subject: [PATCH] Small fixes and organizational improvements --- bff-cli/src/main.rs | 2 + bff/src/class/bitmap/mod.rs | 47 +++++++++++++ .../{bitmap.rs => bitmap/v1_291_03_06_pc.rs} | 68 +++++-------------- bff/src/class/sound/mod.rs | 46 +++++++++++++ .../{sound.rs => sound/v1_291_03_06_pc.rs} | 64 ++++------------- bff/src/class/user_define/mod.rs | 44 ++++++++++++ .../v1_291_03_06_pc.rs} | 40 ++--------- bff/src/traits.rs | 5 +- 8 files changed, 178 insertions(+), 138 deletions(-) create mode 100644 bff/src/class/bitmap/mod.rs rename bff/src/class/{bitmap.rs => bitmap/v1_291_03_06_pc.rs} (60%) create mode 100644 bff/src/class/sound/mod.rs rename bff/src/class/{sound.rs => sound/v1_291_03_06_pc.rs} (59%) create mode 100644 bff/src/class/user_define/mod.rs rename bff/src/class/{user_define.rs => user_define/v1_291_03_06_pc.rs} (53%) diff --git a/bff-cli/src/main.rs b/bff-cli/src/main.rs index 038ae9b..bb3cfad 100644 --- a/bff-cli/src/main.rs +++ b/bff-cli/src/main.rs @@ -13,10 +13,12 @@ mod lz; #[derive(Subcommand)] enum Commands { + #[clap(alias = "x")] Extract { bigfile: PathBuf, directory: PathBuf, }, + #[clap(alias = "t")] Info { bigfile: PathBuf, }, diff --git a/bff/src/class/bitmap/mod.rs b/bff/src/class/bitmap/mod.rs new file mode 100644 index 0000000..bb4108f --- /dev/null +++ b/bff/src/class/bitmap/mod.rs @@ -0,0 +1,47 @@ +use serde::Serialize; + +use crate::error::{Error, UnimplementedClassError}; +use crate::name::Name; +use crate::object::Object; +use crate::platforms::Platform; +use crate::traits::{ShadowClass, TryFromVersionPlatform}; +use crate::versions::Version; +use crate::{crc32, BffResult}; + +mod v1_291_03_06_pc; +use v1_291_03_06_pc::BitmapV1_291_03_06PC; + +#[derive(Serialize, Debug)] +pub struct Bitmap { + size: (u32, u32), + flag: u16, + format: u8, + mipmap_count: u8, + unknown: u8, + data: Vec, +} + +impl ShadowClass for Bitmap { + const NAME: Name = crc32::asobo(b"Bitmap_Z"); +} + +impl TryFromVersionPlatform<&Object> for Bitmap { + type Error = Error; + + fn try_from_version_platform( + object: &Object, + version: Version, + platform: Platform, + ) -> BffResult { + match (version, platform) { + (Version::V1_291_03_06, Platform::PC) => { + let bitmap: BitmapV1_291_03_06PC = + BitmapV1_291_03_06PC::try_from_version_platform(object, version, platform)?; + Ok(bitmap.into()) + } + _ => Err( + UnimplementedClassError::new(object.name(), Self::NAME, version, platform).into(), + ), + } + } +} diff --git a/bff/src/class/bitmap.rs b/bff/src/class/bitmap/v1_291_03_06_pc.rs similarity index 60% rename from bff/src/class/bitmap.rs rename to bff/src/class/bitmap/v1_291_03_06_pc.rs index 5910bad..510a291 100644 --- a/bff/src/class/bitmap.rs +++ b/bff/src/class/bitmap/v1_291_03_06_pc.rs @@ -1,54 +1,32 @@ use std::io::Cursor; use binrw::{binread, BinRead}; -use serde::Serialize; -use crate::error::{Error, UnimplementedClassError}; -use crate::name::Name; +use super::Bitmap; +use crate::error::Error; use crate::object::Object; use crate::platforms::{platform_to_endian, Platform}; -use crate::traits::{ShadowClass, TryFromVersionPlatform}; +use crate::traits::TryFromVersionPlatform; use crate::versions::Version; -use crate::{crc32, BffResult}; +use crate::BffResult; -#[derive(Serialize, Debug)] -pub struct Bitmap { +#[binread] +#[derive(Debug)] +pub struct BitmapV1_291_03_06PC { size: (u32, u32), + #[br(temp)] + precalculated_size: u32, flag: u16, format: u8, mipmap_count: u8, unknown: u8, + #[br(count = precalculated_size)] data: Vec, } -impl ShadowClass for Bitmap { - const NAME: Name = crc32::asobo(b"Bitmap_Z"); -} - -impl TryFromVersionPlatform<&Object> for Bitmap { - type Error = Error; - - fn try_from_version_platform( - object: &Object, - version: Version, - platform: Platform, - ) -> BffResult { - match (version, platform) { - (Version::V1_291_03_06, Platform::PC) => { - let bitmap: BitmapV1_291_03_06PC = - BitmapV1_291_03_06PC::try_from_version_platform(object, version, platform)?; - Ok(bitmap.into()) - } - _ => Err( - UnimplementedClassError::new(object.name(), Self::NAME, version, platform).into(), - ), - } - } -} - -impl From for Bitmap { - fn from(bitmap: BitmapV1_291_03_06PC) -> Self { - Bitmap { +impl From for BitmapV1_291_03_06PC { + fn from(bitmap: Bitmap) -> Self { + BitmapV1_291_03_06PC { size: bitmap.size, flag: bitmap.flag, format: bitmap.format, @@ -59,23 +37,9 @@ impl From for Bitmap { } } -#[binread] -#[derive(Debug)] -pub struct BitmapV1_291_03_06PC { - size: (u32, u32), - #[br(temp)] - precalculated_size: u32, - flag: u16, - format: u8, - mipmap_count: u8, - unknown: u8, - #[br(count = precalculated_size)] - data: Vec, -} - -impl From for BitmapV1_291_03_06PC { - fn from(bitmap: Bitmap) -> Self { - BitmapV1_291_03_06PC { +impl From for Bitmap { + fn from(bitmap: BitmapV1_291_03_06PC) -> Self { + Bitmap { size: bitmap.size, flag: bitmap.flag, format: bitmap.format, diff --git a/bff/src/class/sound/mod.rs b/bff/src/class/sound/mod.rs new file mode 100644 index 0000000..732e518 --- /dev/null +++ b/bff/src/class/sound/mod.rs @@ -0,0 +1,46 @@ +use serde::Serialize; + +use crate::error::{Error, UnimplementedClassError}; +use crate::name::Name; +use crate::object::Object; +use crate::platforms::Platform; +use crate::traits::{ShadowClass, TryFromVersionPlatform}; +use crate::versions::Version; +use crate::{crc32, BffResult}; + +mod v1_291_03_06_pc; + +use v1_291_03_06_pc::SoundV1_291_03_06PC; + +#[derive(Serialize, Debug)] +pub struct Sound { + sample_rate: u32, + data_size: Option, + sound_type: Option, + data: Vec, +} + +impl ShadowClass for Sound { + const NAME: Name = crc32::asobo(b"Sound_Z"); +} + +impl TryFromVersionPlatform<&Object> for Sound { + type Error = Error; + + fn try_from_version_platform( + object: &Object, + version: Version, + platform: Platform, + ) -> BffResult { + match (version, platform) { + (Version::V1_291_03_06, Platform::PC) => { + let sound: SoundV1_291_03_06PC = + SoundV1_291_03_06PC::try_from_version_platform(object, version, platform)?; + Ok(sound.into()) + } + _ => Err( + UnimplementedClassError::new(object.name(), Self::NAME, version, platform).into(), + ), + } + } +} diff --git a/bff/src/class/sound.rs b/bff/src/class/sound/v1_291_03_06_pc.rs similarity index 59% rename from bff/src/class/sound.rs rename to bff/src/class/sound/v1_291_03_06_pc.rs index 095c965..c962b44 100644 --- a/bff/src/class/sound.rs +++ b/bff/src/class/sound/v1_291_03_06_pc.rs @@ -1,59 +1,14 @@ use std::io::Cursor; use binrw::{binread, BinRead}; -use serde::Serialize; -use crate::error::{Error, UnimplementedClassError}; -use crate::name::Name; +use super::Sound; +use crate::error::Error; use crate::object::Object; use crate::platforms::{platform_to_endian, Platform}; -use crate::traits::{ShadowClass, TryFromVersionPlatform}; +use crate::traits::TryFromVersionPlatform; use crate::versions::Version; -use crate::{crc32, BffResult}; - -#[derive(Serialize, Debug)] -pub struct Sound { - sample_rate: u32, - data_size: Option, - sound_type: Option, - data: Vec, -} - -impl ShadowClass for Sound { - const NAME: Name = crc32::asobo(b"Sound_Z"); -} - -impl TryFromVersionPlatform<&Object> for Sound { - type Error = Error; - - fn try_from_version_platform( - object: &Object, - version: Version, - platform: Platform, - ) -> BffResult { - match (version, platform) { - (Version::V1_291_03_06, Platform::PC) => { - let sound: SoundV1_291_03_06PC = - SoundV1_291_03_06PC::try_from_version_platform(object, version, platform)?; - Ok(sound.into()) - } - _ => Err( - UnimplementedClassError::new(object.name(), Self::NAME, version, platform).into(), - ), - } - } -} - -impl From for Sound { - fn from(sound: SoundV1_291_03_06PC) -> Self { - Sound { - sample_rate: sound.sample_rate, - data_size: sound.data_size, - sound_type: sound.sound_type, - data: sound.data, - } - } -} +use crate::BffResult; #[binread] #[derive(Debug)] @@ -78,6 +33,17 @@ impl From for SoundV1_291_03_06PC { } } +impl From for Sound { + fn from(sound: SoundV1_291_03_06PC) -> Self { + Sound { + sample_rate: sound.sample_rate, + data_size: sound.data_size, + sound_type: sound.sound_type, + data: sound.data, + } + } +} + impl TryFromVersionPlatform<&Object> for SoundV1_291_03_06PC { type Error = Error; diff --git a/bff/src/class/user_define/mod.rs b/bff/src/class/user_define/mod.rs new file mode 100644 index 0000000..ea21781 --- /dev/null +++ b/bff/src/class/user_define/mod.rs @@ -0,0 +1,44 @@ +use ascii::AsciiString; +use serde::Serialize; + +use crate::error::{Error, UnimplementedClassError}; +use crate::name::Name; +use crate::object::Object; +use crate::platforms::Platform; +use crate::traits::{ShadowClass, TryFromVersionPlatform}; +use crate::versions::Version; +use crate::{crc32, BffResult}; + +mod v1_291_03_06_pc; + +use v1_291_03_06_pc::UserDefineV1_291_03_06PC; + +#[derive(Serialize, Debug)] +pub struct UserDefine { + data: AsciiString, +} + +impl ShadowClass for UserDefine { + const NAME: Name = crc32::asobo(b"UserDefine_Z"); +} + +impl TryFromVersionPlatform<&Object> for UserDefine { + type Error = Error; + + fn try_from_version_platform( + object: &Object, + version: Version, + platform: Platform, + ) -> BffResult { + match (version, platform) { + (Version::V1_291_03_06, Platform::PC) => { + let user_define: UserDefineV1_291_03_06PC = + UserDefineV1_291_03_06PC::try_from_version_platform(object, version, platform)?; + Ok(user_define.into()) + } + _ => Err( + UnimplementedClassError::new(object.name(), Self::NAME, version, platform).into(), + ), + } + } +} diff --git a/bff/src/class/user_define.rs b/bff/src/class/user_define/v1_291_03_06_pc.rs similarity index 53% rename from bff/src/class/user_define.rs rename to bff/src/class/user_define/v1_291_03_06_pc.rs index 3e64718..62fb2a5 100644 --- a/bff/src/class/user_define.rs +++ b/bff/src/class/user_define/v1_291_03_06_pc.rs @@ -1,47 +1,15 @@ use std::io::Cursor; -use ascii::AsciiString; use binrw::BinRead; -use serde::Serialize; -use crate::error::{Error, UnimplementedClassError}; -use crate::name::Name; +use super::UserDefine; +use crate::error::Error; use crate::object::Object; use crate::platforms::{platform_to_endian, Platform}; use crate::strings::PascalString; -use crate::traits::{ShadowClass, TryFromVersionPlatform}; +use crate::traits::TryFromVersionPlatform; use crate::versions::Version; -use crate::{crc32, BffResult}; - -#[derive(Serialize, Debug)] -pub struct UserDefine { - data: AsciiString, -} - -impl ShadowClass for UserDefine { - const NAME: Name = crc32::asobo(b"UserDefine_Z"); -} - -impl TryFromVersionPlatform<&Object> for UserDefine { - type Error = Error; - - fn try_from_version_platform( - object: &Object, - version: Version, - platform: Platform, - ) -> BffResult { - match (version, platform) { - (Version::V1_291_03_06, Platform::PC) => { - let user_define: UserDefineV1_291_03_06PC = - UserDefineV1_291_03_06PC::try_from_version_platform(object, version, platform)?; - Ok(user_define.into()) - } - _ => Err( - UnimplementedClassError::new(object.name(), Self::NAME, version, platform).into(), - ), - } - } -} +use crate::BffResult; impl From for UserDefine { fn from(user_define: UserDefineV1_291_03_06PC) -> Self { diff --git a/bff/src/traits.rs b/bff/src/traits.rs index 74fa6ee..5f83c7b 100644 --- a/bff/src/traits.rs +++ b/bff/src/traits.rs @@ -40,6 +40,9 @@ where } } -pub trait ShadowClass: Sized + Serialize + for<'a> TryFromVersionPlatform<&'a Object> { +pub trait ShadowClass: Sized + Serialize +where + for<'a> &'a Object: TryIntoVersionPlatform, +{ const NAME: Name; }