1use arg::Args;
2use log::{Level, LevelFilter, Metadata, Record};
3use sdl3::{event::Event, keyboard::Keycode};
4use std::{cell::RefCell, fs, rc::Rc, time::Duration};
5
6use librsmsx::{libs::msx::SaveData, prelude::*};
7
8#[derive(Args, Debug)]
9struct MyArgs {
10 #[arg(long)]
11 dump: String,
13
14 #[arg(long, default_value = "true")]
15 quality: bool,
17}
18
19static MY_LOGGER: MyLogger = MyLogger;
20
21struct MyLogger;
22
23impl log::Log for MyLogger {
24 fn enabled(&self, metadata: &Metadata) -> bool {
25 metadata.level() <= Level::Debug
26 }
27
28 fn log(&self, record: &Record) {
29 if self.enabled(record.metadata()) {
30 println!("{} - {}", record.level(), record.args());
31 }
32 if record.metadata().level() == Level::Error {
34 panic!();
35 }
36 }
37 fn flush(&self) {}
38}
39
40fn main() -> Result<(), Box<dyn std::error::Error>> {
41 log::set_logger(&MY_LOGGER).unwrap();
42 log::set_max_level(LevelFilter::Debug);
43
44 let args: std::vec::Vec<_> = std::env::args().skip(1).collect();
45 match MyArgs::from_args(args.iter().map(|x| x.as_str())) {
46 Ok(args) => {
47 let base_scale = 2.0;
48 let scale_magnifier = 2.0;
49 let mut sys = BaseSystem::new(base_scale * scale_magnifier);
50 let vdp = Rc::new(RefCell::new(Vdp::new(GraphicsType::Normal, args.quality)));
51 let mut event_pump = sys.create_event_pump();
52 let contents = fs::read(args.dump).unwrap();
53 let dd: SaveData = serde_json::from_slice(&contents).unwrap();
54 vdp.borrow_mut().set_data(dd.vdp);
55 vdp.borrow_mut().update_buffer();
56 {
57 let scale = sys.get_scale();
58 let canvas = sys.get_canvas();
59 canvas.set_scale(scale, scale).unwrap();
60 }
61
62 'running: loop {
63 for event in event_pump.poll_iter() {
64 match event {
65 Event::Quit { .. }
66 | Event::KeyDown {
67 keycode: Some(Keycode::Escape),
68 ..
69 } => break 'running,
70 _ => {}
71 }
72 }
73 vdp.borrow_mut().graphics_render(&mut sys);
74 let canvas = sys.get_canvas();
75 canvas.present();
76 std::thread::sleep(Duration::from_millis(10_u64));
77 }
78 }
79 Err(err) => println!("err={:?}", err),
80 }
81 Ok(())
82}