nano9 0.1.0-alpha.7

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

#[cfg(feature = "scripting")]
use bevy_mod_scripting::bindings::script_value::ScriptValue;

pub(crate) fn plugin(app: &mut App) {
    #[cfg(feature = "scripting")]
    lua::plugin(app);
}

impl super::Pico8<'_, '_> {
    pub fn rnd<T>(&mut self, max: T) -> T
    where
        T: ::rand::distr::uniform::SampleUniform + PartialOrd + num_traits::Zero + Copy,
    {
        self.rand8.rnd(max)
    }
    #[cfg(feature = "scripting")]
    pub fn rnd_value(&mut self, value: Option<ScriptValue>) -> ScriptValue {
        self.rand8.rnd_value(value)
    }

    pub fn srand(&mut self, seed: u64) {
        self.rand8.srand(seed)
    }
}

#[cfg(feature = "scripting")]
mod lua {
    use super::*;
    use crate::pico8::lua::with_pico8;

    use bevy_mod_scripting::bindings::{
        function::{
            namespace::{GlobalNamespace, NamespaceBuilder},
            script_function::FunctionCallContext,
        },
        script_value::ScriptValue,
    };
    pub(crate) fn plugin(app: &mut App) {
        let world = app.world_mut();

        NamespaceBuilder::<GlobalNamespace>::new_unregistered(world)
            .register(
                "rnd",
                |ctx: FunctionCallContext, value: Option<ScriptValue>| {
                    with_pico8(&ctx, move |pico8| Ok(pico8.rnd_value(value)))
                },
            )
            .register("srand", |ctx: FunctionCallContext, value: u64| {
                with_pico8(&ctx, move |pico8| {
                    pico8.srand(value);
                    Ok(())
                })
            });
    }
}