rpfm_lib/files/matched_combat/versions/
v3.rs1use crate::error::Result;
16use crate::binary::{ReadBytes, WriteBytes};
17use crate::files::matched_combat::*;
18
19impl MatchedCombat {
26
27 pub fn read_v3<R: ReadBytes>(&mut self, data: &mut R) -> Result<()> {
28 let count = data.read_u32()?;
29
30 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 for _ in 0..participants_count {
39 let mut participant = Participant::default();
40 participant.team = data.read_u32()?;
41 participant.uk1 = data.read_u32()?; 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 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()?; 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()?; 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 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}