Example #1
0
 public void SimulateElectricElement(ElectricElement electricElement)
 {
     if (electricElement.Simulate())
     {
         QueueElectricElementConnectionsForSimulation(electricElement, CircuitStep + 1);
     }
 }
Example #2
0
 public void UpdateElectricElements()
 {
     foreach (KeyValuePair <Point3, bool> item in m_pointsToUpdate)
     {
         Point3 key       = item.Key;
         int    cellValue = SubsystemTerrain.Terrain.GetCellValue(key.X, key.Y, key.Z);
         for (int i = 0; i < 6; i++)
         {
             ElectricElement electricElement = GetElectricElement(key.X, key.Y, key.Z, i);
             if (electricElement != null)
             {
                 if (electricElement is WireDomainElectricElement)
                 {
                     m_wiresToUpdate[key] = true;
                 }
                 else
                 {
                     m_electricElementsToRemove[electricElement] = true;
                 }
             }
         }
         if (item.Value)
         {
             m_persistentElementsVoltages.Remove(key);
         }
         int num = Terrain.ExtractContents(cellValue);
         if (BlocksManager.Blocks[num] is IElectricWireElementBlock)
         {
             m_wiresToUpdate[key] = true;
         }
         else
         {
             IElectricElementBlock electricElementBlock = BlocksManager.Blocks[num] as IElectricElementBlock;
             if (electricElementBlock != null)
             {
                 ElectricElement electricElement2 = electricElementBlock.CreateElectricElement(this, cellValue, key.X, key.Y, key.Z);
                 if (electricElement2 != null)
                 {
                     m_electricElementsToAdd[key] = electricElement2;
                 }
             }
         }
     }
     RemoveWireDomains();
     foreach (KeyValuePair <ElectricElement, bool> item2 in m_electricElementsToRemove)
     {
         RemoveElectricElement(item2.Key);
     }
     AddWireDomains();
     foreach (ElectricElement value in m_electricElementsToAdd.Values)
     {
         AddElectricElement(value);
     }
     m_pointsToUpdate.Clear();
     m_wiresToUpdate.Clear();
     m_electricElementsToAdd.Clear();
     m_electricElementsToRemove.Clear();
 }
Example #3
0
 public void QueueElectricElementConnectionsForSimulation(ElectricElement electricElement, int circuitStep)
 {
     foreach (ElectricConnection connection in electricElement.Connections)
     {
         if (connection.ConnectorType != 0 && connection.NeighborConnectorType != ElectricConnectorType.Output)
         {
             QueueElectricElementForSimulation(connection.NeighborElectricElement, circuitStep);
         }
     }
 }
Example #4
0
 public void Press()
 {
     if (!m_wasPressed && !ElectricElement.IsSignalHigh(m_voltage))
     {
         m_wasPressed = true;
         CellFace cellFace = base.CellFaces[0];
         base.SubsystemElectricity.SubsystemAudio.PlaySound("Audio/Click", 1f, 0f, new Vector3(cellFace.X, cellFace.Y, cellFace.Z), 2f, autoDelay: true);
         base.SubsystemElectricity.QueueElectricElementForSimulation(this, base.SubsystemElectricity.CircuitStep + 1);
     }
 }
Example #5
0
        public override bool OnInteract(TerrainRaycastResult raycastResult, ComponentMiner componentMiner)
        {
            int x = raycastResult.CellFace.X;
            int y = raycastResult.CellFace.Y;
            int z = raycastResult.CellFace.Z;

            for (int i = 0; i < 6; i++)
            {
                ElectricElement electricElement = m_subsystemElectricity.GetElectricElement(x, y, z, i);
                if (electricElement != null)
                {
                    return(electricElement.OnInteract(raycastResult, componentMiner));
                }
            }
            return(false);
        }
Example #6
0
        public bool IsTrapdoorElectricallyConnected(int x, int y, int z)
        {
            int cellValue = base.SubsystemTerrain.Terrain.GetCellValue(x, y, z);
            int num       = Terrain.ExtractContents(cellValue);
            int data      = Terrain.ExtractData(cellValue);

            if (BlocksManager.Blocks[num] is TrapdoorBlock)
            {
                ElectricElement electricElement = m_subsystemElectricity.GetElectricElement(x, y, z, TrapdoorBlock.GetMountingFace(data));
                if (electricElement != null && electricElement.Connections.Count > 0)
                {
                    return(true);
                }
            }
            return(false);
        }
Example #7
0
        public override bool OnEditBlock(int x, int y, int z, int value, ComponentPlayer componentPlayer)
        {
            MemoryBankData memoryBankData = GetBlockData(new Point3(x, y, z)) ?? new MemoryBankData();

            DialogsManager.ShowDialog(componentPlayer.GuiWidget, new EditMemeryDialogB(memoryBankData, delegate() {
                SetBlockData(new Point3(x, y, z), memoryBankData);
                int face = ((MemoryBankBlock)BlocksManager.Blocks[186]).GetFace(value);
                SubsystemElectricity subsystemElectricity = base.SubsystemTerrain.Project.FindSubsystem <SubsystemElectricity>(throwOnError: true);
                ElectricElement electricElement           = subsystemElectricity.GetElectricElement(x, y, z, face);
                if (electricElement != null)
                {
                    subsystemElectricity.QueueElectricElementForSimulation(electricElement, subsystemElectricity.CircuitStep + 1);
                }
            }));
            return(true);
        }
Example #8
0
 public void AddElectricElement(ElectricElement electricElement)
 {
     m_electricElements.Add(electricElement, value: true);
     foreach (CellFace cellFace2 in electricElement.CellFaces)
     {
         m_electricElementsByCellFace.Add(cellFace2, electricElement);
         m_tmpConnectionPaths.Clear();
         GetAllConnectedNeighbors(cellFace2.X, cellFace2.Y, cellFace2.Z, cellFace2.Face, m_tmpConnectionPaths);
         foreach (ElectricConnectionPath tmpConnectionPath in m_tmpConnectionPaths)
         {
             CellFace cellFace = new CellFace(cellFace2.X + tmpConnectionPath.NeighborOffsetX, cellFace2.Y + tmpConnectionPath.NeighborOffsetY, cellFace2.Z + tmpConnectionPath.NeighborOffsetZ, tmpConnectionPath.NeighborFace);
             if (m_electricElementsByCellFace.TryGetValue(cellFace, out ElectricElement value) && value != electricElement)
             {
                 int cellValue = SubsystemTerrain.Terrain.GetCellValue(cellFace2.X, cellFace2.Y, cellFace2.Z);
                 int num       = Terrain.ExtractContents(cellValue);
                 ElectricConnectorType value2 = ((IElectricElementBlock)BlocksManager.Blocks[num]).GetConnectorType(SubsystemTerrain, cellValue, cellFace2.Face, tmpConnectionPath.ConnectorFace, cellFace2.X, cellFace2.Y, cellFace2.Z).Value;
                 int cellValue2 = SubsystemTerrain.Terrain.GetCellValue(cellFace.X, cellFace.Y, cellFace.Z);
                 int num2       = Terrain.ExtractContents(cellValue2);
                 ElectricConnectorType value3 = ((IElectricElementBlock)BlocksManager.Blocks[num2]).GetConnectorType(SubsystemTerrain, cellValue2, cellFace.Face, tmpConnectionPath.NeighborConnectorFace, cellFace.X, cellFace.Y, cellFace.Z).Value;
                 electricElement.Connections.Add(new ElectricConnection
                 {
                     CellFace                = cellFace2,
                     ConnectorFace           = tmpConnectionPath.ConnectorFace,
                     ConnectorType           = value2,
                     NeighborElectricElement = value,
                     NeighborCellFace        = cellFace,
                     NeighborConnectorFace   = tmpConnectionPath.NeighborConnectorFace,
                     NeighborConnectorType   = value3
                 });
                 value.Connections.Add(new ElectricConnection
                 {
                     CellFace                = cellFace,
                     ConnectorFace           = tmpConnectionPath.NeighborConnectorFace,
                     ConnectorType           = value3,
                     NeighborElectricElement = electricElement,
                     NeighborCellFace        = cellFace2,
                     NeighborConnectorFace   = tmpConnectionPath.ConnectorFace,
                     NeighborConnectorType   = value2
                 });
             }
         }
     }
     QueueElectricElementForSimulation(electricElement, CircuitStep + 1);
     QueueElectricElementConnectionsForSimulation(electricElement, CircuitStep + 2);
     electricElement.OnAdded();
 }
        public override bool Simulate()
        {
            float voltage = m_voltage;
            bool  flag    = false;
            bool  flag2   = false;

            _ = base.Rotation;
            foreach (ElectricConnection connection in base.Connections)
            {
                if (connection.ConnectorType != ElectricConnectorType.Output && connection.NeighborConnectorType != 0)
                {
                    if (ElectricElement.IsSignalHigh(connection.NeighborElectricElement.GetOutputVoltage(connection.NeighborConnectorFace)))
                    {
                        if (m_clockAllowed)
                        {
                            flag           = true;
                            m_clockAllowed = false;
                        }
                    }
                    else
                    {
                        m_clockAllowed = true;
                    }
                    flag2 = true;
                }
            }
            if (flag2)
            {
                if (flag)
                {
                    m_voltage = GetRandomVoltage();
                }
            }
            else
            {
                m_voltage = GetRandomVoltage();
                base.SubsystemElectricity.QueueElectricElementForSimulation(this, base.SubsystemElectricity.CircuitStep + MathUtils.Max((int)(s_random.Float(0.25f, 0.75f) / 0.01f), 1));
            }
            if (m_voltage != voltage)
            {
                base.SubsystemElectricity.WritePersistentVoltage(base.CellFaces[0].Point, m_voltage);
                return(true);
            }
            return(false);
        }
Example #10
0
 public void RemoveElectricElement(ElectricElement electricElement)
 {
     electricElement.OnRemoved();
     QueueElectricElementConnectionsForSimulation(electricElement, CircuitStep + 1);
     m_electricElements.Remove(electricElement);
     foreach (CellFace cellFace in electricElement.CellFaces)
     {
         m_electricElementsByCellFace.Remove(cellFace);
     }
     foreach (ElectricConnection connection in electricElement.Connections)
     {
         int num = connection.NeighborElectricElement.Connections.FirstIndex((ElectricConnection c) => c.NeighborElectricElement == electricElement);
         if (num >= 0)
         {
             connection.NeighborElectricElement.Connections.RemoveAt(num);
         }
     }
 }
        public override bool Simulate()
        {
            float voltage = m_voltage;

            m_voltage = CalculateVoltage();
            if (ElectricElement.IsSignalHigh(m_voltage) != ElectricElement.IsSignalHigh(voltage))
            {
                if (ElectricElement.IsSignalHigh(m_voltage))
                {
                    m_glowPoint.Color = m_color;
                }
                else
                {
                    m_glowPoint.Color = Color.Transparent;
                }
            }
            return(false);
        }
Example #12
0
        public bool IsDoorElectricallyConnected(int x, int y, int z)
        {
            int cellValue = base.SubsystemTerrain.Terrain.GetCellValue(x, y, z);
            int num       = Terrain.ExtractContents(cellValue);
            int data      = Terrain.ExtractData(cellValue);

            if (BlocksManager.Blocks[num] is DoorBlock)
            {
                int num2 = DoorBlock.IsBottomPart(base.SubsystemTerrain.Terrain, x, y, z) ? y : (y - 1);
                for (int i = num2; i <= num2 + 1; i++)
                {
                    ElectricElement electricElement = m_subsystemElectricity.GetElectricElement(x, i, z, DoorBlock.GetHingeFace(data));
                    if (electricElement != null && electricElement.Connections.Count > 0)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
Example #13
0
 public void QueueElectricElementForSimulation(ElectricElement electricElement, int circuitStep)
 {
     if (circuitStep == CircuitStep + 1)
     {
         if (m_nextStepSimulateList == null && !m_futureSimulateLists.TryGetValue(CircuitStep + 1, out m_nextStepSimulateList))
         {
             m_nextStepSimulateList = GetListFromCache();
             m_futureSimulateLists.Add(CircuitStep + 1, m_nextStepSimulateList);
         }
         m_nextStepSimulateList[electricElement] = true;
     }
     else if (circuitStep > CircuitStep + 1)
     {
         if (!m_futureSimulateLists.TryGetValue(circuitStep, out Dictionary <ElectricElement, bool> value))
         {
             value = GetListFromCache();
             m_futureSimulateLists.Add(circuitStep, value);
         }
         value[electricElement] = true;
     }
 }
Example #14
0
 public override void OnHitByProjectile(CellFace cellFace, WorldItem worldItem)
 {
     if (m_score == 0 && !ElectricElement.IsSignalHigh(m_voltage))
     {
         if (cellFace.Face == 0 || cellFace.Face == 2)
         {
             float num  = worldItem.Position.X - (float)cellFace.X - 0.5f;
             float num2 = worldItem.Position.Y - (float)cellFace.Y - 0.5f;
             float num3 = MathUtils.Sqrt(num * num + num2 * num2);
             m_score = MathUtils.Clamp((int)MathUtils.Round(8f * (1f - num3 / 0.707f)), 1, 8);
         }
         else
         {
             float num4 = worldItem.Position.Z - (float)cellFace.Z - 0.5f;
             float num5 = worldItem.Position.Y - (float)cellFace.Y - 0.5f;
             float num6 = MathUtils.Sqrt(num4 * num4 + num5 * num5);
             m_score = MathUtils.Clamp((int)MathUtils.Round(8f * (1f - num6 / 0.5f)), 1, 8);
         }
         base.SubsystemElectricity.QueueElectricElementForSimulation(this, base.SubsystemElectricity.CircuitStep + 1);
     }
 }
        public override bool Simulate()
        {
            float voltage = m_voltage;

            if (m_pressure > 0f && Time.FrameIndex - m_lastPressFrameIndex < 2)
            {
                m_voltage = PressureToVoltage(m_pressure);
                base.SubsystemElectricity.QueueElectricElementForSimulation(this, base.SubsystemElectricity.CircuitStep + 10);
            }
            else
            {
                if (ElectricElement.IsSignalHigh(m_voltage))
                {
                    CellFace cellFace = base.CellFaces[0];
                    base.SubsystemElectricity.SubsystemAudio.PlaySound("Audio/BlockPlaced", 0.6f, -0.1f, new Vector3(cellFace.X, cellFace.Y, cellFace.Z), 2.5f, autoDelay: true);
                }
                m_voltage  = 0f;
                m_pressure = 0f;
            }
            return(m_voltage != voltage);
        }
Example #16
0
        public override bool OnEditBlock(int x, int y, int z, int value, ComponentPlayer componentPlayer)
        {
            int contents = Terrain.ExtractContents(value);
            int data     = Terrain.ExtractData(value);

            DialogsManager.ShowDialog(componentPlayer.GuiWidget, new EditPistonDialog(data, delegate(int newData)
            {
                if (newData != data && base.SubsystemTerrain.Terrain.GetCellContents(x, y, z) == contents)
                {
                    int value2 = Terrain.ReplaceData(value, newData);
                    base.SubsystemTerrain.ChangeCell(x, y, z, value2);
                    SubsystemElectricity subsystemElectricity = base.Project.FindSubsystem <SubsystemElectricity>(throwOnError: true);
                    ElectricElement electricElement           = subsystemElectricity.GetElectricElement(x, y, z, 0);
                    if (electricElement != null)
                    {
                        subsystemElectricity.QueueElectricElementForSimulation(electricElement, subsystemElectricity.CircuitStep + 1);
                    }
                }
            }));
            return(true);
        }
        public override bool Simulate()
        {
            int  counter  = m_counter;
            bool overflow = m_overflow;
            bool flag     = false;
            bool flag2    = false;
            bool flag3    = false;
            int  rotation = base.Rotation;

            foreach (ElectricConnection connection in base.Connections)
            {
                if (connection.ConnectorType != ElectricConnectorType.Output && connection.NeighborConnectorType != 0)
                {
                    ElectricConnectorDirection?connectorDirection = SubsystemElectricity.GetConnectorDirection(base.CellFaces[0].Face, rotation, connection.ConnectorFace);
                    if (connectorDirection.HasValue)
                    {
                        if (connectorDirection == ElectricConnectorDirection.Right)
                        {
                            flag = ElectricElement.IsSignalHigh(connection.NeighborElectricElement.GetOutputVoltage(connection.NeighborConnectorFace));
                        }
                        else if (connectorDirection == ElectricConnectorDirection.Left)
                        {
                            flag2 = ElectricElement.IsSignalHigh(connection.NeighborElectricElement.GetOutputVoltage(connection.NeighborConnectorFace));
                        }
                        else if (connectorDirection == ElectricConnectorDirection.In)
                        {
                            flag3 = ElectricElement.IsSignalHigh(connection.NeighborElectricElement.GetOutputVoltage(connection.NeighborConnectorFace));
                        }
                    }
                }
            }
            if (flag && m_plusAllowed)
            {
                m_plusAllowed = false;
                if (m_counter < 15)
                {
                    m_counter++;
                    m_overflow = false;
                }
                else
                {
                    m_counter  = 0;
                    m_overflow = true;
                }
            }
            else if (flag2 && m_minusAllowed)
            {
                m_minusAllowed = false;
                if (m_counter > 0)
                {
                    m_counter--;
                    m_overflow = false;
                }
                else
                {
                    m_counter  = 15;
                    m_overflow = true;
                }
            }
            else if (flag3 && m_resetAllowed)
            {
                m_counter  = 0;
                m_overflow = false;
            }
            if (!flag)
            {
                m_plusAllowed = true;
            }
            if (!flag2)
            {
                m_minusAllowed = true;
            }
            if (!flag3)
            {
                m_resetAllowed = true;
            }
            if (m_counter != counter || m_overflow != overflow)
            {
                base.SubsystemElectricity.WritePersistentVoltage(base.CellFaces[0].Point, (float)m_counter / 15f * (float)((!m_overflow) ? 1 : (-1)));
                return(true);
            }
            return(false);
        }
        public override bool Simulate()
        {
            float voltage = m_voltage;

            m_voltage = 0f;
            int rotation = base.Rotation;

            foreach (ElectricConnection connection in base.Connections)
            {
                if (connection.ConnectorType != ElectricConnectorType.Output && connection.NeighborConnectorType != 0 && ElectricElement.IsSignalHigh(connection.NeighborElectricElement.GetOutputVoltage(connection.NeighborConnectorFace)))
                {
                    ElectricConnectorDirection?connectorDirection = SubsystemElectricity.GetConnectorDirection(base.CellFaces[0].Face, rotation, connection.ConnectorFace);
                    if (connectorDirection.HasValue)
                    {
                        if (connectorDirection.Value == ElectricConnectorDirection.Top)
                        {
                            m_voltage += 71f / (339f * (float)Math.PI);
                        }
                        if (connectorDirection.Value == ElectricConnectorDirection.Right)
                        {
                            m_voltage += 142f / (339f * (float)Math.PI);
                        }
                        if (connectorDirection.Value == ElectricConnectorDirection.Bottom)
                        {
                            m_voltage += 4f / 15f;
                        }
                        if (connectorDirection.Value == ElectricConnectorDirection.Left)
                        {
                            m_voltage += 8f / 15f;
                        }
                    }
                }
            }
            return(m_voltage != voltage);
        }