nano9 0.1.0-alpha.4

A Pico-8 compatibility layer for Bevy
Documentation
use super::*;

pub(crate) fn plugin(_app: &mut App) {}

#[derive(Clone, Asset, Debug, Reflect)]
pub struct Pico8Asset {
    #[cfg(feature = "scripting")]
    pub scripts: Vec<Handle<bevy_mod_scripting::asset::ScriptAsset>>,
    // this palette is given away and not actually used here.
    pub(crate) palettes: Vec<Palette>,
    pub(crate) border: Handle<Image>,
    pub(crate) sprite_sheets: Vec<Handle<SpriteSheet>>,
    pub(crate) maps: Vec<SpriteMap>,
    pub(crate) font: Vec<N9Font>,
    pub(crate) audio_banks: Vec<Handle<AudioBank>>,
    pub(crate) meshes: Vec<MeshHandle>,
}

#[derive(Clone, Debug, Reflect)]
pub struct N9Font {
    pub handle: Handle<Font>,
}

impl Pico8Asset {
    pub fn sprite_map(&self, map_index: Option<usize>) -> Result<&SpriteMap, Error> {
        let index = map_index.unwrap_or(0);
        self.maps
            .get(index)
            .ok_or(Error::NoSuch(format!("map index {index}").into()))
    }

    pub fn sprite_map_mut(&mut self, map_index: Option<usize>) -> Result<&mut SpriteMap, Error> {
        let index = map_index.unwrap_or(0);
        self.maps
            .get_mut(index)
            .ok_or(Error::NoSuch(format!("map index {index}").into()))
    }
}

impl FromWorld for Pico8Asset {
    fn from_world(world: &mut World) -> Self {
        let asset_server = world.resource::<AssetServer>();

        Pico8Asset {
            #[cfg(feature = "scripting")]
            scripts: vec![],
            palettes: vec![Palette::from_slice(&crate::pico8::PALETTE)],
            border: asset_server.load_with_settings(PICO8_BORDER, pixel_art_settings),
            font: vec![N9Font {
                handle: asset_server.load(PICO8_FONT),
            }],
            audio_banks: Vec::new(),
            sprite_sheets: Vec::new(),
            maps: Vec::new(),
            meshes: Vec::new(),
        }
    }
}