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); }
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); }
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); }
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); }
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; }
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); } }
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); }
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); } }
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); }
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(); } }
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); }
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); }
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); }
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); }
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); }
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 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; } }
public ElectricElement CreateElectricElement(SubsystemElectricity subsystemElectricity, int value, int x, int y, int z) { return(new GunpowderKegElectricElement(subsystemElectricity, new CellFace(x, y, z, 4))); }