wow_dbc/tbc_tables/
gt_oct_regen_hp.rs

1use crate::DbcTable;
2use crate::header::{
3    DbcHeader, HEADER_SIZE, parse_header,
4};
5use std::io::Write;
6
7#[derive(Debug, Clone, PartialEq, PartialOrd)]
8pub struct gtOCTRegenHP {
9    pub rows: Vec<gtOCTRegenHPRow>,
10}
11
12impl DbcTable for gtOCTRegenHP {
13    type Row = gtOCTRegenHPRow;
14
15    const FILENAME: &'static str = "gtOCTRegenHP.dbc";
16
17    fn rows(&self) -> &[Self::Row] { &self.rows }
18    fn rows_mut(&mut self) -> &mut [Self::Row] { &mut self.rows }
19
20    fn read(b: &mut impl std::io::Read) -> Result<Self, crate::DbcError> {
21        let mut header = [0_u8; HEADER_SIZE];
22        b.read_exact(&mut header)?;
23        let header = parse_header(&header)?;
24
25        if header.record_size != 4 {
26            return Err(crate::DbcError::InvalidHeader(
27                crate::InvalidHeaderError::RecordSize {
28                    expected: 4,
29                    actual: header.record_size,
30                },
31            ));
32        }
33
34        if header.field_count != 1 {
35            return Err(crate::DbcError::InvalidHeader(
36                crate::InvalidHeaderError::FieldCount {
37                    expected: 1,
38                    actual: header.field_count,
39                },
40            ));
41        }
42
43        let mut r = vec![0_u8; (header.record_count * header.record_size) as usize];
44        b.read_exact(&mut r)?;
45
46        let mut rows = Vec::with_capacity(header.record_count as usize);
47
48        for mut chunk in r.chunks(header.record_size as usize) {
49            let chunk = &mut chunk;
50
51            // data: float
52            let data = crate::util::read_f32_le(chunk)?;
53
54
55            rows.push(gtOCTRegenHPRow {
56                data,
57            });
58        }
59
60        Ok(gtOCTRegenHP { rows, })
61    }
62
63    fn write(&self, b: &mut impl Write) -> Result<(), std::io::Error> {
64        let header = DbcHeader {
65            record_count: self.rows.len() as u32,
66            field_count: 1,
67            record_size: 4,
68            string_block_size: 1,
69        };
70
71        b.write_all(&header.write_header())?;
72
73        for row in &self.rows {
74            // data: float
75            b.write_all(&row.data.to_le_bytes())?;
76
77        }
78
79        b.write_all(&[0_u8])?;
80
81        Ok(())
82    }
83
84}
85
86#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
87pub struct gtOCTRegenHPRow {
88    pub data: f32,
89}
90