dumpviewer/
dumpviewer.rs

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    ///game dump
12    dump: String,
13
14    #[arg(long, default_value = "true")]
15    ///Best quality rendering
16    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        // die on error
33        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}