mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/block/logic.rs')
| -rw-r--r-- | src/block/logic.rs | 101 |
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)) + } +} |