Skip to content

Commit

Permalink
Small fixes and organizational improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
widberg committed Jul 12, 2023
1 parent ecf43d3 commit 1e6c732
Show file tree
Hide file tree
Showing 8 changed files with 178 additions and 138 deletions.
2 changes: 2 additions & 0 deletions bff-cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@ mod lz;

#[derive(Subcommand)]
enum Commands {
#[clap(alias = "x")]
Extract {
bigfile: PathBuf,
directory: PathBuf,
},
#[clap(alias = "t")]
Info {
bigfile: PathBuf,
},
Expand Down
47 changes: 47 additions & 0 deletions bff/src/class/bitmap/mod.rs
Original file line number Diff line number Diff line change
@@ -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<u8>,
}

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<Bitmap> {
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(),
),
}
}
}
68 changes: 16 additions & 52 deletions bff/src/class/bitmap.rs → bff/src/class/bitmap/v1_291_03_06_pc.rs
Original file line number Diff line number Diff line change
@@ -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<u8>,
}

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<Bitmap> {
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<BitmapV1_291_03_06PC> for Bitmap {
fn from(bitmap: BitmapV1_291_03_06PC) -> Self {
Bitmap {
impl From<Bitmap> for BitmapV1_291_03_06PC {
fn from(bitmap: Bitmap) -> Self {
BitmapV1_291_03_06PC {
size: bitmap.size,
flag: bitmap.flag,
format: bitmap.format,
Expand All @@ -59,23 +37,9 @@ impl From<BitmapV1_291_03_06PC> 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<u8>,
}

impl From<Bitmap> for BitmapV1_291_03_06PC {
fn from(bitmap: Bitmap) -> Self {
BitmapV1_291_03_06PC {
impl From<BitmapV1_291_03_06PC> for Bitmap {
fn from(bitmap: BitmapV1_291_03_06PC) -> Self {
Bitmap {
size: bitmap.size,
flag: bitmap.flag,
format: bitmap.format,
Expand Down
46 changes: 46 additions & 0 deletions bff/src/class/sound/mod.rs
Original file line number Diff line number Diff line change
@@ -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<u32>,
sound_type: Option<u16>,
data: Vec<i16>,
}

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<Sound> {
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(),
),
}
}
}
64 changes: 15 additions & 49 deletions bff/src/class/sound.rs → bff/src/class/sound/v1_291_03_06_pc.rs
Original file line number Diff line number Diff line change
@@ -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<u32>,
sound_type: Option<u16>,
data: Vec<i16>,
}

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<Sound> {
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<SoundV1_291_03_06PC> 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)]
Expand All @@ -78,6 +33,17 @@ impl From<Sound> for SoundV1_291_03_06PC {
}
}

impl From<SoundV1_291_03_06PC> 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;

Expand Down
44 changes: 44 additions & 0 deletions bff/src/class/user_define/mod.rs
Original file line number Diff line number Diff line change
@@ -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<UserDefine> {
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(),
),
}
}
}
Original file line number Diff line number Diff line change
@@ -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<UserDefine> {
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<UserDefineV1_291_03_06PC> for UserDefine {
fn from(user_define: UserDefineV1_291_03_06PC) -> Self {
Expand Down
5 changes: 4 additions & 1 deletion bff/src/traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Self>,
{
const NAME: Name;
}

0 comments on commit 1e6c732

Please sign in to comment.