From d33da9dfcff9a8056d55f3eda0dadb4b0dee9a1f Mon Sep 17 00:00:00 2001 From: widberg Date: Sun, 1 Oct 2023 14:40:46 -0400 Subject: [PATCH] Towards an opaque name type Add a Names struct for reading and writing name files. Add a simple driver command for this struct for testing. Use signed integers for name types to match the name file format. --- bff-cli/src/crc32.rs | 8 +-- bff-cli/src/crc64.rs | 2 +- bff-cli/src/main.rs | 16 +++-- bff-cli/src/names.rs | 14 ++++ bff-derive/src/lib.rs | 2 +- bff/src/bigfile.rs | 2 +- bff/src/class/animation/v1_291_03_06_pc.rs | 2 +- bff/src/class/bitmap/v1_381_67_09_pc.rs | 2 +- bff/src/class/camera/v1_381_67_09_pc.rs | 2 +- .../class/collision_vol/v1_291_03_06_pc.rs | 2 +- .../class/collision_vol/v1_381_67_09_pc.rs | 2 +- bff/src/class/fonts/v1_381_67_09_pc.rs | 2 +- bff/src/class/game_obj/v1_291_03_06_pc.rs | 2 +- bff/src/class/game_obj/v1_381_67_09_pc.rs | 2 +- bff/src/class/gen_world/v1_381_67_09_pc.rs | 2 +- bff/src/class/gw_road/v1_381_67_09_pc.rs | 2 +- bff/src/class/lod/v1_06_63_02_pc.rs | 2 +- bff/src/class/lod/v1_291_03_06_pc.rs | 2 +- bff/src/class/lod/v1_381_67_09_pc.rs | 2 +- bff/src/class/lod_data/v1_06_63_02_pc.rs | 2 +- bff/src/class/lod_data/v1_291_03_06_pc.rs | 2 +- bff/src/class/lod_data/v1_381_67_09_pc.rs | 2 +- bff/src/class/material/v1_381_67_09_pc.rs | 2 +- .../class/material_anim/v1_381_67_09_pc.rs | 2 +- bff/src/class/material_obj/v1_381_67_09_pc.rs | 2 +- bff/src/class/mesh/v1_06_63_02_pc.rs | 2 +- bff/src/class/mesh/v1_291_03_06_pc.rs | 2 +- bff/src/class/mesh/v1_381_67_09_pc.rs | 2 +- bff/src/class/node/v1_291_03_06_pc.rs | 2 +- bff/src/class/node/v1_381_67_09_pc.rs | 2 +- bff/src/class/omni/v1_381_67_09_pc.rs | 2 +- bff/src/class/particles/v1_381_67_09_pc.rs | 2 +- bff/src/class/rot_shape/v1_291_03_06_pc.rs | 2 +- bff/src/class/rot_shape/v1_381_67_09_pc.rs | 2 +- bff/src/class/rtc/v1_381_67_09_pc.rs | 2 +- bff/src/class/skel/v1_06_63_02_pc.rs | 2 +- bff/src/class/skel/v1_291_03_06_pc.rs | 2 +- bff/src/class/skel/v1_381_67_09_pc.rs | 2 +- bff/src/class/skin/v1_291_03_06_pc.rs | 2 +- bff/src/class/skin/v1_381_67_09_pc.rs | 2 +- bff/src/class/sound/v1_381_67_09_pc.rs | 2 +- bff/src/class/surface/v1_291_03_06_pc.rs | 2 +- bff/src/class/surface/v1_381_67_09_pc.rs | 2 +- bff/src/class/trivial_class.rs | 2 +- bff/src/class/warp/v1_06_63_02_pc.rs | 2 +- bff/src/class/world/v1_06_63_02_pc.rs | 2 +- bff/src/class/world/v1_291_03_06_pc.rs | 2 +- bff/src/class/world/v1_381_67_09_pc.rs | 2 +- bff/src/class/world_ref/v1_381_67_09_pc.rs | 2 +- bff/src/crc32.rs | 14 ++-- bff/src/crc64.rs | 3 +- bff/src/error.rs | 2 +- bff/src/keyframer.rs | 2 +- bff/src/lib.rs | 2 +- bff/src/link_header.rs | 2 +- bff/src/manifest.rs | 2 +- bff/src/math.rs | 2 +- bff/src/name.rs | 1 - bff/src/names.rs | 71 +++++++++++++++++++ bff/src/object.rs | 2 +- bff/src/pool.rs | 2 +- bff/src/traits.rs | 2 +- 62 files changed, 165 insertions(+), 72 deletions(-) create mode 100644 bff-cli/src/names.rs delete mode 100644 bff/src/name.rs create mode 100644 bff/src/names.rs diff --git a/bff-cli/src/crc32.rs b/bff-cli/src/crc32.rs index 86ff52b..e69c82c 100644 --- a/bff-cli/src/crc32.rs +++ b/bff-cli/src/crc32.rs @@ -24,13 +24,13 @@ pub enum Crc32Format { Hexadecimal, } -fn format_hash(hash: u32, format: &Crc32Format) -> String { +fn format_hash(hash: i32, format: &Crc32Format) -> String { match format { Crc32Format::Signed => { - format!("{}", hash as i32) + format!("{}", hash) } Crc32Format::Unsigned => { - format!("{}", hash) + format!("{}", hash as u32) } Crc32Format::Hexadecimal => { format!("{:#08x}", hash) @@ -40,7 +40,7 @@ fn format_hash(hash: u32, format: &Crc32Format) -> String { pub fn crc32( string: &Option, - starting: &u32, + starting: &i32, algorithm: &Crc32Algorithm, mode: &Crc32Mode, format: &Crc32Format, diff --git a/bff-cli/src/crc64.rs b/bff-cli/src/crc64.rs index dbe686c..5c20ad5 100644 --- a/bff-cli/src/crc64.rs +++ b/bff-cli/src/crc64.rs @@ -38,7 +38,7 @@ fn format_hash(hash: u64, format: &Crc64Format) -> String { pub fn crc64( string: &Option, - starting: &u64, + starting: &i64, algorithm: &Crc64Algorithm, mode: &Crc64Mode, format: &Crc64Format, diff --git a/bff-cli/src/main.rs b/bff-cli/src/main.rs index 97e0647..d25ff7a 100644 --- a/bff-cli/src/main.rs +++ b/bff-cli/src/main.rs @@ -11,6 +11,8 @@ mod info; mod lz; mod unlz; +mod names; + #[derive(Subcommand)] enum Commands { #[clap(alias = "x")] @@ -19,7 +21,9 @@ enum Commands { directory: PathBuf, }, #[clap(alias = "t")] - Info { bigfile: PathBuf }, + Info { + bigfile: PathBuf, + }, Crc32 { string: Option, #[arg( @@ -28,7 +32,7 @@ enum Commands { default_value_t = 0, help = "Starting value for the CRC-32 calculation" )] - starting: u32, + starting: i32, #[clap(value_enum)] #[arg(short, long, default_value_t = Crc32Algorithm::Asobo)] algorithm: Crc32Algorithm, @@ -36,7 +40,7 @@ enum Commands { #[arg(short, long, default_value_t = Crc32Mode::Lines)] mode: Crc32Mode, #[clap(value_enum)] - #[arg(short, long, default_value_t = Crc32Format::Unsigned)] + #[arg(short, long, default_value_t = Crc32Format::Signed)] format: Crc32Format, }, Crc64 { @@ -47,7 +51,7 @@ enum Commands { default_value_t = 0, help = "Starting value for the CRC-32 calculation" )] - starting: u64, + starting: i64, #[clap(value_enum)] #[arg(short, long, default_value_t = Crc64Algorithm::Asobo)] algorithm: Crc64Algorithm, @@ -55,7 +59,7 @@ enum Commands { #[arg(short, long, default_value_t = Crc64Mode::Lines)] mode: Crc64Mode, #[clap(value_enum)] - #[arg(short, long, default_value_t = Crc64Format::Unsigned)] + #[arg(short, long, default_value_t = Crc64Format::Signed)] format: Crc64Format, }, Unlz { @@ -68,6 +72,7 @@ enum Commands { #[arg(short, long, default_value_t = lz::LzEndian::Little)] endian: lz::LzEndian, }, + Names {}, } #[derive(Parser)] @@ -99,5 +104,6 @@ fn main() -> Result<(), Box> { } => crc64::crc64(string, starting, algorithm, mode, format), Commands::Unlz { endian } => unlz::unlz(endian), Commands::Lz { endian } => lz::lz(endian), + Commands::Names {} => names::names(), } } diff --git a/bff-cli/src/names.rs b/bff-cli/src/names.rs new file mode 100644 index 0000000..db391d8 --- /dev/null +++ b/bff-cli/src/names.rs @@ -0,0 +1,14 @@ +use std::io; + +use bff::names::Names; + +pub fn names() -> Result<(), Box> { + let mut names = Names::default(); + names.read(io::stdin().lock())?; + + println!("{:#?}", names); + + names.write(&mut io::stdout().lock())?; + + Ok(()) +} diff --git a/bff-derive/src/lib.rs b/bff-derive/src/lib.rs index 2b60367..aae2d5b 100644 --- a/bff-derive/src/lib.rs +++ b/bff-derive/src/lib.rs @@ -11,7 +11,7 @@ pub fn bff_named_class(input: TokenStream) -> TokenStream { quote! { impl crate::traits::NamedClass for #name { - const NAME: crate::name::Name = crate::crc32::asobo(#class_name.as_bytes()); + const NAME: crate::names::Name = crate::crc32::asobo(#class_name.as_bytes()); } } .into() diff --git a/bff/src/bigfile.rs b/bff/src/bigfile.rs index 3ada891..732da2d 100644 --- a/bff/src/bigfile.rs +++ b/bff/src/bigfile.rs @@ -7,7 +7,7 @@ use serde::Serialize; use crate::block::Block; use crate::header::*; use crate::manifest::*; -use crate::name::Name; +use crate::names::Name; use crate::object::Object; use crate::platforms::Platform; use crate::pool::Pool; diff --git a/bff/src/class/animation/v1_291_03_06_pc.rs b/bff/src/class/animation/v1_291_03_06_pc.rs index d37af62..8f10e8d 100644 --- a/bff/src/class/animation/v1_291_03_06_pc.rs +++ b/bff/src/class/animation/v1_291_03_06_pc.rs @@ -10,7 +10,7 @@ use crate::keyframer::{ KeyframerRot, KeyframerVec3fComp, }; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] struct AnimationNode { diff --git a/bff/src/class/bitmap/v1_381_67_09_pc.rs b/bff/src/class/bitmap/v1_381_67_09_pc.rs index 1e55613..411e625 100644 --- a/bff/src/class/bitmap/v1_381_67_09_pc.rs +++ b/bff/src/class/bitmap/v1_381_67_09_pc.rs @@ -3,7 +3,7 @@ use binrw::{BinRead, BinWrite}; use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] #[brw(repr = u16)] diff --git a/bff/src/class/camera/v1_381_67_09_pc.rs b/bff/src/class/camera/v1_381_67_09_pc.rs index f08e124..a0bc774 100644 --- a/bff/src/class/camera/v1_381_67_09_pc.rs +++ b/bff/src/class/camera/v1_381_67_09_pc.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; use crate::link_header::ObjectLinkHeaderV1_381_67_09PC; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] #[br(import(_link_header: &ObjectLinkHeaderV1_381_67_09PC))] diff --git a/bff/src/class/collision_vol/v1_291_03_06_pc.rs b/bff/src/class/collision_vol/v1_291_03_06_pc.rs index 61e188f..53815b4 100644 --- a/bff/src/class/collision_vol/v1_291_03_06_pc.rs +++ b/bff/src/class/collision_vol/v1_291_03_06_pc.rs @@ -5,7 +5,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ObjectLinkHeaderV1_06_63_02PC; use crate::math::Mat4f; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] struct CollisionVolInfo { diff --git a/bff/src/class/collision_vol/v1_381_67_09_pc.rs b/bff/src/class/collision_vol/v1_381_67_09_pc.rs index c4e6b10..cdc5ca3 100644 --- a/bff/src/class/collision_vol/v1_381_67_09_pc.rs +++ b/bff/src/class/collision_vol/v1_381_67_09_pc.rs @@ -5,7 +5,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ObjectLinkHeaderV1_381_67_09PC; use crate::math::Mat4f; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] struct CollisionVolInfo { diff --git a/bff/src/class/fonts/v1_381_67_09_pc.rs b/bff/src/class/fonts/v1_381_67_09_pc.rs index 2e27a40..cdcff3d 100644 --- a/bff/src/class/fonts/v1_381_67_09_pc.rs +++ b/bff/src/class/fonts/v1_381_67_09_pc.rs @@ -6,7 +6,7 @@ use crate::dynarray::DynArray; use crate::link_header::ResourceObjectLinkHeader; use crate::map::BffMap; use crate::math::Vec2f; -use crate::name::Name; +use crate::names::Name; type CharacterID = u32; diff --git a/bff/src/class/game_obj/v1_291_03_06_pc.rs b/bff/src/class/game_obj/v1_291_03_06_pc.rs index 38caad6..3cb65a2 100644 --- a/bff/src/class/game_obj/v1_291_03_06_pc.rs +++ b/bff/src/class/game_obj/v1_291_03_06_pc.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; -use crate::name::Name; +use crate::names::Name; #[derive(Debug, BinRead, Serialize, BinWrite, Deserialize)] #[br(import(_link_header: &()))] diff --git a/bff/src/class/game_obj/v1_381_67_09_pc.rs b/bff/src/class/game_obj/v1_381_67_09_pc.rs index ff03573..3bccfde 100644 --- a/bff/src/class/game_obj/v1_381_67_09_pc.rs +++ b/bff/src/class/game_obj/v1_381_67_09_pc.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ResourceObjectLinkHeader; -use crate::name::Name; +use crate::names::Name; use crate::strings::PascalStringNull; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] diff --git a/bff/src/class/gen_world/v1_381_67_09_pc.rs b/bff/src/class/gen_world/v1_381_67_09_pc.rs index c9dc190..6a65a53 100644 --- a/bff/src/class/gen_world/v1_381_67_09_pc.rs +++ b/bff/src/class/gen_world/v1_381_67_09_pc.rs @@ -6,7 +6,7 @@ use crate::dynarray::DynArray; use crate::link_header::ObjectLinkHeaderV1_381_67_09PC; use crate::map::BffMap; use crate::math::{Mat4f, Vec2f, Vec3f}; -use crate::name::Name; +use crate::names::Name; use crate::strings::{FixedStringNull, PascalStringNull}; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] diff --git a/bff/src/class/gw_road/v1_381_67_09_pc.rs b/bff/src/class/gw_road/v1_381_67_09_pc.rs index 762e9e1..4c03399 100644 --- a/bff/src/class/gw_road/v1_381_67_09_pc.rs +++ b/bff/src/class/gw_road/v1_381_67_09_pc.rs @@ -9,7 +9,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ResourceObjectLinkHeader; use crate::math::Vec2f; -use crate::name::Name; +use crate::names::Name; #[bitsize(7)] #[derive(TryFromBits, Debug, Serialize, Deserialize)] diff --git a/bff/src/class/lod/v1_06_63_02_pc.rs b/bff/src/class/lod/v1_06_63_02_pc.rs index 715e005..b6f6ac1 100644 --- a/bff/src/class/lod/v1_06_63_02_pc.rs +++ b/bff/src/class/lod/v1_06_63_02_pc.rs @@ -6,7 +6,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ObjectLinkHeaderV1_06_63_02PC; use crate::math::{DynBox, DynSphere, Vec3f}; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] struct ClassRes { diff --git a/bff/src/class/lod/v1_291_03_06_pc.rs b/bff/src/class/lod/v1_291_03_06_pc.rs index 23e1f8a..503c696 100644 --- a/bff/src/class/lod/v1_291_03_06_pc.rs +++ b/bff/src/class/lod/v1_291_03_06_pc.rs @@ -6,7 +6,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ObjectLinkHeaderV1_06_63_02PC; use crate::math::{DynBox, DynSphere, Vec3f}; -use crate::name::Name; +use crate::names::Name; use crate::option::BffOption; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] diff --git a/bff/src/class/lod/v1_381_67_09_pc.rs b/bff/src/class/lod/v1_381_67_09_pc.rs index 61ed057..ea382ec 100644 --- a/bff/src/class/lod/v1_381_67_09_pc.rs +++ b/bff/src/class/lod/v1_381_67_09_pc.rs @@ -6,7 +6,7 @@ use crate::dynarray::DynArray; use crate::link_header::ObjectLinkHeaderV1_381_67_09PC; use crate::map::BffMap; use crate::math::{DynBox, DynSphere}; -use crate::name::Name; +use crate::names::Name; use crate::option::BffOption; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] diff --git a/bff/src/class/lod_data/v1_06_63_02_pc.rs b/bff/src/class/lod_data/v1_06_63_02_pc.rs index 3f3ad68..8197f13 100644 --- a/bff/src/class/lod_data/v1_06_63_02_pc.rs +++ b/bff/src/class/lod_data/v1_06_63_02_pc.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::math::RGBA; -use crate::name::Name; +use crate::names::Name; use crate::option::BffOption; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] diff --git a/bff/src/class/lod_data/v1_291_03_06_pc.rs b/bff/src/class/lod_data/v1_291_03_06_pc.rs index 601137a..b2bae8b 100644 --- a/bff/src/class/lod_data/v1_291_03_06_pc.rs +++ b/bff/src/class/lod_data/v1_291_03_06_pc.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::math::Vec3f; -use crate::name::Name; +use crate::names::Name; use crate::option::BffOption; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] diff --git a/bff/src/class/lod_data/v1_381_67_09_pc.rs b/bff/src/class/lod_data/v1_381_67_09_pc.rs index be9d7bd..7c91890 100644 --- a/bff/src/class/lod_data/v1_381_67_09_pc.rs +++ b/bff/src/class/lod_data/v1_381_67_09_pc.rs @@ -5,7 +5,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::{ObjectDatasFlagsV1_381_67_09PC, ResourceObjectLinkHeader}; use crate::math::Vec3f; -use crate::name::Name; +use crate::names::Name; use crate::option::BffOption; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] diff --git a/bff/src/class/material/v1_381_67_09_pc.rs b/bff/src/class/material/v1_381_67_09_pc.rs index 600fcf3..532c139 100644 --- a/bff/src/class/material/v1_381_67_09_pc.rs +++ b/bff/src/class/material/v1_381_67_09_pc.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; use crate::link_header::ResourceObjectLinkHeader; use crate::math::{Vec2f, RGB}; -use crate::name::Name; +use crate::names::Name; #[bitsize(32)] #[derive(BinRead, DebugBits, SerializeBits, BinWrite, DeserializeBits)] diff --git a/bff/src/class/material_anim/v1_381_67_09_pc.rs b/bff/src/class/material_anim/v1_381_67_09_pc.rs index a22bbbd..9829a4e 100644 --- a/bff/src/class/material_anim/v1_381_67_09_pc.rs +++ b/bff/src/class/material_anim/v1_381_67_09_pc.rs @@ -12,7 +12,7 @@ use crate::keyframer::{ KeyframerVec4fLinear, }; use crate::link_header::ResourceObjectLinkHeader; -use crate::name::Name; +use crate::names::Name; #[bitsize(8)] #[derive(BinRead, DebugBits, SerializeBits, BinWrite, DeserializeBits)] diff --git a/bff/src/class/material_obj/v1_381_67_09_pc.rs b/bff/src/class/material_obj/v1_381_67_09_pc.rs index f2e4d00..10f320c 100644 --- a/bff/src/class/material_obj/v1_381_67_09_pc.rs +++ b/bff/src/class/material_obj/v1_381_67_09_pc.rs @@ -5,7 +5,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ResourceObjectLinkHeader; use crate::map::BffMap; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] #[br(import(_link_header: &ResourceObjectLinkHeader))] diff --git a/bff/src/class/mesh/v1_06_63_02_pc.rs b/bff/src/class/mesh/v1_06_63_02_pc.rs index dbfdbdf..ad6413a 100644 --- a/bff/src/class/mesh/v1_06_63_02_pc.rs +++ b/bff/src/class/mesh/v1_06_63_02_pc.rs @@ -5,7 +5,7 @@ use serde_big_array::BigArray; use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::math::{DynBox, DynSphere, Mat, Sphere, Vec2f, Vec3, Vec3f}; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] struct Box { diff --git a/bff/src/class/mesh/v1_291_03_06_pc.rs b/bff/src/class/mesh/v1_291_03_06_pc.rs index b4557e3..30f73b2 100644 --- a/bff/src/class/mesh/v1_291_03_06_pc.rs +++ b/bff/src/class/mesh/v1_291_03_06_pc.rs @@ -5,7 +5,7 @@ use serde_big_array::BigArray; use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::math::{DynBox, DynSphere, Mat4f, Quat, Vec2, Vec2f, Vec3, Vec3f}; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] struct PointsRelated0 { diff --git a/bff/src/class/mesh/v1_381_67_09_pc.rs b/bff/src/class/mesh/v1_381_67_09_pc.rs index 53e4a54..747b326 100644 --- a/bff/src/class/mesh/v1_381_67_09_pc.rs +++ b/bff/src/class/mesh/v1_381_67_09_pc.rs @@ -15,7 +15,7 @@ use crate::math::{ Vec2f, Vec3f, }; -use crate::name::Name; +use crate::names::Name; use crate::strings::PascalString; type VertexVectorComponent = u8; diff --git a/bff/src/class/node/v1_291_03_06_pc.rs b/bff/src/class/node/v1_291_03_06_pc.rs index 53fc138..586060f 100644 --- a/bff/src/class/node/v1_291_03_06_pc.rs +++ b/bff/src/class/node/v1_291_03_06_pc.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; use crate::math::{Mat4f, Quat, Rect, Sphere, Vec3f, RGBA}; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] #[br(import(_link_header: &()))] diff --git a/bff/src/class/node/v1_381_67_09_pc.rs b/bff/src/class/node/v1_381_67_09_pc.rs index 598dd1e..bb8c404 100644 --- a/bff/src/class/node/v1_381_67_09_pc.rs +++ b/bff/src/class/node/v1_381_67_09_pc.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; use crate::link_header::ResourceObjectLinkHeader; use crate::math::{Mat4f, Quat, Rect, Sphere, Vec3f, RGBA}; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] #[br(import(_link_header: &ResourceObjectLinkHeader))] diff --git a/bff/src/class/omni/v1_381_67_09_pc.rs b/bff/src/class/omni/v1_381_67_09_pc.rs index b305d64..32de1f0 100644 --- a/bff/src/class/omni/v1_381_67_09_pc.rs +++ b/bff/src/class/omni/v1_381_67_09_pc.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; use crate::link_header::ObjectLinkHeaderV1_381_67_09PC; use crate::math::Mat4f; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] #[br(import(_link_header: &ObjectLinkHeaderV1_381_67_09PC))] diff --git a/bff/src/class/particles/v1_381_67_09_pc.rs b/bff/src/class/particles/v1_381_67_09_pc.rs index 014e61f..c5934df 100644 --- a/bff/src/class/particles/v1_381_67_09_pc.rs +++ b/bff/src/class/particles/v1_381_67_09_pc.rs @@ -12,7 +12,7 @@ use crate::keyframer::{ }; use crate::link_header::ObjectLinkHeaderV1_381_67_09PC; use crate::math::{Mat4f, Vec3f}; -use crate::name::Name; +use crate::names::Name; #[bitsize(32)] #[derive(BinRead, DebugBits, SerializeBits, BinWrite, DeserializeBits)] diff --git a/bff/src/class/rot_shape/v1_291_03_06_pc.rs b/bff/src/class/rot_shape/v1_291_03_06_pc.rs index 7726790..61a7c05 100644 --- a/bff/src/class/rot_shape/v1_291_03_06_pc.rs +++ b/bff/src/class/rot_shape/v1_291_03_06_pc.rs @@ -5,7 +5,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ObjectLinkHeaderV1_06_63_02PC; use crate::math::{Vec2f, Vec3f}; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] struct PointsRelated0 { diff --git a/bff/src/class/rot_shape/v1_381_67_09_pc.rs b/bff/src/class/rot_shape/v1_381_67_09_pc.rs index d48e024..650d738 100644 --- a/bff/src/class/rot_shape/v1_381_67_09_pc.rs +++ b/bff/src/class/rot_shape/v1_381_67_09_pc.rs @@ -5,7 +5,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ObjectLinkHeaderV1_381_67_09PC; use crate::math::{Vec2f, Vec3f}; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] #[brw(repr = u16)] diff --git a/bff/src/class/rtc/v1_381_67_09_pc.rs b/bff/src/class/rtc/v1_381_67_09_pc.rs index 6631d25..7f68027 100644 --- a/bff/src/class/rtc/v1_381_67_09_pc.rs +++ b/bff/src/class/rtc/v1_381_67_09_pc.rs @@ -12,7 +12,7 @@ use crate::keyframer::{ KeyframerVec3fComp, }; use crate::link_header::ResourceObjectLinkHeader; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] struct RtcAnimationNode { diff --git a/bff/src/class/skel/v1_06_63_02_pc.rs b/bff/src/class/skel/v1_06_63_02_pc.rs index e03801d..b6017a6 100644 --- a/bff/src/class/skel/v1_06_63_02_pc.rs +++ b/bff/src/class/skel/v1_06_63_02_pc.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::math::{DynBox, DynSphere, Mat4f, Quat, Sphere, Vec3f}; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] struct ObjectDatas { diff --git a/bff/src/class/skel/v1_291_03_06_pc.rs b/bff/src/class/skel/v1_291_03_06_pc.rs index 6934e41..6c3fadd 100644 --- a/bff/src/class/skel/v1_291_03_06_pc.rs +++ b/bff/src/class/skel/v1_291_03_06_pc.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::math::{DynBox, DynSphere, Mat4f, Quat, Sphere, Vec3f}; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] struct ObjectDatas { diff --git a/bff/src/class/skel/v1_381_67_09_pc.rs b/bff/src/class/skel/v1_381_67_09_pc.rs index 194a93f..8fef673 100644 --- a/bff/src/class/skel/v1_381_67_09_pc.rs +++ b/bff/src/class/skel/v1_381_67_09_pc.rs @@ -5,7 +5,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::{ObjectDatasFlagsV1_381_67_09PC, ResourceObjectLinkHeader}; use crate::math::{Mat4f, Quat, Sphere, Vec3, Vec3f}; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] struct Bone { diff --git a/bff/src/class/skin/v1_291_03_06_pc.rs b/bff/src/class/skin/v1_291_03_06_pc.rs index 0e0ca9b..ac76b34 100644 --- a/bff/src/class/skin/v1_291_03_06_pc.rs +++ b/bff/src/class/skin/v1_291_03_06_pc.rs @@ -5,7 +5,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ObjectLinkHeaderV1_06_63_02PC; use crate::map::BffMap; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] struct Unknown1 { diff --git a/bff/src/class/skin/v1_381_67_09_pc.rs b/bff/src/class/skin/v1_381_67_09_pc.rs index 6f7b177..bb8f011 100644 --- a/bff/src/class/skin/v1_381_67_09_pc.rs +++ b/bff/src/class/skin/v1_381_67_09_pc.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ObjectLinkHeaderV1_381_67_09PC; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] #[br(import(bone_name_count: u32))] diff --git a/bff/src/class/sound/v1_381_67_09_pc.rs b/bff/src/class/sound/v1_381_67_09_pc.rs index aff872f..f39e739 100644 --- a/bff/src/class/sound/v1_381_67_09_pc.rs +++ b/bff/src/class/sound/v1_381_67_09_pc.rs @@ -3,7 +3,7 @@ use binrw::{BinRead, BinWrite}; use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; -use crate::name::Name; +use crate::names::Name; #[bitsize(16)] #[derive(BinRead, DebugBits, SerializeBits, BinWrite, DeserializeBits)] diff --git a/bff/src/class/surface/v1_291_03_06_pc.rs b/bff/src/class/surface/v1_291_03_06_pc.rs index b92da07..7b94ae7 100644 --- a/bff/src/class/surface/v1_291_03_06_pc.rs +++ b/bff/src/class/surface/v1_291_03_06_pc.rs @@ -6,7 +6,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ObjectLinkHeaderV1_06_63_02PC; use crate::math::{Mat4f, Sphere, Vec2f, Vec3f, Vec4f, RGB}; -use crate::name::Name; +use crate::names::Name; use crate::option::BffOption; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] diff --git a/bff/src/class/surface/v1_381_67_09_pc.rs b/bff/src/class/surface/v1_381_67_09_pc.rs index 05cbb1b..b2644e1 100644 --- a/bff/src/class/surface/v1_381_67_09_pc.rs +++ b/bff/src/class/surface/v1_381_67_09_pc.rs @@ -7,7 +7,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ObjectLinkHeaderV1_381_67_09PC; use crate::math::{Mat4f, RangeBeginSize, Vec2f, Vec3f, Vec4f}; -use crate::name::Name; +use crate::names::Name; use crate::option::BffOption; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] diff --git a/bff/src/class/trivial_class.rs b/bff/src/class/trivial_class.rs index 02759dc..1836595 100644 --- a/bff/src/class/trivial_class.rs +++ b/bff/src/class/trivial_class.rs @@ -4,7 +4,7 @@ use binrw::{BinRead, BinWrite}; use serde::{Deserialize, Serialize}; use crate::error::Error; -use crate::name::Name; +use crate::names::Name; use crate::object::Object; use crate::platforms::Platform; use crate::traits::TryFromVersionPlatform; diff --git a/bff/src/class/warp/v1_06_63_02_pc.rs b/bff/src/class/warp/v1_06_63_02_pc.rs index cc46430..33e6232 100644 --- a/bff/src/class/warp/v1_06_63_02_pc.rs +++ b/bff/src/class/warp/v1_06_63_02_pc.rs @@ -5,7 +5,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ResourceObjectLinkHeader; use crate::math::Vec3f; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] #[br(import(_link_header: &ResourceObjectLinkHeader))] diff --git a/bff/src/class/world/v1_06_63_02_pc.rs b/bff/src/class/world/v1_06_63_02_pc.rs index bb27c6f..7420337 100644 --- a/bff/src/class/world/v1_06_63_02_pc.rs +++ b/bff/src/class/world/v1_06_63_02_pc.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::math::Vec2f; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] struct SeadEntry { diff --git a/bff/src/class/world/v1_291_03_06_pc.rs b/bff/src/class/world/v1_291_03_06_pc.rs index e06335e..be981fe 100644 --- a/bff/src/class/world/v1_291_03_06_pc.rs +++ b/bff/src/class/world/v1_291_03_06_pc.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::math::Vec2f; -use crate::name::Name; +use crate::names::Name; #[derive(Debug, BinRead, Serialize, BinWrite, Deserialize)] struct SeadEntry { diff --git a/bff/src/class/world/v1_381_67_09_pc.rs b/bff/src/class/world/v1_381_67_09_pc.rs index f7d8869..2e1aef0 100644 --- a/bff/src/class/world/v1_381_67_09_pc.rs +++ b/bff/src/class/world/v1_381_67_09_pc.rs @@ -5,7 +5,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ResourceObjectLinkHeader; use crate::math::Mat4f; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] struct Unknown2 { diff --git a/bff/src/class/world_ref/v1_381_67_09_pc.rs b/bff/src/class/world_ref/v1_381_67_09_pc.rs index 4ee6976..06a0147 100644 --- a/bff/src/class/world_ref/v1_381_67_09_pc.rs +++ b/bff/src/class/world_ref/v1_381_67_09_pc.rs @@ -5,7 +5,7 @@ use crate::class::trivial_class::TrivialClass; use crate::dynarray::DynArray; use crate::link_header::ObjectLinkHeaderV1_381_67_09PC; use crate::math::{Mat4f, Vec3f}; -use crate::name::Name; +use crate::names::Name; use crate::strings::PascalStringNull; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] diff --git a/bff/src/crc32.rs b/bff/src/crc32.rs index 59c82a6..033a2e5 100644 --- a/bff/src/crc32.rs +++ b/bff/src/crc32.rs @@ -35,9 +35,10 @@ const CRC32_TABLE: [u32; CRC32_TABLE_SIZE] = [ 0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668, 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4, ]; -pub const fn asobo_options(name: &[u8], mut hash: u32) -> u32 { +pub const fn asobo_options(name: &[u8], hash: i32) -> i32 { // Using a while loop here because for loops aren't allowed in const fn. // https://github.com/rust-lang/rust/issues/87575 + let mut hash = hash as u32; let mut i: usize = 0; while i < name.len() { let c = name[i]; @@ -45,14 +46,15 @@ pub const fn asobo_options(name: &[u8], mut hash: u32) -> u32 { i += 1; } - hash + hash as i32 } -pub const fn asobo(name: &[u8]) -> u32 { +pub const fn asobo(name: &[u8]) -> i32 { asobo_options(name, 0) } -pub const fn asobo_alternate_options(name: &[u8], mut hash: u32) -> u32 { +pub const fn asobo_alternate_options(name: &[u8], hash: i32) -> i32 { + let mut hash = hash as u32; let mut i: usize = 0; while i < name.len() { let c = name[i]; @@ -61,9 +63,9 @@ pub const fn asobo_alternate_options(name: &[u8], mut hash: u32) -> u32 { i += 1; } - hash + hash as i32 } -pub const fn asobo_alternate(name: &[u8]) -> u32 { +pub const fn asobo_alternate(name: &[u8]) -> i32 { asobo_alternate_options(name, 0) } diff --git a/bff/src/crc64.rs b/bff/src/crc64.rs index c5b41aa..692ea43 100644 --- a/bff/src/crc64.rs +++ b/bff/src/crc64.rs @@ -258,7 +258,8 @@ const CRC64_TABLE: [u64; CRC64_TABLE_SIZE] = [ 0x9afce626ce85b507, ]; -pub const fn asobo_crc64_options(name: &[u8], mut hash: u64) -> u64 { +pub const fn asobo_crc64_options(name: &[u8], hash: i64) -> u64 { + let mut hash = hash as u64; let mut i: usize = 0; while i < name.len() { let c = name[i]; diff --git a/bff/src/error.rs b/bff/src/error.rs index 4e768f8..44b3a8a 100644 --- a/bff/src/error.rs +++ b/bff/src/error.rs @@ -2,7 +2,7 @@ use std::ffi::OsString; use derive_more::{Constructor, Display, Error, From}; -use crate::name::Name; +use crate::names::Name; use crate::platforms::Platform; use crate::versions::Version; diff --git a/bff/src/keyframer.rs b/bff/src/keyframer.rs index 73328a3..90a4cf3 100644 --- a/bff/src/keyframer.rs +++ b/bff/src/keyframer.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; use crate::dynarray::DynArray; use crate::math::{NumeratorFloat, Vec, Vec2f, Vec2i16, Vec3f, Vec4f, Vec4i16}; -use crate::name::Name; +use crate::names::Name; use crate::Endian; type Key = f32; diff --git a/bff/src/lib.rs b/bff/src/lib.rs index b0e50dc..c5970cc 100644 --- a/bff/src/lib.rs +++ b/bff/src/lib.rs @@ -12,7 +12,7 @@ pub mod lz; pub mod manifest; pub mod map; pub mod math; -pub mod name; +pub mod names; pub mod object; pub mod option; pub mod platforms; diff --git a/bff/src/link_header.rs b/bff/src/link_header.rs index 8e58bc7..00f87ca 100644 --- a/bff/src/link_header.rs +++ b/bff/src/link_header.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use crate::dynarray::DynArray; use crate::math::{Mat4f, Quat, Sphere}; -use crate::name::Name; +use crate::names::Name; #[derive(BinRead, Debug, Serialize, BinWrite, Deserialize)] pub struct ResourceObjectLinkHeader { diff --git a/bff/src/manifest.rs b/bff/src/manifest.rs index 9ba5d03..0b0552d 100644 --- a/bff/src/manifest.rs +++ b/bff/src/manifest.rs @@ -1,6 +1,6 @@ use serde::Serialize; -use crate::name::Name; +use crate::names::Name; use crate::platforms::Platform; use crate::versions::VersionTriple; diff --git a/bff/src/math.rs b/bff/src/math.rs index 7d7b9bb..6fc2be5 100644 --- a/bff/src/math.rs +++ b/bff/src/math.rs @@ -6,7 +6,7 @@ use derive_more::{Deref, DerefMut}; use num_traits::{cast, MulAdd, NumCast, PrimInt, Signed, Unsigned}; use serde::{Deserialize, Serialize}; -use crate::name::Name; +use crate::names::Name; pub type Vec = [InnerType; SIZE]; pub type Vec2 = Vec<2, T>; diff --git a/bff/src/name.rs b/bff/src/name.rs deleted file mode 100644 index d135d8f..0000000 --- a/bff/src/name.rs +++ /dev/null @@ -1 +0,0 @@ -pub type Name = u32; diff --git a/bff/src/names.rs b/bff/src/names.rs new file mode 100644 index 0000000..c7bc7a2 --- /dev/null +++ b/bff/src/names.rs @@ -0,0 +1,71 @@ +use std::collections::HashMap; +use std::io; +use std::io::{BufRead, Write}; +use std::str::FromStr; + +use derive_more::{Display, Error, From}; + +use crate::crc32; + +pub type Name = i32; + +#[derive(Debug, Default)] +pub struct Names(HashMap); + +#[derive(Debug, From, Display, Error)] +pub enum NamesError { + Io(io::Error), + ParseInt(std::num::ParseIntError), + Utf8(std::string::FromUtf8Error), + #[display( + fmt = "CRC-32 mismatch for {}: expected {}, actual {}", + string, + expected, + actual + )] + MismatchCrc32 { + string: String, + expected: Name, + actual: Name, + }, +} + +impl Names { + pub fn read(&mut self, reader: R) -> Result<(), NamesError> { + let names = &mut self.0; + for line in reader.lines() { + let line = line?; + let mut line = line.split_whitespace(); + let crc = line.next().unwrap(); + let name = line.next().unwrap(); + let name = name.trim_matches('"'); + let crc = Name::from_str(crc)?; + let expected = crc32::asobo(name.as_bytes()); + if crc != expected { + return Err(NamesError::MismatchCrc32 { + string: name.to_string(), + expected, + actual: crc, + }); + } + names.entry(crc).or_insert_with(|| name.to_string()); + } + + Ok(()) + } + + pub fn write(&self, writer: &mut W) -> Result<(), NamesError> { + for (crc, name) in self.0.iter() { + let expected = crc32::asobo(name.as_bytes()); + if *crc != expected { + return Err(NamesError::MismatchCrc32 { + string: name.to_string(), + expected, + actual: *crc, + }); + } + writeln!(writer, r#"{} "{}""#, crc, name)?; + } + Ok(()) + } +} diff --git a/bff/src/object.rs b/bff/src/object.rs index 1fcaeff..734d46f 100644 --- a/bff/src/object.rs +++ b/bff/src/object.rs @@ -4,7 +4,7 @@ use binrw::{binrw, BinRead, BinResult, BinWrite, VecArgs}; use serde::Serialize; use crate::lz::decompress_body_parser; -use crate::name::Name; +use crate::names::Name; #[binrw::parser(reader, endian)] fn body_parser(decompressed_size: u32, compressed_size: u32) -> BinResult> { diff --git a/bff/src/pool.rs b/bff/src/pool.rs index e407593..cf743fa 100644 --- a/bff/src/pool.rs +++ b/bff/src/pool.rs @@ -2,7 +2,7 @@ use binrw::{BinRead, BinWrite}; use serde::Serialize; use crate::dynarray::DynArray; -use crate::name::Name; +use crate::names::Name; use crate::object::PoolObject; #[derive(BinRead, Serialize, Debug, BinWrite)] diff --git a/bff/src/traits.rs b/bff/src/traits.rs index 9bb4bff..d9d4cdf 100644 --- a/bff/src/traits.rs +++ b/bff/src/traits.rs @@ -1,4 +1,4 @@ -use crate::name::Name; +use crate::names::Name; use crate::platforms::Platform; use crate::versions::Version;