diff options
Diffstat (limited to 'src/Simulator/RedstoneSimulator.h')
-rw-r--r-- | src/Simulator/RedstoneSimulator.h | 67 |
1 files changed, 51 insertions, 16 deletions
diff --git a/src/Simulator/RedstoneSimulator.h b/src/Simulator/RedstoneSimulator.h index d68c6daeb..d3002394a 100644 --- a/src/Simulator/RedstoneSimulator.h +++ b/src/Simulator/RedstoneSimulator.h @@ -32,7 +32,6 @@ public: REDSTONE_Z_NEG = 0x8, }; eRedstoneDirection GetWireDirection(int a_BlockX, int a_BlockY, int a_BlockZ); - eRedstoneDirection GetWireDirection(const Vector3i & a_Pos) { return GetWireDirection(a_Pos.x, a_Pos.y, a_Pos.z); } private: @@ -64,59 +63,95 @@ private: // In addition to being non-performant, it would stop the player from actually breaking said device /* ====== SOURCES ====== */ - ///<summary>Handles the redstone torch</summary> + /// <summary>Handles the redstone torch</summary> void HandleRedstoneTorch(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_MyState); - ///<summary>Handles the redstone block</summary> + /// <summary>Handles the redstone block</summary> void HandleRedstoneBlock(int a_BlockX, int a_BlockY, int a_BlockZ); - ///<summary>Handles levers</summary> + /// <summary>Handles levers</summary> void HandleRedstoneLever(int a_BlockX, int a_BlockY, int a_BlockZ); - ///<summary>Handles buttons</summary> + /// <summary>Handles buttons</summary> void HandleRedstoneButton(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType); /* ==================== */ /* ====== CARRIERS ====== */ - ///<summary>Handles redstone wire</summary> + /// <summary>Handles redstone wire</summary> void HandleRedstoneWire(int a_BlockX, int a_BlockY, int a_BlockZ); - ///<summary>Handles repeaters</summary> + /// <summary>Handles repeaters</summary> void HandleRedstoneRepeater(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_MyState); /* ====================== */ /* ====== DEVICES ====== */ - ///<summary>Handles pistons</summary> + /// <summary>Handles pistons</summary> void HandlePiston(int a_BlockX, int a_BlockY, int a_BlockZ); - ///<summary>Handles dispensers and droppers</summary> + /// <summary>Handles dispensers and droppers</summary> void HandleDropSpenser(int a_BlockX, int a_BlockY, int a_BlockZ); - ///<summary>Handles TNT (exploding)</summary> + /// <summary>Handles TNT (exploding)</summary> void HandleTNT(int a_BlockX, int a_BlockY, int a_BlockZ); - ///<summary>Handles redstone lamps</summary> + /// <summary>Handles redstone lamps</summary> void HandleRedstoneLamp(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_MyState); - ///<summary>Handles doords</summary> + /// <summary>Handles doords</summary> void HandleDoor(int a_BlockX, int a_BlockY, int a_BlockZ); - ///<summary>Handles activator, detector, and powered rails</summary> + /// <summary>Handles activator, detector, and powered rails</summary> void HandleRail(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_MyType); /* ===================== */ /* ====== Helper functions ====== */ + /// <summary>Marks a block as powered</summary> void SetBlockPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock); + /// <summary>Marks a block as being powered through another block</summary> void SetBlockLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, int a_MiddleX, int a_MiddleY, int a_MiddleZ, int a_SourceX, int a_SourceY, int a_SourceZ, BLOCKTYPE a_SourceBlock, BLOCKTYPE a_MiddeBlock); - void SetDirectionLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Direction, BLOCKTYPE a_SourceType); + /// <summary>Marks the second block in a direction as linked powered</summary> + void SetDirectionLinkedPowered(int a_BlockX, int a_BlockY, int a_BlockZ, char a_Direction, BLOCKTYPE a_SourceBlock); + /// <summary>Marks all blocks immediately surrounding a coordinate as powered</summary> + void SetAllDirsAsPowered(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_SourceBlock); + /// <summary>Returns if a coordinate is powered or linked powered</summary> bool AreCoordsPowered(int a_BlockX, int a_BlockY, int a_BlockZ); + /// <summary>Returns if a repeater is powered</summary> bool IsRepeaterPowered(int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_Meta); + /// <summary>Returns if lever metadata marks it as emitting power</summary> bool IsLeverOn(NIBBLETYPE a_BlockMeta); + /// <summary>Returns if button metadata marks it as emitting power</summary> bool IsButtonOn(NIBBLETYPE a_BlockMeta); /* ============================== */ + /* ====== Misc Functions ====== */ + /// <summary>Returns if a block is viable to be the MiddleBlock of a SetLinkedPowered operation</summary> + inline static bool IsViableMiddleBlock(BLOCKTYPE Block) + { + if (!g_BlockIsSolid[Block]) { return false; } + + switch (Block) + { + // Add SOLID but not viable middle blocks here + case E_BLOCK_REDSTONE_REPEATER_ON: + case E_BLOCK_REDSTONE_REPEATER_OFF: + { + return false; + } + default: + { + return true; + } + } + } + + /// <summary>Returns if a block is a mechanism (something that accepts power and does something)</summary> inline static bool IsMechanism(BLOCKTYPE Block) { switch (Block) { + case E_BLOCK_ACTIVATOR_RAIL: case E_BLOCK_PISTON: case E_BLOCK_STICKY_PISTON: case E_BLOCK_DISPENSER: case E_BLOCK_DROPPER: + case E_BLOCK_FENCE_GATE: + case E_BLOCK_HOPPER: + case E_BLOCK_NOTE_BLOCK: case E_BLOCK_TNT: + case E_BLOCK_TRAPDOOR: case E_BLOCK_REDSTONE_LAMP_OFF: case E_BLOCK_REDSTONE_LAMP_ON: case E_BLOCK_WOODEN_DOOR: @@ -131,6 +166,7 @@ private: } } + /// <summary>Returns if a block has the potential to output power</summary> inline static bool IsPotentialSource(BLOCKTYPE Block) { switch (Block) @@ -142,10 +178,8 @@ private: case E_BLOCK_REDSTONE_TORCH_ON: case E_BLOCK_LEVER: case E_BLOCK_REDSTONE_REPEATER_ON: - case E_BLOCK_REDSTONE_REPEATER_OFF: case E_BLOCK_BLOCK_OF_REDSTONE: case E_BLOCK_ACTIVE_COMPARATOR: - case E_BLOCK_INACTIVE_COMPARATOR: { return true; } @@ -153,6 +187,7 @@ private: } } + /// <summary>Returns if a block is any sort of redstone device</summary> inline static bool IsRedstone(BLOCKTYPE Block) { switch (Block) |