summaryrefslogtreecommitdiff
path: root/src/main.rs
blob: 66e4cf4884b64a32658e59904012192ec3a5b2a2 (plain)
use std::io::BufWriter;

use mimalloc::MiMalloc;
use tortuise::{
	buffer::{Buffer, Event},
	file::FileManager,
	input::InputManager,
	scene::switch_scenes,
	script::{ScriptContext, ScriptManager, WasmRunner},
	storage::StorageManager,
	time::TimeContext,
};

#[global_allocator]
static GLOBAL: MiMalloc = MiMalloc;

fn main() {
	let mut files = FileManager::default();
	let wasm_runner = WasmRunner::new();
	let manifest = files
		.load_file(Box::from("manifest.toml".as_ref()), &wasm_runner.engine)
		.unwrap()
		.unwrap_manifest()
		.clone();

	let stdout = Box::new(BufWriter::new(std::io::stdout().lock()));
	let mut buffer = Buffer::new(stdout).unwrap();
	let mut input = InputManager::new();
	let mut time = TimeContext::new();
	let mut storage = StorageManager::load(etcetera::AppStrategyArgs {
		top_level_domain: "com".into(),
		author: "botahamec".into(),
		app_name: manifest.name.to_string(),
	})
	.unwrap();
	let mut scripts = ScriptManager::new(&manifest.scripts);
	let mut context = ScriptContext {
		manifest: &manifest,
		buffer: &mut buffer,
		storage: &mut storage,
		input: &input,
		time: &time,
		operation_queue: Vec::new(),
	};

	switch_scenes(
		&mut scripts,
		&mut context,
		&mut files,
		&wasm_runner,
		manifest.first_scene,
	);

	let server_addr = format!("127.0.0.1:{}", puffin_http::DEFAULT_PORT);
	let _puffin_server = puffin_http::Server::new(&server_addr).unwrap();
	puffin::set_scopes_on(true);
	buffer
		.render_loop(|buffer, event| match event {
			Event::Key(event) => {
				if event.is_press() {
					input.press_key(event.code);
				}
			}
			Event::Render => {
				buffer.cells.clear();
				let mut context = ScriptContext {
					manifest: &manifest,
					buffer,
					storage: &mut storage,
					input: &input,
					time: &time,
					operation_queue: Vec::new(),
				};
				scripts.run_scripts(&mut context, &wasm_runner, &mut files);
				input.reset_next_frame();
				time.next_frame();
			}
		})
		.unwrap();
}