Convert to a public API for now
This commit is contained in:
parent
0e8edad446
commit
8219f968f5
1 changed files with 44 additions and 43 deletions
87
src/lib.rs
87
src/lib.rs
|
|
@ -1,77 +1,76 @@
|
||||||
use std::io::{Read, Write};
|
use std::io::{Read, Write};
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
#[non_exhaustive]
|
|
||||||
pub enum SaveType {
|
pub enum SaveType {
|
||||||
World,
|
World,
|
||||||
Subassembly,
|
Subassembly,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct ModInfo {
|
pub struct ModInfo {
|
||||||
mod_id: String,
|
pub mod_id: String,
|
||||||
mod_version: [i32; 4],
|
pub mod_version: [i32; 4],
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct ComponentType {
|
pub struct ComponentType {
|
||||||
numeric_id: u16,
|
pub numeric_id: u16,
|
||||||
text_id: String,
|
pub text_id: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Input {
|
pub struct Input {
|
||||||
circuit_state_id: i32,
|
pub circuit_state_id: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Output {
|
pub struct Output {
|
||||||
circuit_state_id: i32,
|
pub circuit_state_id: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Component {
|
pub struct Component {
|
||||||
address: u32,
|
pub address: u32,
|
||||||
parent: u32,
|
pub parent: u32,
|
||||||
type_id: u16,
|
pub type_id: u16,
|
||||||
position: [f32; 3],
|
pub position: [f32; 3],
|
||||||
rotation: [f32; 4],
|
pub rotation: [f32; 4],
|
||||||
inputs: Vec<Input>,
|
pub inputs: Vec<Input>,
|
||||||
outputs: Vec<Output>,
|
pub outputs: Vec<Output>,
|
||||||
custom_data: Option<Vec<u8>>,
|
pub custom_data: Option<Vec<u8>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct PegAddress {
|
pub struct PegAddress {
|
||||||
is_input: bool,
|
pub is_input: bool,
|
||||||
component_address: u32,
|
pub component_address: u32,
|
||||||
peg_index: i32,
|
pub peg_index: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Wire {
|
pub struct Wire {
|
||||||
start_peg: PegAddress,
|
pub start_peg: PegAddress,
|
||||||
end_peg: PegAddress,
|
pub end_peg: PegAddress,
|
||||||
circuit_state_id: i32,
|
pub circuit_state_id: i32,
|
||||||
rotation: f32,
|
pub rotation: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum CircuitStates {
|
pub enum CircuitStates {
|
||||||
WorldFormat { circuit_states: Vec<u8> },
|
WorldFormat { circuit_states: Vec<u8> },
|
||||||
SubassemblyFormat { on_states: Vec<i32> },
|
SubassemblyFormat { on_states: Vec<i32> },
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct BlotterFile {
|
pub struct BlotterFile {
|
||||||
save_version: u8,
|
pub save_version: u8,
|
||||||
game_version: [i32; 4],
|
pub game_version: [i32; 4],
|
||||||
save_type: SaveType,
|
pub save_type: SaveType,
|
||||||
mods: Vec<ModInfo>,
|
pub mods: Vec<ModInfo>,
|
||||||
component_types: Vec<ComponentType>,
|
pub component_types: Vec<ComponentType>,
|
||||||
components: Vec<Component>,
|
pub components: Vec<Component>,
|
||||||
wires: Vec<Wire>,
|
pub wires: Vec<Wire>,
|
||||||
circuit_states: CircuitStates,
|
pub circuit_states: CircuitStates,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BlotterFile {
|
impl BlotterFile {
|
||||||
|
|
@ -108,7 +107,7 @@ impl BlotterFile {
|
||||||
1 => SaveType::World,
|
1 => SaveType::World,
|
||||||
2 => SaveType::Subassembly,
|
2 => SaveType::Subassembly,
|
||||||
_ => {
|
_ => {
|
||||||
return Err(Error::UnknownSaveType(save_type_id));
|
return Err(Error::InvalidSave);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -280,17 +279,20 @@ impl BlotterFile {
|
||||||
write_f32(wire.rotation, writer)?;
|
write_f32(wire.rotation, writer)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
match &self.circuit_states {
|
match (self.save_type, &self.circuit_states) {
|
||||||
CircuitStates::WorldFormat { circuit_states } => {
|
(SaveType::World, CircuitStates::WorldFormat { circuit_states }) => {
|
||||||
write_usize(circuit_states.len(), writer)?;
|
write_usize(circuit_states.len(), writer)?;
|
||||||
writer.write_all(&circuit_states)?;
|
writer.write_all(&circuit_states)?;
|
||||||
}
|
}
|
||||||
CircuitStates::SubassemblyFormat { on_states } => {
|
(SaveType::Subassembly, CircuitStates::SubassemblyFormat { on_states }) => {
|
||||||
write_usize(on_states.len(), writer)?;
|
write_usize(on_states.len(), writer)?;
|
||||||
for &v in on_states {
|
for &v in on_states {
|
||||||
write_i32(v, writer)?;
|
write_i32(v, writer)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_ => {
|
||||||
|
return Err(Error::InvalidSave);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
writer.write_all(b"redstone sux lol")?;
|
writer.write_all(b"redstone sux lol")?;
|
||||||
|
|
@ -304,7 +306,6 @@ pub enum Error {
|
||||||
IoError(std::io::Error),
|
IoError(std::io::Error),
|
||||||
InvalidSave,
|
InvalidSave,
|
||||||
IncompatibleVersion(u8),
|
IncompatibleVersion(u8),
|
||||||
UnknownSaveType(u8),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<std::io::Error> for Error {
|
impl From<std::io::Error> for Error {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue