private void SetupTrolls()
        {
            Remove(coroutine);
            coroutine = null;
            Remove(dashListener);
            dashListener = null;
            Level level    = Scene as Level;
            int   modifier = ((!trollFixed ? TrollLandModule.Session.DeathCountForLevel(level.Session.Level) : 0) + trollOffset) % 3;

            trollBehavior = (TrollBehaviors)modifier;
            switch (trollBehavior)
            {
            default:
            case TrollBehaviors.ZipMover:
                Add(coroutine = new Coroutine(ZipMoverSequence()));
                break;

            case TrollBehaviors.FallBlock:
                Add(coroutine = new Coroutine(FallBlockSequence()));
                break;

            case TrollBehaviors.SwapBlock:
                Add(dashListener = new DashListener()
                {
                    OnDash = OnDash
                });
                break;
            }
        }
Ejemplo n.º 2
0
        public TimeEnt(Vector2 pos) : base(pos)
        {
            base.Depth    = -8500;
            base.Collider = new Circle(10f, 0f, 2f);
            base.Add(new PlayerCollider(new Action <Player>(this.OnPlayer), null, null));
            base.Add(this.sprite       = GFX.SpriteBank.Create("booster"));
            base.Add(this.dashListener = new DashListener());

            this.dashListener.OnDash = new Action <Vector2>(this.OnPlayerDashed);
        }
        public GenericCustomBooster(EntityData data, Vector2 offset) : base(data.Position + offset)
        {
            Depth    = -8500;
            Collider = new Circle(10f, 0f, 2f);
            sprite   = new Sprite(GFX.Game, data.Attr("directory", "objects/FrostHelper/blueBooster/"))
            {
                Visible = true
            };
            sprite.CenterOrigin();
            sprite.Justify = new Vector2(0.5f, 0.5f);
            sprite.AddLoop("loop", "booster", 0.1f, 0, 1, 2, 3, 4);
            sprite.AddLoop("inside", "booster", 0.1f, 5, 6, 7, 8);
            sprite.AddLoop("spin", "booster", 0.06f, 18, 19, 20, 21, 22, 23, 24, 25);
            sprite.Add("pop", "booster", 0.08f, 9, 10, 11, 12, 13, 14, 15, 16, 17);
            sprite.Play("loop", false);
            Add(sprite);

            Add(new PlayerCollider(new Action <Player>(OnPlayer), null, null));
            Add(light   = new VertexLight(Color.White, 1f, 16, 32));
            Add(bloom   = new BloomPoint(0.1f, 16f));
            Add(wiggler = Wiggler.Create(0.5f, 4f, delegate(float f)
            {
                sprite.Scale = Vector2.One * (1f + f * 0.25f);
            }, false, false));
            Add(dashRoutine = new Coroutine(false));

            Add(dashListener    = new DashListener());
            dashListener.OnDash = new Action <Vector2>(OnPlayerDashed);

            Add(new MirrorReflection());
            Add(loopingSfx = new SoundSource());

            Red          = data.Bool("red", false);
            particleType = Red ? Booster.P_BurstRed : Booster.P_Burst;

            RespawnTime   = data.Float("respawnTime", 1f);
            BoostTime     = data.Float("boostTime", 0.3f);
            ParticleColor = ColorHelper.GetColor(data.Attr("particleColor", "Yellow"));
            reappearSfx   = data.Attr("reappearSfx", "event:/game/04_cliffside/greenbooster_reappear");
            enterSfx      = data.Attr("enterSfx", "event:/game/04_cliffside/greenbooster_enter");
            boostSfx      = data.Attr("boostSfx", "event:/game/04_cliffside/greenbooster_dash");
            endSfx        = data.Attr("releaseSfx", "event:/game/04_cliffside/greenbooster_end");
        }
Ejemplo n.º 4
0
        public MoveSwapBlock(EntityData data, Vector2 offset)
            : base(data.Position + offset, data.Width, data.Height, data.Nodes[0] + offset, Themes.Normal)
        {
            swapBlockData = new DynData <SwapBlock>(this);
            Theme         = Themes.Moon; // base() gets Normal for the block texture, then we set to Moon to remove the path background

            doesReturn   = data.Bool("returns", true);
            freezeOnSwap = data.Bool("freezeOnSwap", true);

            // Replaces SwapBlock.OnDash with MoveSwapBlock.OnDash if this block doesn't return
            DashListener     listener    = Get <DashListener>();
            Action <Vector2> orig_OnDash = listener.OnDash;

            listener.OnDash = (dir) => {
                if (State == MovementState.Breaking)
                {
                    return;
                }
                else if (doesReturn)
                {
                    orig_OnDash(dir);
                }
                else
                {
                    OnDash(dir);
                }
            };

            // We use some local variable to temporarily store private SwapBlock fields for less reflection
            start      = Position;
            end        = data.Nodes[0] + offset;
            difference = end - start;

            // Structs are value types
            startingRect = swapBlockData.Get <Rectangle>("moveRect");

            swapBlockData["maxForwardSpeed"] = maxForwardSpeed = 360f * data.Float("swapSpeedMultiplier", 1f) / Vector2.Distance(start, end);
            startPosition = Position;

            // Replace/Add SwapBlock textures
            middleCardinal  = GFX.Game["objects/CommunalHelper/moveSwapBlock/midBlockCardinal"];
            middleDiagonal  = GFX.Game["objects/CommunalHelper/moveSwapBlock/midBlockDiagonal"];
            Add(middleArrow = new Image(middleCardinal));
            middleArrow.CenterOrigin();

            Remove(swapBlockData.Get <Sprite>("middleGreen"), swapBlockData.Get <Sprite>("middleRed"));
            swapBlockData["middleGreen"] = middleGreen = CommunalHelperModule.SpriteBank.Create("swapBlockLight");
            swapBlockData["middleRed"]   = middleRed = CommunalHelperModule.SpriteBank.Create("swapBlockLightRed");
            Add(middleGreen, middleRed);

            Add(middleOrange = new Image(GFX.Game["objects/CommunalHelper/moveSwapBlock/midBlockOrange"]));
            middleOrange.CenterOrigin();

            canSteer         = data.Bool("canSteer", false);
            maxMoveSpeed     = data.Float("moveSpeed", 60f);
            moveAcceleration = data.Float("moveAcceleration", Accel);
            MoveDirection    = data.Enum("direction", Directions.Left);
            homeAngle        = targetAngle = angle = MoveDirection.Angle();
            angleSteerSign   = angle > 0f ? -1 : 1;

            int      tilesX               = (int)Width / 8;
            int      tilesY               = (int)Height / 8;
            MTexture buttonTexture        = GFX.Game["objects/moveBlock/button"];
            MTexture buttonPressedTexture = GFX.Game["objects/CommunalHelper/moveSwapBlock/buttonPressed"];

            if (canSteer && (MoveDirection == Directions.Left || MoveDirection == Directions.Right))
            {
                for (int x = 0; x < tilesX; x++)
                {
                    int offsetX = (x != 0) ? ((x < tilesX - 1) ? 1 : 2) : 0;
                    AddImage(buttonTexture.GetSubtexture(offsetX * 8, 0, 8, 8), new Vector2(x * 8, -4f), 0f, new Vector2(1f, 1f), topButton);
                    AddImage(buttonPressedTexture.GetSubtexture(offsetX * 8, 0, 8, 8), new Vector2(x * 8, -4f), 0f, new Vector2(1f, 1f), topButton);
                }
            }
            else if (canSteer && (MoveDirection == Directions.Up || MoveDirection == Directions.Down))
            {
                for (int y = 0; y < tilesY; y++)
                {
                    int offsetY = (y != 0) ? ((y < tilesY - 1) ? 1 : 2) : 0;
                    AddImage(buttonTexture.GetSubtexture(offsetY * 8, 0, 8, 8), new Vector2(-4f, y * 8), (float)Math.PI / 2f, new Vector2(1f, -1f), leftButton);
                    AddImage(buttonPressedTexture.GetSubtexture(offsetY * 8, 0, 8, 8), new Vector2(-4f, y * 8), (float)Math.PI / 2f, new Vector2(1f, -1f), leftButton);
                    AddImage(buttonTexture.GetSubtexture(offsetY * 8, 0, 8, 8), new Vector2((tilesX - 1) * 8 + 4, y * 8), (float)Math.PI / 2f, new Vector2(1f, 1f), rightButton);
                    AddImage(buttonPressedTexture.GetSubtexture(offsetY * 8, 0, 8, 8), new Vector2((tilesX - 1) * 8 + 4, y * 8), (float)Math.PI / 2f, new Vector2(1f, 1f), rightButton);
                }
            }
            UpdateColors();

            debrisTextures = new Chooser <MTexture>();
            foreach (MTexture debris in GFX.Game.GetAtlasSubtextures("objects/CommunalHelper/moveSwapBlock/debris"))
            {
                debrisTextures.Add(debris, 1);
            }
            debrisTextures.Add(GFX.Game["objects/CommunalHelper/moveSwapBlock/debrisRed00"], 0.3f);
            debrisTextures.Add(GFX.Game["objects/CommunalHelper/moveSwapBlock/debrisGreen00"], 0.05f);

            Add(moveBlockSfx = new SoundSource());
            Add(new Coroutine(Controller()));

            Add(new MoveBlockRedirectable(new DynamicData(this))
            {
                Get_Speed       = () => moveSpeed,
                Get_TargetSpeed = () => targetMoveSpeed,
                Get_MoveSfx     = () => moveBlockSfx,
                Get_Direction   = () => MoveDirection,
                Set_Direction   = dir => MoveDirection = dir,
            });
        }