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)
            });
        }
예제 #2
0
        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);
        }
예제 #4
0
        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];
     }
 }
예제 #6
0
        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);
                }
            }
        }
예제 #8
0
        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));
        }
예제 #11
0
        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));
            }
        }
예제 #12
0
        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));
        }