doukutsu-rs/src/scripting/scene.rs

58 lines
1.3 KiB
Rust

use lua_ffi::ffi::luaL_Reg;
use lua_ffi::{c_int, LuaObject, State};
use crate::scene::game_scene::GameScene;
use crate::scripting::{LuaScriptingState, DRS_RUNTIME_GLOBAL};
pub struct LuaGameScene {
valid_reference: bool,
ptr: *mut GameScene,
}
impl LuaGameScene {
unsafe fn lua_get_tick(&self, state: &mut State) -> c_int {
state.push((*self.ptr).tick as u32);
1
}
pub(crate) fn new(ptr: *mut GameScene) -> LuaGameScene {
LuaGameScene { valid_reference: true, ptr }
}
}
impl Drop for LuaGameScene {
fn drop(&mut self) {
self.valid_reference = false;
}
}
impl LuaObject for LuaGameScene {
fn name() -> *const i8 {
c_str!("GameScene")
}
fn lua_fns() -> Vec<luaL_Reg> {
vec![lua_method!("tick", LuaGameScene, LuaGameScene::lua_get_tick)]
}
}
impl LuaScriptingState {
pub fn scene_tick(&mut self) {
if let Some(state) = self.state.as_mut() {
let val = LuaGameScene::new(self.game_scene);
state.get_global(DRS_RUNTIME_GLOBAL);
state.get_field(-1, "_handlers");
state.get_field(-1, "tick");
state.push(val);
if let Err((_, err)) = state.pcall(1, 0, 0) {
println!("scene_tick error: {}", err);
}
state.pop(2);
}
}
}