use crate::{Position, Position2D, Sprite, SpriteV1};
use std::collections::BTreeMap;
#[cfg(feature = "serde_support")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Clone)]
#[cfg_attr(feature = "serde_support", derive(Serialize, Deserialize))]
pub struct SceneV1 {
pub objects: Vec<(SpriteV1, Position, bool)>,
}
#[derive(Debug, Default, Clone)]
#[cfg_attr(feature = "serde_support", derive(Serialize, Deserialize))]
pub struct SceneV2 {
pub objects: Vec<(Sprite, Position)>,
pub bookmarks: BTreeMap<usize, Position2D>,
}
impl From<SceneV1> for SceneV2 {
fn from(older: SceneV1) -> Self {
let mut objects: Vec<(Sprite, Position)> = Vec::with_capacity(older.objects.capacity());
for obj in older.objects {
objects.push((Sprite::from(obj.0), obj.1))
}
SceneV2 {
objects,
bookmarks: BTreeMap::new(),
}
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde_support", derive(Serialize, Deserialize))]
pub enum Scene {
V1(SceneV1),
V2(SceneV2),
}
impl Default for Scene {
fn default() -> Self {
Scene::V2(SceneV2::default())
}
}
impl Scene {
pub fn current(self) -> SceneV2 {
match self {
Self::V2(scene) => scene,
Self::V1(scene) => SceneV2::from(scene),
}
}
}