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}