74 lines
2.7 KiB
Rust
74 lines
2.7 KiB
Rust
use retro_rs::Emulator;
|
|
use rply_codec::{Frame, InputData, ReplayError, decode, encode};
|
|
use std::cell::RefCell;
|
|
use std::path::Path;
|
|
use std::rc::Rc;
|
|
|
|
fn main() {
|
|
let args: Vec<_> = std::env::args().collect();
|
|
let file =
|
|
std::fs::File::open(args.get(1).unwrap_or(&"examples/ff3.replay".to_string())).unwrap();
|
|
let outfile =
|
|
std::fs::File::create(args.get(2).unwrap_or(&"examples/ff3v2.replay".to_string())).unwrap();
|
|
let corefile = args
|
|
.get(3)
|
|
.unwrap_or(&"cores/snes9x_libretro".to_string())
|
|
.clone();
|
|
let romfile = args.get(4).unwrap_or(&"roms/ff3.sfc".to_string()).clone();
|
|
let mut emu = Emulator::create(Path::new(&corefile), Path::new(&romfile));
|
|
let file = std::io::BufReader::new(file);
|
|
let mut outfile = std::io::BufWriter::new(outfile);
|
|
let mut rply = decode(file).unwrap();
|
|
let header = &rply.header;
|
|
println!("Header in: {header:?}");
|
|
if header.version() != 0 {
|
|
println!("Only use this program for v0 replays!");
|
|
std::process::exit(-1);
|
|
}
|
|
assert!(emu.load(&rply.initial_state));
|
|
let mut header_out = header.clone();
|
|
header_out.upgrade();
|
|
let mut encoder = encode(header_out, &rply.initial_state, &mut outfile).unwrap();
|
|
let mut frame = Frame::default();
|
|
rply.read_key_events(&mut frame).unwrap();
|
|
rply.read_end_of_frame(&mut frame).unwrap();
|
|
let frame = Rc::new(RefCell::new(frame));
|
|
let rply = Rc::new(RefCell::new(rply));
|
|
let cb = {
|
|
let frame = Rc::clone(&frame);
|
|
let rply = Rc::clone(&rply);
|
|
Box::new(move |port, device, idx, id| {
|
|
let val = rply.borrow_mut().read_v0_button().unwrap();
|
|
//println!("{port}-{device}-{idx}-{id}: 0x{val:x}");
|
|
frame.borrow_mut().input_events.push(InputData {
|
|
port: u8::try_from(port).unwrap(),
|
|
device: u8::try_from(device).unwrap(),
|
|
idx: u8::try_from(idx).unwrap(),
|
|
id: u16::try_from(id).unwrap(),
|
|
val,
|
|
});
|
|
val
|
|
})
|
|
};
|
|
loop {
|
|
frame.borrow_mut().clear();
|
|
emu.run_with_button_callback(cb.clone());
|
|
match rply.borrow_mut().read_key_events(&mut frame.borrow_mut()) {
|
|
Ok(()) => {}
|
|
Err(ReplayError::IO(e)) => {
|
|
if e.kind() == std::io::ErrorKind::UnexpectedEof {
|
|
break;
|
|
}
|
|
panic!("{e}");
|
|
}
|
|
Err(e) => panic!("{e}"),
|
|
}
|
|
rply.borrow_mut()
|
|
.read_end_of_frame(&mut frame.borrow_mut())
|
|
.unwrap();
|
|
encoder.write_frame(&frame.borrow()).unwrap();
|
|
}
|
|
encoder.finish().unwrap();
|
|
println!("Header out: {:?}", encoder.header);
|
|
}
|