Exemplo n.º 1
0
 protected override void Load(TemplatesDatabase.ValuesDictionary valuesDictionary)
 {
     base.Load(valuesDictionary);
     subsystemTerrain     = Project.FindSubsystem <SubsystemTerrain>(true);
     subsystemElectricity = Project.FindSubsystem <SubsystemElectricity>(true);
     mCommandEngine       = Project.FindSubsystem <SubsystemCommandEngine>(true);
 }
        public override float GetOutputVoltage(int face)
        {
            ElectricConnectorDirection?connectorDirection = SubsystemElectricity.GetConnectorDirection(base.CellFaces[0].Face, base.Rotation, face);

            if (connectorDirection.HasValue)
            {
                if (connectorDirection.Value == ElectricConnectorDirection.Top)
                {
                    return((float)(GetClockValue() & 0xF) / 15f);
                }
                if (connectorDirection.Value == ElectricConnectorDirection.Right)
                {
                    return((float)((GetClockValue() >> 4) & 0xF) / 15f);
                }
                if (connectorDirection.Value == ElectricConnectorDirection.Bottom)
                {
                    return((float)((GetClockValue() >> 8) & 0xF) / 15f);
                }
                if (connectorDirection.Value == ElectricConnectorDirection.Left)
                {
                    return((float)((GetClockValue() >> 12) & 0xF) / 15f);
                }
                if (connectorDirection.Value == ElectricConnectorDirection.In)
                {
                    return((float)((GetClockValue() >> 16) & 0xF) / 15f);
                }
            }
            return(0f);
        }
        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);
        }
        public override float GetOutputVoltage(int face)
        {
            ElectricConnectorDirection?connectorDirection = SubsystemElectricity.GetConnectorDirection(base.CellFaces[0].Face, base.Rotation, face);

            if (connectorDirection.HasValue)
            {
                if (connectorDirection.Value == ElectricConnectorDirection.Top)
                {
                    return(((m_bits & 1) != 0) ? 1 : 0);
                }
                if (connectorDirection.Value == ElectricConnectorDirection.Right)
                {
                    return(((m_bits & 2) != 0) ? 1 : 0);
                }
                if (connectorDirection.Value == ElectricConnectorDirection.Bottom)
                {
                    return(((m_bits & 4) != 0) ? 1 : 0);
                }
                if (connectorDirection.Value == ElectricConnectorDirection.Left)
                {
                    return(((m_bits & 8) != 0) ? 1 : 0);
                }
            }
            return(0f);
        }
Exemplo n.º 5
0
        public ElectricConnectorType?GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
        {
            int             data        = Terrain.ExtractData(value);
            int             rotation    = GetRotation(data);
            int             designIndex = GetDesignIndex(data);
            FurnitureDesign design      = terrain.SubsystemFurnitureBlockBehavior.GetDesign(designIndex);

            if (design != null)
            {
                int num = CellFace.OppositeFace((face < 4) ? ((face - rotation + 4) % 4) : face);
                if ((design.MountingFacesMask & (1 << num)) != 0 && SubsystemElectricity.GetConnectorDirection(face, 0, connectorFace).HasValue)
                {
                    Point3 point     = CellFace.FaceToPoint3(face);
                    int    cellValue = terrain.Terrain.GetCellValue(x - point.X, y - point.Y, z - point.Z);
                    if (!BlocksManager.Blocks[Terrain.ExtractContents(cellValue)].IsFaceTransparent(terrain, CellFace.OppositeFace(num), cellValue))
                    {
                        if (design.InteractionMode == FurnitureInteractionMode.Multistate || design.InteractionMode == FurnitureInteractionMode.ConnectedMultistate)
                        {
                            return(ElectricConnectorType.Input);
                        }
                        if (design.InteractionMode == FurnitureInteractionMode.ElectricButton || design.InteractionMode == FurnitureInteractionMode.ElectricSwitch)
                        {
                            return(ElectricConnectorType.Output);
                        }
                    }
                }
            }
            return(null);
        }
Exemplo n.º 6
0
 public ElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace)
     : this(subsystemElectricity, new List <CellFace>
 {
     cellFace
 })
 {
 }
        public LightBulbElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace, int value)
            : base(subsystemElectricity, cellFace)
        {
            m_lastChangeCircuitStep = base.SubsystemElectricity.CircuitStep;
            int data = Terrain.ExtractData(value);

            m_intensity = LightbulbBlock.GetLightIntensity(data);
        }
Exemplo n.º 8
0
 public ElectricConnectorType?GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
 {
     if (face == 4 && SubsystemElectricity.GetConnectorDirection(4, 0, connectorFace).HasValue)
     {
         return(ElectricConnectorType.Output);
     }
     return(null);
 }
Exemplo n.º 9
0
 public CraftingMachineElectricElement(SubsystemElectricity subsystemElectricity, Point3 point)
     : base(subsystemElectricity, new List <CellFace>
 {
     new CellFace(point.X, point.Y, point.Z, 4),
     new CellFace(point.X, point.Y, point.Z, 5)
 })
 {
     Point = point;
 }
Exemplo n.º 10
0
        public SwitchFurnitureElectricElement(SubsystemElectricity subsystemElectricity, Point3 point, int value)
            : base(subsystemElectricity, point)
        {
            FurnitureDesign design = FurnitureBlock.GetDesign(subsystemElectricity.SubsystemTerrain.SubsystemFurnitureBlockBehavior, value);

            if (design != null && design.LinkedDesign != null)
            {
                m_voltage = ((design.Index >= design.LinkedDesign.Index) ? 1 : 0);
            }
        }
Exemplo n.º 11
0
        public override ElectricConnectorType?GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
        {
            int face2 = GetFace(value);

            if (face == face2 && SubsystemElectricity.GetConnectorDirection(face2, 0, connectorFace).HasValue)
            {
                return(ElectricConnectorType.Input);
            }
            return(null);
        }
Exemplo n.º 12
0
        public ElectricConnectorType?GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
        {
            int data = Terrain.ExtractData(value);

            if (face != GetFace(data) || !SubsystemElectricity.GetConnectorDirection(face, 0, connectorFace).HasValue)
            {
                return(null);
            }
            return(ElectricConnectorType.Input);
        }
        public SoundGeneratorElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace)
            : base(subsystemElectricity, cellFace)
        {
            m_subsystemNoise     = subsystemElectricity.Project.FindSubsystem <SubsystemNoise>(throwOnError: true);
            m_subsystemParticles = subsystemElectricity.Project.FindSubsystem <SubsystemParticles>(throwOnError: true);
            Vector3 vector   = CellFace.FaceToVector3(cellFace.Face);
            Vector3 position = new Vector3(cellFace.Point) + new Vector3(0.5f) - 0.2f * vector;

            m_particleSystem = new SoundParticleSystem(subsystemElectricity.SubsystemTerrain, position, vector);
        }
 public CommandElectricElement(SubsystemElectricity subsystemElectricity, Point3 point) : base(subsystemElectricity, new List <CellFace>
 {
     new CellFace(point.X, point.Y, point.Z, 0),
     new CellFace(point.X, point.Y, point.Z, 1),
     new CellFace(point.X, point.Y, point.Z, 2),
     new CellFace(point.X, point.Y, point.Z, 3),
     new CellFace(point.X, point.Y, point.Z, 4),
     new CellFace(point.X, point.Y, point.Z, 5)
 })
 {
 }
        public CounterElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace)
            : base(subsystemElectricity, cellFace)
        {
            float?num = subsystemElectricity.ReadPersistentVoltage(cellFace.Point);

            if (num.HasValue)
            {
                m_counter  = (int)MathUtils.Round(MathUtils.Abs(num.Value) * 15f);
                m_overflow = (num.Value < 0f);
            }
        }
Exemplo n.º 16
0
        public MemoryBankElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace)
            : base(subsystemElectricity, cellFace)
        {
            m_subsystemMemoryBankBlockBehavior = subsystemElectricity.Project.FindSubsystem <SubsystemMemoryBankBlockBehavior>(throwOnError: true);
            MemoryBankData blockData = m_subsystemMemoryBankBlockBehavior.GetBlockData(cellFace.Point);

            if (blockData != null)
            {
                m_voltage = (float)(int)blockData.LastOutput / 15f;
            }
        }
        public MotionDetectorElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace)
            : base(subsystemElectricity, cellFace)
        {
            m_subsystemBodies = subsystemElectricity.Project.FindSubsystem <SubsystemBodies>(throwOnError: true);
            m_center          = new Vector3(cellFace.X, cellFace.Y, cellFace.Z) + new Vector3(0.5f) - 0.25f * m_direction;
            m_direction       = CellFace.FaceToVector3(cellFace.Face);
            Vector3 vector  = Vector3.One - new Vector3(MathUtils.Abs(m_direction.X), MathUtils.Abs(m_direction.Y), MathUtils.Abs(m_direction.Z));
            Vector3 vector2 = m_center - 8f * vector;
            Vector3 vector3 = m_center + 8f * (vector + m_direction);

            m_corner1 = new Vector2(vector2.X, vector2.Z);
            m_corner2 = new Vector2(vector3.X, vector3.Z);
        }
Exemplo n.º 18
0
 public DispenserElectricElement(SubsystemElectricity subsystemElectricity, Point3 point)
     : base(subsystemElectricity, new List <CellFace>
 {
     new CellFace(point.X, point.Y, point.Z, 0),
     new CellFace(point.X, point.Y, point.Z, 1),
     new CellFace(point.X, point.Y, point.Z, 2),
     new CellFace(point.X, point.Y, point.Z, 3),
     new CellFace(point.X, point.Y, point.Z, 4),
     new CellFace(point.X, point.Y, point.Z, 5)
 })
 {
     m_subsystemBlockEntities = base.SubsystemElectricity.Project.FindSubsystem <SubsystemBlockEntities>(throwOnError: true);
 }
        public RandomGeneratorElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace)
            : base(subsystemElectricity, cellFace)
        {
            float?num = base.SubsystemElectricity.ReadPersistentVoltage(base.CellFaces[0].Point);

            if (num.HasValue)
            {
                m_voltage = num.Value;
            }
            else
            {
                m_voltage = GetRandomVoltage();
            }
        }
Exemplo n.º 20
0
        public ElectricConnectorType?GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
        {
            int hingeFace = GetHingeFace(Terrain.ExtractData(value));

            if (face == hingeFace)
            {
                ElectricConnectorDirection?connectorDirection = SubsystemElectricity.GetConnectorDirection(hingeFace, 0, connectorFace);
                if (connectorDirection == ElectricConnectorDirection.Right || connectorDirection == ElectricConnectorDirection.Left || connectorDirection == ElectricConnectorDirection.In)
                {
                    return(ElectricConnectorType.Input);
                }
            }
            return(null);
        }
Exemplo n.º 21
0
        public ElectricConnectorType?GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
        {
            int data = Terrain.ExtractData(value);

            if (face == GetMountingFace(data))
            {
                int rotation = GetRotation(data);
                if (SubsystemElectricity.GetConnectorDirection(4, (4 - rotation) % 4, connectorFace) == ElectricConnectorDirection.Top)
                {
                    return(ElectricConnectorType.Input);
                }
            }
            return(null);
        }
Exemplo n.º 22
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);
        }
Exemplo n.º 23
0
 public ElectricConnectorType?GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
 {
     if (GetHanging(Terrain.ExtractData(value)))
     {
         if (face != 5 || !SubsystemElectricity.GetConnectorDirection(face, 0, connectorFace).HasValue)
         {
             return(null);
         }
         return(ElectricConnectorType.Input);
     }
     if (face != 4 || !SubsystemElectricity.GetConnectorDirection(face, 0, connectorFace).HasValue)
     {
         return(null);
     }
     return(ElectricConnectorType.Input);
 }
        public override float GetOutputVoltage(int face)
        {
            ElectricConnectorDirection?connectorDirection = SubsystemElectricity.GetConnectorDirection(base.CellFaces[0].Face, base.Rotation, face);

            if (connectorDirection.HasValue)
            {
                if (connectorDirection.Value == ElectricConnectorDirection.Top)
                {
                    return((float)m_counter / 15f);
                }
                if (connectorDirection.Value == ElectricConnectorDirection.Bottom)
                {
                    return(m_overflow ? 1 : 0);
                }
            }
            return(0f);
        }
Exemplo n.º 25
0
        public override ElectricConnectorType?GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z)
        {
            int data = Terrain.ExtractData(value);

            if (GetFace(value) == face)
            {
                ElectricConnectorDirection?connectorDirection = SubsystemElectricity.GetConnectorDirection(GetFace(value), RotateableMountedElectricElementBlock.GetRotation(data), connectorFace);
                if (connectorDirection == ElectricConnectorDirection.Bottom)
                {
                    return(ElectricConnectorType.Input);
                }
                if (connectorDirection == ElectricConnectorDirection.Top || connectorDirection == ElectricConnectorDirection.In)
                {
                    return(ElectricConnectorType.Output);
                }
            }
            return(null);
        }
        public override bool Simulate()
        {
            int bits     = m_bits;
            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 && connectorDirection.Value == ElectricConnectorDirection.In)
                    {
                        float outputVoltage = connection.NeighborElectricElement.GetOutputVoltage(connection.NeighborConnectorFace);
                        m_bits = (int)MathUtils.Round(outputVoltage * 15f);
                    }
                }
            }
            return(m_bits != bits);
        }
Exemplo n.º 27
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);
        }
Exemplo n.º 28
0
        public ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z)
        {
            int             designIndex = GetDesignIndex(Terrain.ExtractData(value));
            FurnitureDesign design      = subsystemElectricity.SubsystemTerrain.SubsystemFurnitureBlockBehavior.GetDesign(designIndex);

            if (design != null)
            {
                if (design.InteractionMode == FurnitureInteractionMode.Multistate || design.InteractionMode == FurnitureInteractionMode.ConnectedMultistate)
                {
                    return(new MultistateFurnitureElectricElement(subsystemElectricity, new Point3(x, y, z)));
                }
                if (design.InteractionMode == FurnitureInteractionMode.ElectricButton)
                {
                    return(new ButtonFurnitureElectricElement(subsystemElectricity, new Point3(x, y, z)));
                }
                if (design.InteractionMode == FurnitureInteractionMode.ElectricSwitch)
                {
                    return(new SwitchFurnitureElectricElement(subsystemElectricity, new Point3(x, y, z), value));
                }
            }
            return(null);
        }
        public static IEnumerable <CellFace> GetMountingCellFaces(SubsystemElectricity subsystemElectricity, Point3 point)
        {
            int             data        = Terrain.ExtractData(subsystemElectricity.SubsystemTerrain.Terrain.GetCellValue(point.X, point.Y, point.Z));
            int             rotation    = FurnitureBlock.GetRotation(data);
            int             designIndex = FurnitureBlock.GetDesignIndex(data);
            FurnitureDesign design      = subsystemElectricity.SubsystemTerrain.SubsystemFurnitureBlockBehavior.GetDesign(designIndex);

            if (design == null)
            {
                yield break;
            }
            int face = 0;

            while (face < 6)
            {
                int num = (face < 4) ? ((face - rotation + 4) % 4) : face;
                if ((design.MountingFacesMask & (1 << num)) != 0)
                {
                    yield return(new CellFace(point.X, point.Y, point.Z, CellFace.OppositeFace(face)));
                }
                int num2 = face + 1;
                face = num2;
            }
        }
Exemplo n.º 30
0
 public ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z)
 {
     return(new GunpowderKegElectricElement(subsystemElectricity, new CellFace(x, y, z, 4)));
 }