diff --git a/extra_assets/power_beam.PART b/extra_assets/power_beam.PART new file mode 100644 index 00000000..c3db465c Binary files /dev/null and b/extra_assets/power_beam.PART differ diff --git a/extra_assets/power_beam_accent.TXTR b/extra_assets/power_beam_accent.TXTR new file mode 100644 index 00000000..ce1ad3f2 Binary files /dev/null and b/extra_assets/power_beam_accent.TXTR differ diff --git a/extra_assets/power_beam_capsule.TXTR b/extra_assets/power_beam_capsule.TXTR new file mode 100644 index 00000000..9f0977bb Binary files /dev/null and b/extra_assets/power_beam_capsule.TXTR differ diff --git a/extra_assets/power_beam_part.TXTR b/extra_assets/power_beam_part.TXTR new file mode 100644 index 00000000..7712142e Binary files /dev/null and b/extra_assets/power_beam_part.TXTR differ diff --git a/src/bin/resource_tracing.rs b/src/bin/resource_tracing.rs index cb7bf706..8c24a197 100644 --- a/src/bin/resource_tracing.rs +++ b/src/bin/resource_tracing.rs @@ -899,6 +899,50 @@ fn create_flamethrower(pickup_table: &mut HashMap) }).is_none()); } +fn create_power_beam(pickup_table: &mut HashMap) +{ + let mut bytes = Vec::new(); + { + let mut pickup = Reader::new(&pickup_table[&PickupModel::IceBeam].bytes) + .read::(()).clone(); + pickup.name = Cow::Borrowed(CStr::from_bytes_with_nul(b"Power Beam\0").unwrap()); + pickup.cmdl = custom_asset_ids::POWER_BEAM_PICKUP_CMDL; + pickup.ancs.file_id = custom_asset_ids::POWER_BEAM_PICKUP_ANCS; + pickup.write_to(&mut bytes).unwrap(); + } + + let mut deps: HashSet<_> = pickup_table[&PickupModel::IceBeam].deps.iter() + .filter(|i| ![ + // b"SCAN".into(), + // b"STRG".into(), + // b"CMDL".into(), + // b"ANCS".into(), + // b"PART".into(), + // b"ANIM".into(), + // b"EVNT".into(), + // b"TXTR".into(), + ].contains(&i.fourcc)) + .cloned() + .collect(); + + deps.extend(&[ + ResourceKey::from(custom_asset_ids::POWER_BEAM_PICKUP_CMDL), + ResourceKey::from(custom_asset_ids::POWER_BEAM_PICKUP_ANCS), + ResourceKey::from(custom_asset_ids::POWER_BEAM_PART), + ResourceKey::from(custom_asset_ids::POWER_BEAM_EVNT), + ResourceKey::from(custom_asset_ids::POWER_BEAM_ANIM), + ResourceKey::from(custom_asset_ids::POWER_BEAM_PICKUP_TXTR1), + ResourceKey::from(custom_asset_ids::POWER_BEAM_PICKUP_TXTR2), + ResourceKey::from(custom_asset_ids::POWER_BEAM_PART_TXTR), + ]); + + assert!(pickup_table.insert(PickupModel::PowerBeam, PickupData { + bytes, + deps, + attainment_audio_file_name: b"/audio/jin_itemattain.dsp\0".to_vec(), + }).is_none()); +} + fn create_combat_visor(pickup_table: &mut HashMap) { let mut bytes = Vec::new(); @@ -1362,7 +1406,7 @@ fn main() create_xray_visor(&mut pickup_table); create_combat_visor(&mut pickup_table); create_flamethrower(&mut pickup_table); - // create_power_beam(&mut pickup_table); + create_power_beam(&mut pickup_table); println!("// This file is generated by bin/resource_tracing.rs"); println!(""); diff --git a/src/custom_assets.rs b/src/custom_assets.rs index 15050d04..e7bb47ed 100644 --- a/src/custom_assets.rs +++ b/src/custom_assets.rs @@ -60,6 +60,7 @@ pub mod custom_asset_ids { def_asset_ids! { // Item Assets PHAZON_SUIT_TXTR1: TXTR = 0xDEAF0000, + POWER_BEAM_PART_TXTR: TXTR = 0xDEAF0001, // we cheat and hard-code this in a PART that is loaded as an external asset, do not change PHAZON_SUIT_TXTR2: TXTR, PHAZON_SUIT_CMDL: CMDL, PHAZON_SUIT_ANCS: ANCS, @@ -88,6 +89,13 @@ pub mod custom_asset_ids { FLAMETHROWER_PICKUP_TXTR1: TXTR, FLAMETHROWER_PICKUP_TXTR2: TXTR, FLAMETHROWER_PICKUP_TXTR3: TXTR, + POWER_BEAM_PICKUP_CMDL: CMDL, + POWER_BEAM_PICKUP_ANCS: ANCS, + POWER_BEAM_PICKUP_TXTR1: TXTR, + POWER_BEAM_PICKUP_TXTR2: TXTR, + POWER_BEAM_PART: PART, + POWER_BEAM_ANIM: ANIM, + POWER_BEAM_EVNT: EVNT, // Custom Scans SHORELINES_POI_SCAN: SCAN, @@ -336,7 +344,6 @@ pub mod custom_asset_ids { pub fn custom_asset_filename(resource_info: structs::ResourceInfo) -> String { let base_name = match resource_info.file_id { - // id if custom_asset_ids::PHAZON_SUIT_TXTR1.to_u32() == id => "phazon_suit_txtr1".to_string() , _ => format!("{:X}", resource_info.file_id), }; @@ -417,6 +424,9 @@ fn extern_assets_compile_time<'r>() -> Vec> extern_asset!(FLAMETHROWER_PICKUP_TXTR1 , "flamethrower_vertice_color.TXTR" ), extern_asset!(FLAMETHROWER_PICKUP_TXTR2 , "flamethrower_cap_glow.TXTR" ), extern_asset!(FLAMETHROWER_PICKUP_TXTR3 , "flamethrower_color_body.TXTR" ), + extern_asset!(POWER_BEAM_PICKUP_TXTR1 , "power_beam_capsule.TXTR" ), + extern_asset!(POWER_BEAM_PICKUP_TXTR2 , "power_beam_accent.TXTR" ), + extern_asset!(POWER_BEAM_PART_TXTR , "power_beam_part.TXTR" ), extern_asset!(RANDOVANIA_GAMECUBE0_TXTR , "randovania_gamecube.TXTR" ), extern_asset!(RANDOVANIA_GAMECUBE1_TXTR , "randovania_gamecube_text.TXTR" ), @@ -608,6 +618,7 @@ pub fn custom_assets<'r>( assets.extend_from_slice(&create_shiny_missile_assets(resources)); assets.extend_from_slice(&create_flamethrower_assets(resources)); + assets.extend_from_slice(&create_power_beam_assets(resources)); assets.extend_from_slice(&create_ice_trap_icon_ancs( resources, @@ -1699,6 +1710,97 @@ fn create_flamethrower_assets<'r>( [cmdl, ancs] } +fn create_power_beam_assets<'r>( + resources: &HashMap<(u32, FourCC), structs::Resource<'r>>, +) -> [structs::Resource<'r>; 5] +{ + let cmdl = { + let cmdl = ResourceData::new( + &resources[&resource_info!("Node1_18.CMDL").into()] + ); + let cmdl_bytes = cmdl.decompress().into_owned(); + let mut cmdl = Reader::new(&cmdl_bytes[..]).read::(()); + + cmdl.material_sets.as_mut_vec()[0].texture_ids.as_mut_vec()[0] = custom_asset_ids::POWER_BEAM_PICKUP_TXTR1; + cmdl.material_sets.as_mut_vec()[0].texture_ids.as_mut_vec()[1] = custom_asset_ids::POWER_BEAM_PICKUP_TXTR2; + + let mut new_cmdl_bytes = vec![]; + cmdl.write_to(&mut new_cmdl_bytes).unwrap(); + + build_resource( + custom_asset_ids::POWER_BEAM_PICKUP_CMDL, + structs::ResourceKind::External(new_cmdl_bytes, b"CMDL".into()) + ) + }; + + let ancs = { + let ancs = ResourceData::new( + &resources[&resource_info!("Node1_18.ANCS").into()] + ); + let ancs_bytes = ancs.decompress().into_owned(); + let mut ancs = Reader::new(&ancs_bytes[..]).read::(()); + + ancs.char_set.char_info.as_mut_vec()[0].cmdl = custom_asset_ids::POWER_BEAM_PICKUP_CMDL; + ancs.char_set.char_info.as_mut_vec()[0].particles.part_assets.as_mut_vec()[0] = custom_asset_ids::POWER_BEAM_PART.to_u32(); // 0x9884086 + + match &mut ancs.anim_set.animations.as_mut_vec()[0].meta { + structs::MetaAnimation::Play(play) => { + play.get_mut().anim = custom_asset_ids::POWER_BEAM_ANIM; + } + _ => {panic!("ANIM wasn't PLAY")} + } + + ancs.anim_set.animation_resources.as_mut().unwrap().as_mut_vec()[0].anim = custom_asset_ids::POWER_BEAM_ANIM; + ancs.anim_set.animation_resources.as_mut().unwrap().as_mut_vec()[0].evnt = custom_asset_ids::POWER_BEAM_EVNT; + + let mut new_ancs_bytes = vec![]; + ancs.write_to(&mut new_ancs_bytes).unwrap(); + + build_resource( + custom_asset_ids::POWER_BEAM_PICKUP_ANCS, + structs::ResourceKind::External(new_ancs_bytes, b"ANCS".into()) + ) + }; + + let part = { + let bytes = include_bytes!("../extra_assets/power_beam.PART"); + build_resource( + custom_asset_ids::POWER_BEAM_PART, + structs::ResourceKind::External(bytes.to_vec(), b"PART".into()) + ) + }; + + let evnt = { + let mut evnt = resources[&resource_info!("IceBeam_ready.EVNT").into()] + .kind.as_evnt() + .unwrap().into_owned(); + + evnt.effect_events.as_mut_vec()[0].effect_file_id = custom_asset_ids::POWER_BEAM_PART.to_u32(); + + build_resource( + custom_asset_ids::POWER_BEAM_EVNT, + structs::ResourceKind::Evnt(evnt) + ) + }; + + let anim = { + let anim = ResourceData::new( + &resources[&resource_info!("IceBeam_ready.ANIM").into()] + ); + + let mut bytes = anim.decompress().into_owned(); + + custom_asset_ids::POWER_BEAM_EVNT.write_to(&mut std::io::Cursor::new(&mut bytes[8..])).unwrap(); + + build_resource( + custom_asset_ids::POWER_BEAM_ANIM, + structs::ResourceKind::External(bytes, b"ANIM".into()) + ) + }; + + [cmdl, ancs, part, evnt, anim] +} + fn create_ice_trap_icon_ancs<'r>( resources: &HashMap<(u32, FourCC), structs::Resource<'r>>, new_cmdl_id: ResId, diff --git a/src/pickup_meta.rs b/src/pickup_meta.rs index d79ba901..f3280c37 100644 --- a/src/pickup_meta.rs +++ b/src/pickup_meta.rs @@ -344,6 +344,7 @@ pub enum PickupModel IceSpreader, Flamethrower, FlamethrowerNew, + PowerBeam, WaveBeam, IceBeam, PlasmaBeam, @@ -396,6 +397,7 @@ impl PickupModel PickupModel::IceSpreader => "Ice Spreader", PickupModel::Flamethrower => "FlamethrowerOld", PickupModel::FlamethrowerNew => "Flamethrower", + PickupModel::PowerBeam => "Power Beam", PickupModel::WaveBeam => "Wave Beam", PickupModel::IceBeam => "Ice Beam", PickupModel::PlasmaBeam => "Plasma Beam", @@ -464,6 +466,7 @@ impl PickupModel PickupModel::IceSpreader, PickupModel::Flamethrower, PickupModel::FlamethrowerNew, + PickupModel::PowerBeam, PickupModel::WaveBeam, PickupModel::IceBeam, PickupModel::PlasmaBeam, @@ -538,7 +541,7 @@ impl PickupModel */ pub fn from_type(pickup_type: PickupType) -> Self { match pickup_type { - PickupType::PowerBeam => PickupModel::RandovaniaGamecube, + PickupType::PowerBeam => PickupModel::PowerBeam, PickupType::IceBeam => PickupModel::IceBeam, PickupType::WaveBeam => PickupModel::WaveBeam, PickupType::PlasmaBeam => PickupModel::PlasmaBeam, diff --git a/src/pickup_meta.rs.in b/src/pickup_meta.rs.in index d200a8f0..489e37d6 100644 --- a/src/pickup_meta.rs.in +++ b/src/pickup_meta.rs.in @@ -10300,12 +10300,12 @@ const PICKUP_CMDL_AABBS: [(u32, [u32; 6]); 39] = [ (0xCD995C16, [0xBED70230, 0xBE2637A1, 0xBEE9CA69, 0x3ED7022F, 0x3E2637A0, 0x3EDEBAA6]), (0xD532BDB8, [0xBE3EEAF8, 0xBE3EEAFA, 0xBE3EEAF9, 0x3E3EEAFA, 0x3E3EEAF8, 0x3E3EEAF9]), (0xDA25B1BE, [0xBF032CFF, 0xBEF982E4, 0x3D3B29F0, 0x3F032D02, 0x3EF982DE, 0x3FFBFE22]), - (0xDEAF0002, [0xBED70230, 0xBE2637A1, 0xBEE9CA69, 0x3ED7022F, 0x3E2637A0, 0x3EDEBAA6]), - (0xDEAF0005, [0xBED70230, 0xBE2637A1, 0xBEE9CA69, 0x3ED7022F, 0x3E2637A0, 0x3EDEBAA6]), - (0xDEAF0007, [0xBED5A986, 0xBED5A986, 0xBF1004EA, 0x3ED5A986, 0x3ED5A986, 0x3F1004EA]), - (0xDEAF0009, [0xBED5A986, 0xBED5A986, 0xBF1004EA, 0x3ED5A986, 0x3ED5A986, 0x3F1004EA]), - (0xDEAF000B, [0xBED5A986, 0xBED5A986, 0xBF1004EA, 0x3ED5A986, 0x3ED5A986, 0x3F1004EA]), - (0xDEAF0010, [0xBEBF4CAC, 0xBEBF4C8C, 0x3F3CB4FA, 0x3EBF4CAD, 0x3EBF4CD0, 0x4000D66D]), + (0xDEAF0003, [0xBED70230, 0xBE2637A1, 0xBEE9CA69, 0x3ED7022F, 0x3E2637A0, 0x3EDEBAA6]), + (0xDEAF0006, [0xBED70230, 0xBE2637A1, 0xBEE9CA69, 0x3ED7022F, 0x3E2637A0, 0x3EDEBAA6]), + (0xDEAF0008, [0xBED5A986, 0xBED5A986, 0xBF1004EA, 0x3ED5A986, 0x3ED5A986, 0x3F1004EA]), + (0xDEAF000A, [0xBED5A986, 0xBED5A986, 0xBF1004EA, 0x3ED5A986, 0x3ED5A986, 0x3F1004EA]), + (0xDEAF000C, [0xBED5A986, 0xBED5A986, 0xBF1004EA, 0x3ED5A986, 0x3ED5A986, 0x3F1004EA]), + (0xDEAF0011, [0xBEBF4CAC, 0xBEBF4C8C, 0x3F3CB4FA, 0x3EBF4CAD, 0x3EBF4CD0, 0x4000D66D]), (0xF86621C9, [0xBEDCA1FE, 0xBF5C1DF2, 0xBF80444F, 0x3EDC79E0, 0x3F5AC836, 0x3F66A5F1]), (0xFCD66153, [0xBFA12B7D, 0xBE9C29A5, 0xBFF5A1AE, 0x3FE1A34C, 0x34A7D97F, 0x3FD69829]), (0xFE2CD4D3, [0xBFA12B7D, 0xBE9C29A5, 0xBFF5A1AE, 0x3FE1A34C, 0x34A7D97F, 0x3FD69829]), @@ -10316,7 +10316,7 @@ impl PickupType pub fn attainment_audio_file_name(&self) -> &'static str { match self { - PickupType::PowerBeam => "/audio/itm_x_short_02.dsp\0", + PickupType::PowerBeam => "/audio/jin_itemattain.dsp\0", PickupType::IceBeam => "audio/jin_itemattain.dsp\0", PickupType::WaveBeam => "audio/jin_itemattain.dsp\0", PickupType::PlasmaBeam => "audio/jin_itemattain.dsp\0", @@ -10431,8 +10431,8 @@ impl PickupModel (0x6536B232, FourCC::from_bytes(b"TXTR")), (0x6E62EF9F, FourCC::from_bytes(b"EVNT")), (0xC4AD9154, FourCC::from_bytes(b"TXTR")), - (0xDEAF000B, FourCC::from_bytes(b"CMDL")), - (0xDEAF000C, FourCC::from_bytes(b"ANCS")), + (0xDEAF000C, FourCC::from_bytes(b"CMDL")), + (0xDEAF000D, FourCC::from_bytes(b"ANCS")), ]; DATA }, @@ -10446,8 +10446,8 @@ impl PickupModel (0x6536B232, FourCC::from_bytes(b"TXTR")), (0x6E62EF9F, FourCC::from_bytes(b"EVNT")), (0xC4AD9154, FourCC::from_bytes(b"TXTR")), - (0xDEAF0007, FourCC::from_bytes(b"CMDL")), - (0xDEAF0008, FourCC::from_bytes(b"ANCS")), + (0xDEAF0008, FourCC::from_bytes(b"CMDL")), + (0xDEAF0009, FourCC::from_bytes(b"ANCS")), (0xFC095F6C, FourCC::from_bytes(b"TXTR")), ]; DATA @@ -10463,8 +10463,8 @@ impl PickupModel (0x6E62EF9F, FourCC::from_bytes(b"EVNT")), (0xBE4CD99D, FourCC::from_bytes(b"TXTR")), (0xC4AD9154, FourCC::from_bytes(b"TXTR")), - (0xDEAF0009, FourCC::from_bytes(b"CMDL")), - (0xDEAF000A, FourCC::from_bytes(b"ANCS")), + (0xDEAF000A, FourCC::from_bytes(b"CMDL")), + (0xDEAF000B, FourCC::from_bytes(b"ANCS")), ]; DATA }, @@ -10513,9 +10513,9 @@ impl PickupModel (0x4B26EFDA, FourCC::from_bytes(b"EVNT")), (0xAF9DEFBE, FourCC::from_bytes(b"CINF")), (0xDEAF0000, FourCC::from_bytes(b"TXTR")), - (0xDEAF0001, FourCC::from_bytes(b"TXTR")), - (0xDEAF0002, FourCC::from_bytes(b"CMDL")), - (0xDEAF0003, FourCC::from_bytes(b"ANCS")), + (0xDEAF0002, FourCC::from_bytes(b"TXTR")), + (0xDEAF0003, FourCC::from_bytes(b"CMDL")), + (0xDEAF0004, FourCC::from_bytes(b"ANCS")), (0xFEBBC197, FourCC::from_bytes(b"CSKR")), ]; DATA @@ -10772,11 +10772,36 @@ impl PickupModel (0xAE6410BE, FourCC::from_bytes(b"CSKR")), (0xB59EB7E6, FourCC::from_bytes(b"TXTR")), (0xDBDF0424, FourCC::from_bytes(b"CINF")), - (0xDEAF0018, FourCC::from_bytes(b"CMDL")), - (0xDEAF0019, FourCC::from_bytes(b"ANCS")), - (0xDEAF001A, FourCC::from_bytes(b"TXTR")), + (0xDEAF0019, FourCC::from_bytes(b"CMDL")), + (0xDEAF001A, FourCC::from_bytes(b"ANCS")), (0xDEAF001B, FourCC::from_bytes(b"TXTR")), (0xDEAF001C, FourCC::from_bytes(b"TXTR")), + (0xDEAF001D, FourCC::from_bytes(b"TXTR")), + ]; + DATA + }, + PickupModel::PowerBeam => { + const DATA: &[(u32, FourCC)] = &[ + (0x09884086, FourCC::from_bytes(b"PART")), + (0x0DEB9456, FourCC::from_bytes(b"PART")), + (0x47B6B93D, FourCC::from_bytes(b"SCAN")), + (0x4F15E331, FourCC::from_bytes(b"STRG")), + (0x52A3B1A4, FourCC::from_bytes(b"ANCS")), + (0x57F7A883, FourCC::from_bytes(b"EVNT")), + (0x846B0326, FourCC::from_bytes(b"ANIM")), + (0xB10A1E68, FourCC::from_bytes(b"CSKR")), + (0xC1B0421D, FourCC::from_bytes(b"CINF")), + (0xC8A4F91F, FourCC::from_bytes(b"TXTR")), + (0xD6ACCAC3, FourCC::from_bytes(b"TXTR")), + (0xDA25B1BE, FourCC::from_bytes(b"CMDL")), + (0xDEAF0001, FourCC::from_bytes(b"TXTR")), + (0xDEAF001E, FourCC::from_bytes(b"CMDL")), + (0xDEAF001F, FourCC::from_bytes(b"ANCS")), + (0xDEAF0020, FourCC::from_bytes(b"TXTR")), + (0xDEAF0021, FourCC::from_bytes(b"TXTR")), + (0xDEAF0022, FourCC::from_bytes(b"PART")), + (0xDEAF0023, FourCC::from_bytes(b"ANIM")), + (0xDEAF0024, FourCC::from_bytes(b"EVNT")), ]; DATA }, @@ -11062,11 +11087,11 @@ impl PickupModel (0xAF9DEFBE, FourCC::from_bytes(b"CINF")), (0xBE4CD99D, FourCC::from_bytes(b"TXTR")), (0xDEAF0000, FourCC::from_bytes(b"TXTR")), - (0xDEAF0001, FourCC::from_bytes(b"TXTR")), - (0xDEAF0003, FourCC::from_bytes(b"ANCS")), - (0xDEAF0004, FourCC::from_bytes(b"TXTR")), - (0xDEAF0005, FourCC::from_bytes(b"CMDL")), - (0xDEAF0006, FourCC::from_bytes(b"ANCS")), + (0xDEAF0002, FourCC::from_bytes(b"TXTR")), + (0xDEAF0004, FourCC::from_bytes(b"ANCS")), + (0xDEAF0005, FourCC::from_bytes(b"TXTR")), + (0xDEAF0006, FourCC::from_bytes(b"CMDL")), + (0xDEAF0007, FourCC::from_bytes(b"ANCS")), (0xFEBBC197, FourCC::from_bytes(b"CSKR")), ]; DATA @@ -11081,12 +11106,12 @@ impl PickupModel (0x6E3D2E18, FourCC::from_bytes(b"TXTR")), (0xAF9DEFBE, FourCC::from_bytes(b"CINF")), (0xDEAF0000, FourCC::from_bytes(b"TXTR")), - (0xDEAF0001, FourCC::from_bytes(b"TXTR")), - (0xDEAF0003, FourCC::from_bytes(b"ANCS")), - (0xDEAF0014, FourCC::from_bytes(b"CMDL")), - (0xDEAF0015, FourCC::from_bytes(b"ANCS")), - (0xDEAF0016, FourCC::from_bytes(b"TXTR")), + (0xDEAF0002, FourCC::from_bytes(b"TXTR")), + (0xDEAF0004, FourCC::from_bytes(b"ANCS")), + (0xDEAF0015, FourCC::from_bytes(b"CMDL")), + (0xDEAF0016, FourCC::from_bytes(b"ANCS")), (0xDEAF0017, FourCC::from_bytes(b"TXTR")), + (0xDEAF0018, FourCC::from_bytes(b"TXTR")), (0xFEBBC197, FourCC::from_bytes(b"CSKR")), ]; DATA @@ -11152,13 +11177,13 @@ impl PickupModel (0x098BE8D8, FourCC::from_bytes(b"PART")), (0x0DEB9456, FourCC::from_bytes(b"PART")), (0x4651CA46, FourCC::from_bytes(b"CSKR")), - (0xDEAF000D, FourCC::from_bytes(b"TXTR")), (0xDEAF000E, FourCC::from_bytes(b"TXTR")), (0xDEAF000F, FourCC::from_bytes(b"TXTR")), - (0xDEAF0010, FourCC::from_bytes(b"CMDL")), - (0xDEAF0011, FourCC::from_bytes(b"ANCS")), - (0xDEAF0012, FourCC::from_bytes(b"EVNT")), - (0xDEAF0013, FourCC::from_bytes(b"ANIM")), + (0xDEAF0010, FourCC::from_bytes(b"TXTR")), + (0xDEAF0011, FourCC::from_bytes(b"CMDL")), + (0xDEAF0012, FourCC::from_bytes(b"ANCS")), + (0xDEAF0013, FourCC::from_bytes(b"EVNT")), + (0xDEAF0014, FourCC::from_bytes(b"ANIM")), (0xF8333189, FourCC::from_bytes(b"CINF")), ]; DATA @@ -11312,7 +11337,7 @@ PickupModel::IceTrap => { 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x42, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xAF, 0x00, - 0x0B, 0xDE, 0xAF, 0x00, 0x0C, 0x00, 0x00, 0x00, + 0x0C, 0xDE, 0xAF, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x01, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, @@ -11346,7 +11371,7 @@ PickupModel::IceTrap => { 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x42, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xAF, - 0x00, 0x07, 0xDE, 0xAF, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x08, 0xDE, 0xAF, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x01, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, @@ -11379,8 +11404,8 @@ PickupModel::IceTrap => { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x42, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xDE, 0xAF, 0x00, 0x09, - 0xDE, 0xAF, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xDE, 0xAF, 0x00, 0x0A, + 0xDE, 0xAF, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x01, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, @@ -11482,7 +11507,7 @@ PickupModel::IceTrap => { 0x00, 0x17, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x42, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xAF, - 0x00, 0x02, 0xDE, 0xAF, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x03, 0xDE, 0xAF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x01, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, @@ -11971,7 +11996,7 @@ PickupModel::IceTrap => { 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x42, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xAF, 0x00, - 0x18, 0xDE, 0xAF, 0x00, 0x19, 0x00, 0x00, 0x00, + 0x19, 0xDE, 0xAF, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x01, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, @@ -11991,6 +12016,40 @@ PickupModel::IceTrap => { 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xEB, 0x94, 0x56, ], + PickupModel::PowerBeam => &[ + 0x00, 0x00, 0x00, 0x12, 0x50, 0x6F, 0x77, 0x65, + 0x72, 0x20, 0x42, 0x65, 0x61, 0x6D, 0x00, 0x44, + 0x49, 0x6E, 0xDC, 0xC3, 0x97, 0xBA, 0xDD, 0x42, + 0xA8, 0xA9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, + 0x40, 0x00, 0x01, 0x3F, 0x40, 0x00, 0x01, 0x3F, + 0x40, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x42, + 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xDE, 0xAF, 0x00, 0x1E, 0xDE, + 0xAF, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, + 0x00, 0x00, 0x0E, 0x01, 0x3F, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, + 0x41, 0xA0, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, + 0x3F, 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, + 0x3F, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x47, 0xB6, 0xB9, 0x3D, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x3F, + 0x80, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0F, 0x01, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xEB, 0x94, + 0x56, + ], PickupModel::WaveBeam => &[ 0x00, 0x00, 0x00, 0x12, 0x50, 0x5F, 0x57, 0x61, 0x76, 0x65, 0x62, 0x65, 0x61, 0x6D, 0x5F, 0x30, @@ -12506,7 +12565,7 @@ PickupModel::IceTrap => { 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xDE, 0xAF, 0x00, 0x05, 0xDE, 0xAF, 0x00, 0x06, + 0xDE, 0xAF, 0x00, 0x06, 0xDE, 0xAF, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x01, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -12539,8 +12598,8 @@ PickupModel::IceTrap => { 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xDE, 0xAF, 0x00, 0x14, 0xDE, 0xAF, 0x00, - 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xDE, 0xAF, 0x00, 0x15, 0xDE, 0xAF, 0x00, + 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x01, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x41, 0xA0, @@ -12678,7 +12737,7 @@ PickupModel::IceTrap => { 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x42, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xAF, - 0x00, 0x10, 0xDE, 0xAF, 0x00, 0x11, 0x00, 0x00, + 0x00, 0x11, 0xDE, 0xAF, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0E, 0x01, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F,