rpfm_lib/files/matched_combat/versions/
v3.rs

1//---------------------------------------------------------------------------//
2// Copyright (c) 2017-2024 Ismael Gutiérrez González. All rights reserved.
3//
4// This file is part of the Rusted PackFile Manager (RPFM) project,
5// which can be found here: https://github.com/Frodo45127/rpfm.
6//
7// This file is licensed under the MIT license, which can be found here:
8// https://github.com/Frodo45127/rpfm/blob/master/LICENSE.
9//---------------------------------------------------------------------------//
10
11//! This is a module to read/write binary Matched Combat files, v3.
12//!
13//! For internal use only.
14
15use crate::error::Result;
16use crate::binary::{ReadBytes, WriteBytes};
17use crate::files::matched_combat::*;
18
19//---------------------------------------------------------------------------//
20//                            Implementation
21//---------------------------------------------------------------------------//
22
23// FILTER TYPE 0 == animation_tables
24
25impl MatchedCombat {
26
27    pub fn read_v3<R: ReadBytes>(&mut self, data: &mut R) -> Result<()> {
28        let count = data.read_u32()?;
29
30        // Entries
31        for _ in 0..count {
32
33            let mut matched_entry = MatchedEntry::default();
34            matched_entry.id = data.read_sized_string_u8()?;
35            let participants_count = data.read_u32()?;
36
37            // Participants
38            for _ in 0..participants_count {
39                let mut participant = Participant::default();
40                participant.team = data.read_u32()?;
41                participant.uk1 = data.read_u32()?;     // No idea. Always 2. Maybe counter of json objects?
42
43                let entity_bundle_count = data.read_u32()?;
44                for _ in 0..entity_bundle_count {
45                    let mut bundle = EntityBundle::default();
46                    bundle.selection_weight = data.read_f32()?;
47
48                    // Entities in bundle
49                    let entity_count = data.read_u32()?;
50                    for _ in 0..entity_count {
51                        let mut entity = Entity::default();
52
53                        let filter_count = data.read_u32()?;
54                        for _ in 0..filter_count {
55                            entity.filters.push(Filter {
56                                filter_type: data.read_u32()?,
57                                value: data.read_sized_string_u8()?,
58                                equals: data.read_bool()?,
59                                or: data.read_bool()?,
60                            });
61                        }
62
63                        entity.animation_filename = data.read_sized_string_u8()?;
64
65                        let metadata_filenames_count = data.read_u32()?;
66                        for _ in 0..metadata_filenames_count {
67                            entity.metadata_filenames.push(data.read_sized_string_u8()?);
68                        }
69
70                        entity.blend_in_time = data.read_f32()?;
71                        entity.equipment_display = data.read_u32()?;
72                        entity.uk = data.read_u32()?;   // No idea. Always 0 and doesn't seem to match any value in the mirror txt in 3k.
73
74                        bundle.entities.push(entity);
75                    }
76
77                    participant.entity_info.push(bundle);
78                }
79
80                participant.state.start = StateParticipant::try_from(data.read_u32()?)?;
81                participant.state.end = StateParticipant::try_from(data.read_u32()?)?;
82
83                participant.uk2 = data.read_u32()?;     // No idea. Always 0 and doesn't seem to match any value in the mirror txt in 3k.
84
85                matched_entry.participants.push(participant);
86            }
87
88            self.entries.push(matched_entry);
89        }
90
91        Ok(())
92    }
93
94    pub fn write_v3<W: WriteBytes>(&self, buffer: &mut W) -> Result<()> {
95        buffer.write_u32(self.entries.len() as u32)?;
96        for entry in &self.entries {
97            buffer.write_sized_string_u8(&entry.id)?;
98            buffer.write_u32(entry.participants.len() as u32)?;
99
100            // There should only be one, but loop just in case.
101            for participant in &entry.participants {
102                buffer.write_u32(participant.team)?;
103                buffer.write_u32(participant.uk1)?;
104                buffer.write_u32(participant.entity_info.len() as u32)?;
105
106                for bundle in &participant.entity_info {
107                    buffer.write_f32(bundle.selection_weight)?;
108                    buffer.write_u32(bundle.entities.len() as u32)?;
109
110                    for entity in &bundle.entities {
111                        buffer.write_u32(entity.filters.len() as u32)?;
112
113                        for filter in &entity.filters {
114                            buffer.write_u32(filter.filter_type)?;
115                            buffer.write_sized_string_u8(&filter.value)?;
116                            buffer.write_bool(filter.equals)?;
117                            buffer.write_bool(filter.or)?;
118                        }
119
120                        buffer.write_sized_string_u8(&entity.animation_filename)?;
121                        buffer.write_u32(entity.metadata_filenames.len() as u32)?;
122
123                        for metadata_filename in &entity.metadata_filenames {
124                            buffer.write_sized_string_u8(metadata_filename)?;
125                        }
126
127                        buffer.write_f32(entity.blend_in_time)?;
128                        buffer.write_u32(entity.equipment_display)?;
129                        buffer.write_u32(entity.uk)?;
130                    }
131                }
132
133                buffer.write_u32(participant.state.start as u32)?;
134                buffer.write_u32(participant.state.end as u32)?;
135                buffer.write_u32(participant.uk2)?;
136            }
137        }
138
139        Ok(())
140    }
141}