mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/block/logic.rs')
-rw-r--r--src/block/logic.rs101
1 files changed, 97 insertions, 4 deletions
diff --git a/src/block/logic.rs b/src/block/logic.rs
index f9c6094..bc35a60 100644
--- a/src/block/logic.rs
+++ b/src/block/logic.rs
@@ -1,10 +1,13 @@
-use crate::block::make_register;
-use crate::block::simple::SimpleBlock;
+use std::any::{Any, type_name};
+
+use crate::block::{BlockLogic, make_register};
+use crate::block::simple::{SimpleBlock, state_impl};
+use crate::data::dynamic::DynData;
make_register!
(
- MESSAGE: "message" => SimpleBlock::new(1, true); // TODO config: message
- SWITCH: "switch" => SimpleBlock::new(1, true); // TODO config: enabled
+ MESSAGE: "message" => MessageLogic;
+ SWITCH: "switch" => SwitchLogic;
MICRO_PROCESSOR: "micro-processor" => SimpleBlock::new(1, true); // TODO config: code & links
LOGIC_PROCESSOR: "logic-processor" => SimpleBlock::new(2, true); // TODO config: code & links
HYPER_PROCESSOR: "hyper-processor" => SimpleBlock::new(3, true); // TODO config: code & links
@@ -13,3 +16,93 @@ make_register!
LOGIC_DISPLAY: "logic-display" => SimpleBlock::new(3, true);
LARGE_LOGIC_DISPLAY: "large-logic-display" => SimpleBlock::new(6, true);
);
+
+pub struct MessageLogic;
+
+impl MessageLogic
+{
+ state_impl!(pub String);
+}
+
+impl BlockLogic for MessageLogic
+{
+ fn get_size(&self) -> u8
+ {
+ 1
+ }
+
+ fn is_symmetric(&self) -> bool
+ {
+ true
+ }
+
+ fn data_from_i32(&self, _: i32) -> DynData
+ {
+ DynData::Empty
+ }
+
+ fn deserialize_state(&self, data: DynData) -> Option<Box<dyn Any>>
+ {
+ match data
+ {
+ DynData::Empty | DynData::String(None) => Some(Self::create_state(String::new())),
+ DynData::String(Some(s)) => Some(Self::create_state(s)),
+ _ => panic!("{} cannot use data of {:?}", type_name::<Self>(), data.get_type()),
+ }
+ }
+
+ fn clone_state(&self, state: &dyn Any) -> Box<dyn Any>
+ {
+ Box::new(Self::get_state(state).clone())
+ }
+
+ fn serialize_state(&self, state: &dyn Any) -> DynData
+ {
+ DynData::String(Some(Self::get_state(state).clone()))
+ }
+}
+
+pub struct SwitchLogic;
+
+impl SwitchLogic
+{
+ state_impl!(pub bool);
+}
+
+impl BlockLogic for SwitchLogic
+{
+ fn get_size(&self) -> u8
+ {
+ 1
+ }
+
+ fn is_symmetric(&self) -> bool
+ {
+ true
+ }
+
+ fn data_from_i32(&self, _: i32) -> DynData
+ {
+ DynData::Empty
+ }
+
+ fn deserialize_state(&self, data: DynData) -> Option<Box<dyn Any>>
+ {
+ match data
+ {
+ DynData::Empty => Some(Self::create_state(true)),
+ DynData::Boolean(enabled) => Some(Self::create_state(enabled)),
+ _ => panic!("{} cannot use data of {:?}", type_name::<Self>(), data.get_type()),
+ }
+ }
+
+ fn clone_state(&self, state: &dyn Any) -> Box<dyn Any>
+ {
+ Box::new(Self::get_state(state).clone())
+ }
+
+ fn serialize_state(&self, state: &dyn Any) -> DynData
+ {
+ DynData::Boolean(*Self::get_state(state))
+ }
+}