use arg::Args;
use log::{Level, LevelFilter, Metadata, Record};
use sdl3::{event::Event, keyboard::Keycode};
use std::{cell::RefCell, fs, rc::Rc, time::Duration};
use librsmsx::{libs::msx::SaveData, prelude::*};
#[derive(Args, Debug)]
struct MyArgs {
#[arg(long)]
dump: String,
#[arg(long, default_value = "true")]
quality: bool,
}
static MY_LOGGER: MyLogger = MyLogger;
struct MyLogger;
impl log::Log for MyLogger {
fn enabled(&self, metadata: &Metadata) -> bool {
metadata.level() <= Level::Debug
}
fn log(&self, record: &Record) {
if self.enabled(record.metadata()) {
println!("{} - {}", record.level(), record.args());
}
if record.metadata().level() == Level::Error {
panic!();
}
}
fn flush(&self) {}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
log::set_logger(&MY_LOGGER).unwrap();
log::set_max_level(LevelFilter::Debug);
let args: std::vec::Vec<_> = std::env::args().skip(1).collect();
match MyArgs::from_args(args.iter().map(|x| x.as_str())) {
Ok(args) => {
let base_scale = 2.0;
let scale_magnifier = 2.0;
let mut sys = BaseSystem::new(base_scale * scale_magnifier);
let vdp = Rc::new(RefCell::new(Vdp::new(GraphicsType::Normal, args.quality)));
let mut event_pump = sys.create_event_pump();
let contents = fs::read(args.dump).unwrap();
let dd: SaveData = serde_json::from_slice(&contents).unwrap();
vdp.borrow_mut().set_data(dd.vdp);
vdp.borrow_mut().update_buffer();
{
let scale = sys.get_scale();
let canvas = sys.get_canvas();
canvas.set_scale(scale, scale).unwrap();
}
'running: loop {
for event in event_pump.poll_iter() {
match event {
Event::Quit { .. }
| Event::KeyDown {
keycode: Some(Keycode::Escape),
..
} => break 'running,
_ => {}
}
}
vdp.borrow_mut().graphics_render(&mut sys);
let canvas = sys.get_canvas();
canvas.present();
std::thread::sleep(Duration::from_millis(10_u64));
}
}
Err(err) => println!("err={:?}", err),
}
Ok(())
}