Keep track of circuit/net states.
This commit is contained in:
parent
935523a414
commit
c6d7e57c59
4 changed files with 37 additions and 4 deletions
|
|
@ -6,3 +6,4 @@ edition = "2021"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
bitvec = "1.0"
|
||||||
|
|
@ -13,6 +13,10 @@ impl<T> DenseStore<T> {
|
||||||
Self { items: Vec::new() }
|
Self { items: Vec::new() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn len(&self) -> usize {
|
||||||
|
self.items.len()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get(&self, index: Index<T>) -> Option<&T> {
|
pub fn get(&self, index: Index<T>) -> Option<&T> {
|
||||||
self.items.get(index.into_raw())
|
self.items.get(index.into_raw())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
mod serialize;
|
mod serialize;
|
||||||
|
|
||||||
|
use bitvec::vec::BitVec;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
latest::ModInfo,
|
latest::ModInfo,
|
||||||
misc::{
|
misc::{
|
||||||
|
|
@ -20,6 +22,7 @@ pub struct Sandbox {
|
||||||
components: ObjectStore<ComponentInfo>,
|
components: ObjectStore<ComponentInfo>,
|
||||||
wires: ObjectStore<WireInfo>,
|
wires: ObjectStore<WireInfo>,
|
||||||
nets: DenseStore<NetInfo>,
|
nets: DenseStore<NetInfo>,
|
||||||
|
net_states: BitVec<u8>,
|
||||||
|
|
||||||
next_type: u16,
|
next_type: u16,
|
||||||
component_types: HashMap<String, u16>,
|
component_types: HashMap<String, u16>,
|
||||||
|
|
@ -40,6 +43,7 @@ impl Sandbox {
|
||||||
components: ObjectStore::new(),
|
components: ObjectStore::new(),
|
||||||
wires: ObjectStore::new(),
|
wires: ObjectStore::new(),
|
||||||
nets: DenseStore::new(),
|
nets: DenseStore::new(),
|
||||||
|
net_states: BitVec::new(),
|
||||||
|
|
||||||
next_type: component_types.values().copied().max().unwrap_or(0),
|
next_type: component_types.values().copied().max().unwrap_or(0),
|
||||||
component_types,
|
component_types,
|
||||||
|
|
@ -270,6 +274,9 @@ impl Sandbox {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_net(&mut self) -> NetId {
|
fn make_net(&mut self) -> NetId {
|
||||||
|
assert_eq!(self.nets.len(), self.net_states.len());
|
||||||
|
|
||||||
|
self.net_states.push(false);
|
||||||
NetId(self.nets.insert(NetInfo {
|
NetId(self.nets.insert(NetInfo {
|
||||||
wires: HashSet::new(),
|
wires: HashSet::new(),
|
||||||
pegs: HashSet::new(),
|
pegs: HashSet::new(),
|
||||||
|
|
@ -287,6 +294,11 @@ impl Sandbox {
|
||||||
for peg_id in &renamed.pegs.clone() {
|
for peg_id in &renamed.pegs.clone() {
|
||||||
self.get_peg_mut(peg_id).unwrap().net_id = NetId(rename.dest);
|
self.get_peg_mut(peg_id).unwrap().net_id = NetId(rename.dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Perform the same swap-remove in net_states:
|
||||||
|
self.net_states.swap_remove(rename.dest.into_raw());
|
||||||
|
|
||||||
|
assert_eq!(self.nets.len(), self.net_states.len());
|
||||||
Some(net)
|
Some(net)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
//! Conversions between the Sandbox editor and Blotter serialization types.
|
//! Conversions between the Sandbox editor and Blotter serialization types.
|
||||||
|
|
||||||
|
use bitvec::vec::BitVec;
|
||||||
|
|
||||||
use crate::latest as blotter;
|
use crate::latest as blotter;
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
|
|
||||||
|
|
@ -101,6 +103,9 @@ impl From<&super::Sandbox> for blotter::BlotterFile {
|
||||||
components.push(ser.serialize_component(component_id, component))
|
components.push(ser.serialize_component(component_id, component))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut states = sandbox.net_states.clone();
|
||||||
|
states.set_uninitialized(false);
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
game_version: GAME_VERSION,
|
game_version: GAME_VERSION,
|
||||||
save_type: blotter::SaveType::World,
|
save_type: blotter::SaveType::World,
|
||||||
|
|
@ -120,7 +125,7 @@ impl From<&super::Sandbox> for blotter::BlotterFile {
|
||||||
.map(|(_id, wire)| ser.serialize_wire(wire))
|
.map(|(_id, wire)| ser.serialize_wire(wire))
|
||||||
.collect(),
|
.collect(),
|
||||||
circuit_states: blotter::CircuitStates::WorldFormat {
|
circuit_states: blotter::CircuitStates::WorldFormat {
|
||||||
circuit_states: vec![], //TODO
|
circuit_states: states.into_vec(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -218,6 +223,19 @@ impl From<&blotter::BlotterFile> for super::Sandbox {
|
||||||
file.mods.clone(),
|
file.mods.clone(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
match &file.circuit_states {
|
||||||
|
blotter::CircuitStates::WorldFormat { circuit_states } => {
|
||||||
|
sandbox.net_states = BitVec::from_slice(circuit_states);
|
||||||
|
for _ in 0..8 * circuit_states.len() {
|
||||||
|
sandbox.nets.insert(super::NetInfo {
|
||||||
|
wires: HashSet::new(),
|
||||||
|
pegs: HashSet::new(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => panic!("unsupported circuit state format"),
|
||||||
|
}
|
||||||
|
|
||||||
for component in &file.components {
|
for component in &file.components {
|
||||||
let id = sandbox.insert_component(de.deserialize_component(component));
|
let id = sandbox.insert_component(de.deserialize_component(component));
|
||||||
de.register_component(component.address, id);
|
de.register_component(component.address, id);
|
||||||
|
|
@ -230,8 +248,6 @@ impl From<&blotter::BlotterFile> for super::Sandbox {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO load circuit states
|
|
||||||
|
|
||||||
sandbox
|
sandbox
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue