diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 133 |
1 files changed, 93 insertions, 40 deletions
diff --git a/src/main.rs b/src/main.rs index e8c9f23..0cbb7c8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,48 +1,101 @@ -use std::time::Instant; +use std::time::SystemTime; -use crossterm::{ - event::{Event, KeyCode}, - style::ContentStyle, +use crossterm::{event::KeyCode, style::ContentStyle}; +use mimalloc::MiMalloc; +use tortuise::{ + buffer::{Buffer, Cell, Event}, + file::FileManager, + input::InputManager, + scene::switch_scenes, + script::{ScriptContext, ScriptDeclaration, ScriptManager}, }; -use tortuise::buffer::{Buffer, Cell}; + +#[global_allocator] +static GLOBAL: MiMalloc = MiMalloc; + +fn get_timestamp() -> u128 { + SystemTime::UNIX_EPOCH.elapsed().unwrap().as_nanos() +} + +fn init_first_frame<'a>(_: &mut ScriptContext<'a>, state: &mut Box<[u8]>) { + *state = Box::from(get_timestamp().to_ne_bytes()); +} + +fn render_frame_rate<'a>(ctx: &mut ScriptContext<'a>, state: &mut Box<[u8]>) { + ctx.buffer.cells.clear(); + let end = get_timestamp(); + let last_frame_start = u128::from_ne_bytes(*state.as_array().unwrap()); + let frame_time = end - last_frame_start + 1; + let digits = [ + frame_time % 1_000_000 / 100_000, + frame_time % 100_000 / 10_000, + frame_time % 10_000 / 1_000, + frame_time % 1_000 / 100, + frame_time % 100 / 10, + frame_time % 10, + ]; + for (x, digit) in digits.into_iter().enumerate() { + ctx.buffer.cells.push(Cell { + character: char::from_digit(digit as u32, 10).unwrap(), + x: x as u16, + y: 0, + z: 0, + style: ContentStyle::new(), + }); + } + *state = Box::from(end.to_ne_bytes()); +} + +fn exit_on_escape(ctx: &mut ScriptContext, _: &mut Box<[u8]>) { + if ctx.input.is_key_pressed_this_frame(KeyCode::Esc) { + ctx.exit(); + } +} fn main() { - let mut stdout = std::io::stdout().lock(); - let mut buffer = Buffer::new(&mut stdout).unwrap(); - let mut last_frame_start = Instant::now(); + let stdout = Box::new(std::io::stdout().lock()); + let mut buffer = Buffer::new(stdout).unwrap(); + let mut input = InputManager::new(); + let mut context = ScriptContext { + buffer: &mut buffer, + input: &input, + }; + let scripts = [ + ScriptDeclaration::Static { + start: Some(init_first_frame), + update: Some(render_frame_rate), + end: None, + }, + ScriptDeclaration::Static { + start: None, + update: Some(exit_on_escape), + end: None, + }, + ]; + let mut scripts = ScriptManager::new(&scripts); + + let mut files = FileManager::default(); + let manifest = files + .load_file(Box::from("manifest.toml".as_ref())) + .unwrap() + .unwrap_manifest(); + switch_scenes(&manifest.scenes, &mut scripts, &mut context, 0); + buffer - .render_loop( - |renderer, event| { - if let Event::Key(event) = event - && event.code == KeyCode::Esc - { - let _ = renderer.finish(); - std::process::exit(0); - } - }, - |renderer| { - renderer.cells.clear(); - let end = Instant::now(); - let frame_time = (end - last_frame_start).as_micros(); - let digits = [ - frame_time % 1_000_000 / 100_000, - frame_time % 100_000 / 10_000, - frame_time % 10_000 / 1_000, - frame_time % 1_000 / 100, - frame_time % 100 / 10, - frame_time % 10, - ]; - for (x, digit) in digits.into_iter().enumerate() { - renderer.cells.push(Cell { - character: char::from_digit(digit as u32, 10).unwrap(), - x: x as u16, - y: 0, - z: 0, - style: ContentStyle::new(), - }); + .render_loop(|buffer, event| match event { + Event::Key(event) => { + if event.is_press() { + input.press_key(event.code); } - last_frame_start = Instant::now(); - }, - ) + } + Event::Render => { + let mut context = ScriptContext { + buffer, + input: &input, + }; + scripts.run_scripts(&mut context); + input.reset_next_frame(); + } + }) .unwrap(); } |
