summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs133
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();
}