public Conveyor(Vector2 position, float width, bool startLeft, string activationId) : base(position, width, 16, false) { Add(Activator = new FactoryActivator()); Activator.StartOn = startLeft; Activator.ActivationId = activationId; Activator.OnTurnOff = () => { Add(new Coroutine(Sparks())); ReverseConveyorDirection(); }; Activator.OnStartOff = () => { StartAnimation(); ReverseConveyorDirection(); }; Activator.OnTurnOn = () => { Add(new Coroutine(Sparks())); ReverseConveyorDirection(); }; Activator.OnStartOn = StartAnimation; Add(new SteamCollider(OnSteamWall)); SetupSprites(); Add(new LightOcclude(0.2f)); Add(_sfx = new SoundSource() { Position = new Vector2(Width / 2, Height / 2) }); }
public BoomBox(Vector2 position, string activationId, float initialDelay, bool startActive) : base(position, 24, 24, false) { Add(Activator = new FactoryActivator()); Activator.StartOn = startActive; Activator.ActivationId = activationId == string.Empty ? null : activationId; Activator.OnStartOn = OnStartOn; Activator.OnStartOff = OnStartOff; Activator.OnTurnOn = OnTurnOn; Activator.OnTurnOff = OnTurnOff; Add(new SteamCollider(OnSteamWall)); _initialDelay = initialDelay; Add(_sprite = new Sprite(GFX.Game, "objects/FactoryHelper/boomBox/")); _sprite.Add("idle", "idle", 0.2f, "idle"); _sprite.Add("activating", "activating", 0.2f, "activating"); _sprite.Add("active", "active", 0.15f, "active"); _sprite.Add("angry", "angry", 0.05f, "angry"); _sprite.Add("resetting", "resetting", 0.15f, "active"); Add(_boomSprite = new Sprite(GFX.Game, "objects/FactoryHelper/boomBox/")); _boomSprite.Add("boom", "boom", 0.04f); _boomSprite.Color = Color.White * 0.5f; _boomSprite.Visible = false; _boomSprite.CenterOrigin(); _boomSprite.Position = new Vector2(Width / 2, Height / 2); _boomCollider = new BoomCollider(position + new Vector2(Width / 2, Height / 2)); Add(_sfx = new SoundSource()); _sfx.Position = new Vector2(Width / 2, Height / 2); Add(new LightOcclude(0.2f)); }
public RustyLamp(Vector2 position, Vector2 offset, string activationId, float initialDelay, string strobePattern, bool startActive) : base() { Depth = 8500; Position = position + offset; Collider = new Hitbox(12, 12, 2, 2); Add(Activator = new FactoryActivator()); Activator.ActivationId = activationId == string.Empty ? null : activationId; Activator.StartOn = startActive; Activator.OnTurnOff = OnTurnOff; Activator.OnTurnOn = OnTurnOn; Activator.OnStartOff = OnStartOff; Activator.OnStartOn = OnStartOn; Add(_steamCollider = new SteamCollider(OnSteamWall)); _initialDelay = initialDelay; Add(_sprite = new Sprite(GFX.Game, "objects/FactoryHelper/rustyLamp/rustyLamp")); _sprite.Add("frames", ""); _sprite.Play("frames"); _sprite.Active = false; _strobePatternString = strobePattern; Add(_light = new VertexLight(Color, 0f, 128, 128)); Add(_bloom = new BloomPoint(0.0f, 16f)); _light.Position = new Vector2(8, 8); _bloom.Position = new Vector2(8, 8); }
public PowerLine(Vector2 position, Vector2 offset, Vector2[] nodes, string activationId, string colorCode, bool startActive) { Position = offset; Add(Activator = new FactoryActivator()); Activator.ActivationId = activationId == string.Empty ? null : activationId; Activator.StartOn = startActive; Activator.OnStartOn = PowerUp; Activator.OnTurnOn = PowerUp; Activator.OnStartOff = PowerDown; Activator.OnTurnOff = PowerDown; _defaultColor = Calc.HexToColor(colorCode); _cornerPoints = new Node[nodes.Length + 1]; _cornerPoints[0] = new Node(position); for (int i = 1; i < _cornerPoints.Length; i++) { _cornerPoints[i] = new Node(nodes[i - 1]); _cornerPoints[i - 1].Next = _cornerPoints[i]; _cornerPoints[i].Previous = _cornerPoints[i - 1]; } NormalizeCornerPoints(); foreach (Node node in _cornerPoints) { node.CheckNeighbors(); } Depth = 8999; }
public PremanentActivationTrigger(EntityData data, Vector2 offset) : base(data, offset) { string [] _activationIds = data.Attr("activationIds").Split(','); _activators = new FactoryActivator[_activationIds.Length]; for (int i = 0; i < _activationIds.Length; i++) { Add(_activators[i] = new FactoryActivator()); _activators[i].ActivationId = _activationIds[i]; } }
public ThrowBoxSpawner(Vector2 position, float delay, int maximum, string activationId, bool isMetal, bool isRandom, bool fromTop, bool tutorial, bool startActive) : base(position) { Add(Activator = new FactoryActivator()); Activator.ActivationId = activationId == string.Empty ? null : activationId; Activator.StartOn = startActive; Collider = new Hitbox(16, 16); _maximum = maximum; _delay = delay; _isMetal = isMetal; _isRandom = isRandom; _fromTop = fromTop; _tutorial = tutorial; Add(new Coroutine(SpawnSequence())); Add(new SteamCollider(OnSteamWall)); }
public FactoryActivationTrigger(EntityData data, Vector2 offset) : base(data, offset) { string[] activationIds = data.Attr("activationIds", "").Split(','); _persistent = data.Bool("persistent", false); _resetOnLeave = _persistent ? false : data.Bool("resetOnLeave", false); Add(Activator = new FactoryActivator()); Activator.ActivationId = data.Attr("ownActivationId") == string.Empty ? null : data.Attr("ownActivationId"); Activator.StartOn = Activator.ActivationId == null; foreach (string activationId in activationIds) { if (activationId != "") { _activationIds.Add(activationId); } } }
public DashNegator(Vector2 position, int width, int height, string activationId, bool startActive) : base(position) { Add(Activator = new FactoryActivator()); Activator.ActivationId = activationId == string.Empty ? null : activationId; Activator.StartOn = startActive; Activator.OnStartOff = OnStartOff; Activator.OnStartOn = OnStartOn; Activator.OnTurnOff = OnTurnOff; Activator.OnTurnOn = OnTurnOn; Add(new SteamCollider(OnSteamWall)); Collider = new Hitbox(width - 4, height, 2, 0); width = 16 * (width / 16); Depth = -8999; Add(new StaticMover { OnShake = OnShake, SolidChecker = IsRiding, OnDestroy = RemoveSelf }); Add(_pc = new PlayerCollider(OnPlayer)); int length = width / 16; _turretSprites = new Sprite[length]; _turretSolids = new Solid[length]; for (int i = 0; i < length; i++) { Add(_turretSprites[i] = new Sprite(GFX.Game, "danger/FactoryHelper/dashNegator/")); _turretSprites[i].Add("inactive", "turret", 1f, 0); _turretSprites[i].Add("rest", "turret", 0.2f, "active", 0); _turretSprites[i].Add("active", "turret", 0.05f, "rest"); _turretSprites[i].Position = new Vector2(-2 + 16 * i, -2); _turretSolids[i] = new Solid(position + new Vector2(16 * i, 0), 16, 4, false); } _particleSpanPeriod = 256f / (width * height); }
public ElectrifiedWall(Vector2 position, int size, Directions direction, string activationId, bool startActive) : base(position, size, direction) { Depth = 10; _baseParticleEmittionPeriod = size / 8 * 0.2f; SetParticleEmittionPeriod(); Add(Activator = new FactoryActivator()); Activator.ActivationId = activationId == string.Empty ? null : activationId; Activator.StartOn = startActive; Activator.OnTurnOff = Activator.OnTurnOn = SwapState; Activator.OnStartOff = () => { if (_ledgeBlocker != null) { _ledgeBlocker.Blocking = false; } }; Add(new SteamCollider(OnSteamWall)); _start = Vector2.Zero; Vector2 offset; switch (direction) { default: case Directions.Up: case Directions.Down: offset = Vector2.UnitX * size; break; case Directions.Left: case Directions.Right: offset = Vector2.UnitY * size; break; } _end = offset; _electricityColorsLerped = new Color[_electricityColors.Length]; Add(pc = new PlayerCollider(OnCollide)); switch (direction) { case Directions.Up: base.Collider = new Hitbox(size, 6f, 0f, -3f); Add(_ledgeBlocker = new LedgeBlocker()); break; case Directions.Down: base.Collider = new Hitbox(size, 6f, 0f, -3f); break; case Directions.Left: case Directions.Right: base.Collider = new Hitbox(6f, size, -3f); Add(_ledgeBlocker = new LedgeBlocker()); break; } }
public Piston(Vector2 position, Vector2 start, Vector2 end, Directions direction, string activationId, float moveTime, float pauseTime, float initialDelay, bool startActive, bool heated) { Heated = heated; MoveTime = moveTime; PauseTime = pauseTime; InitialDelay = initialDelay; Collider = new Hitbox(0, 0); Add(Activator = new FactoryActivator()); Activator.StartOn = startActive; Activator.ActivationId = activationId == string.Empty ? null : activationId; Activator.OnStartOn = OnStartOn; Activator.OnStartOff = OnStartOff; _direction = direction; double length = 0; _basePos = position; if (_direction == Directions.Up || _direction == Directions.Down) { _startPos.X = _basePos.X; _endPos.X = _basePos.X; if (_direction == Directions.Up) { _startPos.Y = Math.Min(start.Y, _basePos.Y + _headMinimumPositionModifier); _endPos.Y = Math.Min(end.Y, _basePos.Y + _headMinimumPositionModifier); } else { _startPos.Y = Math.Max(start.Y, _basePos.Y + _headMinimumPositionModifier); _endPos.Y = Math.Max(end.Y, _basePos.Y + _headMinimumPositionModifier); } length = Math.Max(Math.Abs(_basePos.Y - _endPos.Y), Math.Abs(_basePos.Y - _startPos.Y)); _base = new PistonPart(_basePos + new Vector2(2, 0), 12, 8, $"objects/FactoryHelper/piston/base00"); _head = new PistonPart(_startPos, 16, 8, $"objects/FactoryHelper/piston/head00"); _body = new Solid(new Vector2(_basePos.X + 3, Math.Min(_startPos.Y, _basePos.Y) + 8), 10, 0, false); } else if (_direction == Directions.Left || _direction == Directions.Right) { _startPos.Y = _basePos.Y; _endPos.Y = _basePos.Y; if (_direction == Directions.Left) { _startPos.X = Math.Min(start.X, _basePos.X + _headMinimumPositionModifier); _endPos.X = Math.Min(end.X, _basePos.X + _headMinimumPositionModifier); } else { _startPos.X = Math.Max(start.X, _basePos.X + _headMinimumPositionModifier); _endPos.X = Math.Max(end.X, _basePos.X + _headMinimumPositionModifier); } length = Math.Max(Math.Abs(_basePos.X - _endPos.X), Math.Abs(_basePos.X - _startPos.X)); _base = new PistonPart(_basePos + new Vector2(0, 2), 8, 12, $"objects/FactoryHelper/piston/base00"); _head = new PistonPart(_startPos, 8, 16, $"objects/FactoryHelper/piston/head00"); _body = new Solid(new Vector2(Math.Min(_startPos.X, _basePos.X) + 8, _basePos.Y + 3), Math.Abs(_base.X - _head.X) - 8, 10, false); } _base.Image.Rotation += _rotationModifier; _head.Image.Rotation += _rotationModifier; _bodyPartCount = (int)Math.Ceiling(length / 8); _bodyImages = new Image[_bodyPartCount]; for (int i = 0; i < _bodyPartCount; i++) { Vector2 bodyPosition; if (_direction == Directions.Up || _direction == Directions.Down) { bodyPosition = new Vector2(-3, i * (_basePos.Y - (_head.Y + _headPositionModifier)) / (_bodyPartCount) + _bodyPositionModifier); } else { bodyPosition = new Vector2(i * (_basePos.X - (_head.X + _headPositionModifier)) / (_bodyPartCount) + _bodyPositionModifier, -3); } string bodyImage = $"objects/FactoryHelper/piston/body{(Heated ? "_h" : "")}0{_rnd.Next(_bodyVariantCount)}"; _body.Add(_bodyImages[i] = new Image(GFX.Game[bodyImage]) { Position = bodyPosition }); _bodyImages[i].CenterOrigin(); _bodyImages[i].Rotation += _rotationModifier; _bodyImages[i].Position = _direction == Directions.Down || _direction == Directions.Up ? new Vector2(8, 4) : new Vector2(4, 8); } _base.Depth = -8010; _head.Depth = -8010; _body.Depth = -8000; _body.AllowStaticMovers = false; _head.DisableLightsInside = false; _body.DisableLightsInside = false; _base.DisableLightsInside = false; _base.Add(_sfx = new SoundSource()); _base.Add(new LightOcclude(0.2f)); _head.Add(new LightOcclude(0.2f)); _body.Add(new LightOcclude(0.2f)); _body.Add(new SteamCollider(OnSteamWall)); }
public WindTunnel(Vector2 position, int width, int height, float strength, string direction, string activationId, bool startActive) { Depth = -1000; Position = position; _loopWidth = width; _loopHeight = height; Add(Activator = new FactoryActivator()); Activator.ActivationId = activationId == string.Empty ? null : activationId; Activator.StartOn = startActive; Activator.OnTurnOn = () => { _speedingUp = true; }; Activator.OnTurnOff = () => { _speedingUp = false; }; Activator.OnStartOff = () => { _percent = 0f; _speedingUp = false; }; Activator.OnStartOn = () => { _percent = 1f; _speedingUp = true; }; Add(new SteamCollider(OnSteamWall)); Collider = new Hitbox(width, height); _strength = strength; Enum.TryParse(direction, out _direction); switch (_direction) { case Direction.Up: _defaultWindSpeed = -Vector2.UnitY * _strength; break; case Direction.Down: _defaultWindSpeed = Vector2.UnitY * _strength; break; case Direction.Left: _defaultWindSpeed = -Vector2.UnitX * _strength; break; case Direction.Right: _defaultWindSpeed = Vector2.UnitX * _strength; break; } int particlecount = width * height / 300; _particles = new Particle[particlecount]; for (int i = 0; i < _particles.Length; i++) { Reset(i, Calc.Random.NextFloat(_baseAlpha)); } }
public Fan(Vector2 position, float width, float height, Directions direction, string activationId, bool startActive) : base(position, width, height, false) { Add(Activator = new FactoryActivator()); Activator.ActivationId = activationId != string.Empty ? activationId : null; Activator.StartOn = startActive; Activator.OnTurnOn = () => { _speedingUp = true; }; Activator.OnTurnOff = () => { _speedingUp = false; }; Activator.OnStartOff = () => { _percent = 0f; _speedingUp = false; }; Activator.OnStartOn = () => { _percent = 1f; _speedingUp = true; }; Add(new SteamCollider(OnSteamWall)); Add(_fanSprite = FactoryHelperModule.SpriteBank.Create("fan")); _fanSprite.CenterOrigin(); _fanSprite.Position = new Vector2(width / 2, height / 2); switch (direction) { default: case Directions.Horizontal: _fanSprite.Scale.X = width / 24f; break; case Directions.Vertical: _fanSprite.Scale.X = height / 24f; _fanSprite.Rotation = (float)Math.PI / 2; break; } _fanSprite.Play("rotating", true); MTexture mTexture = GFX.Game["objects/FactoryHelper/fan/body0"]; int size = (int)Math.Max(width, height); for (int i = 0; i < size; i += 8) { int x; Image image; if (i == 0) { x = 0; } else if (i == size - 8) { x = 2; } else { x = 1; } Add(image = new Image(mTexture.GetSubtexture(x * 8, 0, 8, 16))); switch (direction) { default: case Directions.Horizontal: image.X = i; break; case Directions.Vertical: image.Rotation = (float)Math.PI / 2; image.Y = i; image.X += 16; break; } } SurfaceSoundIndex = 7; Add(new LightOcclude(0.5f)); }