Skip to main content

rpfm_lib/files/tile_database/tile_set/
mod.rs

1//---------------------------------------------------------------------------//
2// Copyright (c) 2017-2026 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//! Tile set groupings for terrain organisation.
12//!
13//! Tile sets group related tiles together and define shared properties
14//! like linking behaviour and geometry references.
15
16use serde_derive::{Serialize, Deserialize};
17
18use crate::binary::{ReadBytes, WriteBytes};
19use crate::error::{Result, RLibError};
20use crate::files::{Decodeable, EncodeableExtraData, Encodeable};
21
22use super::*;
23
24mod v1;
25
26//---------------------------------------------------------------------------//
27//                              Enum & Structs
28//---------------------------------------------------------------------------//
29
30/// A group of related terrain tiles.
31///
32/// Tile sets organise tiles and define shared behaviours for linking,
33/// geometry sharing, and placement rules.
34#[derive(Default, PartialEq, Clone, Debug, Getters, MutGetters, Setters, Serialize, Deserialize)]
35#[getset(get = "pub", get_mut = "pub", set = "pub")]
36pub struct TileSet {
37    /// Serialisation format version.
38    serialise_version: u16,
39
40    /// Tile set identifier name.
41    name: String,
42    /// Tile used for linking edges.
43    linking_tile: String,
44    /// Reference to shared geometry data.
45    shared_geometry: String,
46    /// Additional tile set to place alongside.
47    also_place_tile_set: String,
48    /// Tile set to use for linking rules.
49    link_as_set: String,
50    /// Red colour component (0.0-1.0).
51    red: f32,
52    /// Green colour component (0.0-1.0).
53    green: f32,
54    /// Blue colour component (0.0-1.0).
55    blue: f32,
56}
57
58//---------------------------------------------------------------------------//
59//                      Implementation of TileSet
60//---------------------------------------------------------------------------//
61
62impl Decodeable for TileSet {
63
64    fn decode<R: ReadBytes>(data: &mut R, extra_data: &Option<DecodeableExtraData>) -> Result<Self> {
65        let mut decoded = Self::default();
66        decoded.serialise_version = data.read_u16()?;
67
68        match decoded.serialise_version {
69            1 => decoded.read_v1(data, extra_data)?,
70            _ => return Err(RLibError::DecodingFastBinUnsupportedVersion(String::from("TileSet"), decoded.serialise_version)),
71        }
72
73        Ok(decoded)
74    }
75}
76
77impl Encodeable for TileSet {
78
79    fn encode<W: WriteBytes>(&mut self, buffer: &mut W, extra_data: &Option<EncodeableExtraData>) -> Result<()> {
80        buffer.write_u16(self.serialise_version)?;
81
82        match self.serialise_version {
83            1 => self.write_v1(buffer, extra_data)?,
84            _ => return Err(RLibError::EncodingFastBinUnsupportedVersion(String::from("TileSet"), self.serialise_version)),
85        }
86
87        Ok(())
88    }
89}