Exemple #1
0
        public SeekerBoss(Vector2 position) : base(position)
        {
            Depth        = -200;
            Collider     = physicsHitbox = new Hitbox(6f, 6f, -3f, -3f);
            attackHitbox = new Hitbox(12f, 8f, -6f, -2f);
            bounceHitbox = new Hitbox(16f, 6f, -8f, -8f);
            pushRadius   = new Circle(40f);
            Add(new PlayerCollider(OnAttackPlayer, attackHitbox));
            Add(new PlayerCollider(OnBouncePlayer, bounceHitbox));
            Add(shaker = new Shaker(false));
            Add(state  = new StateMachine());
            state.SetCallbacks(StateIdle, IdleUpdate);
            state.SetCallbacks(StateRegenerate, RegenerateUpdate, RegenerateCoroutine, RegenerateBegin, RegenerateEnd);
            Add(idleSineX = new SineWave(0.5f, 0.0f));
            Add(idleSineY = new SineWave(0.7f, 0.0f));
            Add(light     = new VertexLight(Color.White, 1f, 32, 64));
            Add(new MirrorReflection());
            IgnoreJumpThrus    = true;
            Add(sprite         = GFX.SpriteBank.Create("seeker"));
            sprite.OnLastFrame = f => {
                if (!flipAnimations.Contains(f) || spriteFacing == facing)
                {
                    return;
                }

                spriteFacing = facing;
                if (nextSprite != null)
                {
                    sprite.Play(nextSprite);
                    nextSprite = null;
                }
            };
            sprite.OnChange = (last, next) => {
                nextSprite = null;
                sprite.OnLastFrame(last);
            };
            scaleWiggler = Wiggler.Create(0.8f, 2f);
            Add(scaleWiggler);
            Add(boopedSfx = new SoundSource());
            Add(reviveSfx = new SoundSource());
            //原码到此
            spinnerPosition1  = position + new Vector2(0, 16);
            spinnerPosition2  = position + new Vector2(0, -16);
            spinnerPosition3  = position + new Vector2(16, 8);
            spinnerPosition4  = position + new Vector2(16, -8);
            spinnerPosition5  = position + new Vector2(-16, 8);
            spinnerPosition6  = position + new Vector2(-16, -8);
            switchPosition1   = position + new Vector2(-128, -64);
            switchPosition2   = position + new Vector2(-88, 64);
            switchPosition3   = position + new Vector2(128, -64);
            switchPosition4   = position + new Vector2(88, 64);
            gliderPosition    = position + new Vector2(40, -32);
            Add(chargeSfx     = new SoundSource());
            Add(laserSfx      = new SoundSource());
            pattern           = 0;
            gliderRespawnTime = 1.0f;
            switchAppearTime  = 0.0f;
            attackCoroutine   = new Coroutine(false);
            Add(attackCoroutine);
            attackCoroutine.Replace(Attack0Sequence());
        }
        // When a new Strawberry is "added" to a scene, we need it to initialize certain features, most of them visual in nature.
        public override void Added(Scene scene)
        {
            base.Added(scene);

            sprite = spriteBank.Create("springCollabGlassBerry");
            Add(sprite);

            if (!isOwned)
            {
                sprite.Play("idle");
            }
            else
            {
                sprite.Play("idleGhost");
            }

            // Strawberries have certain special effects during their animation sequence.
            // This adds a handler to enable this.
            sprite.OnFrameChange = OnAnimate;

            // A Wiggler is capable of "shaking" and "pulsing" sprites.
            // This Wiggler adjusts the sprite's Scale when triggered.
            wiggler = Wiggler.Create
                      (
                0.4f,
                4f,
                delegate(float v) {
                sprite.Scale = Vector2.One * (1f + v * 0.35f);
            },
                false,
                false
                      );
            Add(wiggler);

            // Bloom makes bright things brighter!
            // The default BloomPoint for a vanilla Strawberry is
            // alpha = (this.Golden || this.Moon || this.isGhostBerry) ? 0.5f : 1f
            // radius = 12f
            bloom = new BloomPoint(isOwned ? 0.25f : 0.5f, 12f);
            Add(bloom);

            // Strawberries give off light. This is the vanilla VertexLight.
            light      = new VertexLight(Color.White, 1f, 16, 24);
            lightTween = light.CreatePulseTween();
            Add(light);
            Add(lightTween);

            // While we're here, a seeded Strawberry must be allowed to initialize its Seeds.
            if (Seeds != null && Seeds.Count > 0 && !SceneAs <Level>().Session.GetFlag(gotSeedFlag))
            {
                foreach (GenericStrawberrySeed seed in Seeds)
                {
                    scene.Add(seed);
                }

                // If we added the seeds, we don't want to see or touch the strawberry, do we?
                Visible       = false;
                Collidable    = false;
                bloom.Visible = light.Visible = false;
            }

            // Let's be polite and turn down the bloom a little bit if the base level has bloom.
            if (SceneAs <Level>().Session.BloomBaseAdd > 0.1f)
            {
                bloom.Alpha *= 0.5f;
            }

            // The Glass Berry's gimmick is that it breaks if the player dashes while carrying it.
            // So we need a generic DashListener.
            Add(new DashListener {
                OnDash = OnDash
            });
        }
Exemple #3
0
        public override void Awake(Scene scene)
        {
            base.Awake(scene);

            AreaKey area = (scene as Level).Session.Area;

            string spritePath             = "CollabUtils2/miniheart/" + spriteName + "/";
            bool   alreadyCollectedInSave = SaveData.Instance.Areas_Safe[area.ID].Modes[(int)area.Mode].HeartGem;

            if (alreadyCollectedInSave)
            {
                spritePath = "CollabUtils2/miniheart/ghost/ghost";
            }

            Add(sprite = new Sprite(GFX.Game, spritePath));
            sprite.AddLoop("idle", "", 0.1f, animationFrames);
            sprite.Play("idle");
            sprite.CenterOrigin();
            sprite.OnLoop = anim => {
                if (Visible)
                {
                    Audio.Play("event:/SC2020_heartShard_pulse", Position);
                    scaleWiggler.Start();
                    (Scene as Level).Displacement.AddBurst(Position + sprite.Position, 0.35f, 4f, 24f, 0.25f);
                }
            };


            Color heartColor;

            switch (spriteName)
            {
            case "beginner":
            default:
                heartColor    = Color.Aqua;
                shineParticle = HeartGem.P_BlueShine;
                break;

            case "intermediate":
                heartColor    = Color.Red;
                shineParticle = HeartGem.P_RedShine;
                break;

            case "advanced":
                heartColor    = Color.Gold;
                shineParticle = HeartGem.P_GoldShine;
                break;

            case "expert":
                heartColor    = Color.Orange;
                shineParticle = new ParticleType(HeartGem.P_BlueShine)
                {
                    Color = Color.Orange
                };
                break;

            case "grandmaster":
                heartColor    = Color.DarkViolet;
                shineParticle = new ParticleType(HeartGem.P_BlueShine)
                {
                    Color = Color.DarkViolet
                };
                break;
            }
            if (alreadyCollectedInSave)
            {
                heartColor    = Color.White * 0.8f;
                shineParticle = new ParticleType(HeartGem.P_BlueShine)
                {
                    Color = Calc.HexToColor("7589FF")
                };
            }
            heartColor = Color.Lerp(heartColor, Color.White, 0.5f);
            Add(light  = new VertexLight(heartColor, 1f, 32, 64));
            Add(bloom  = new BloomPoint(0.75f, 16f));
        }
        public MarioShell(EntityData data, Vector2 offset) : base(data.Position + offset)
        {
            colors  = new List <Color>();
            timeAcc = 0;

            bool lights = data.Bool("lights", false);

            texture   = data.Attr("texture", "koopa");
            dangerous = data.Bool("dangerous", dangerousTextures.ContainsKey(texture) && dangerousTextures[texture]);
            disco     = data.Bool("disco", false);
            grabbable = data.Bool("grabbable", true);

            String rawColor = data.Attr("color", "Green");

            colorSpeed = data.Float("colorSpeed", 0.8f);

            foreach (String s in rawColor.Split(','))
            {
                colors.Add(ColorHelper.GetColor(s));
            }

            int direction = Math.Sign(data.Int("direction", 0));

            Speed = new Vector2(baseSpeed * direction, 0f);
            grace = 0f;

            prevLiftspeed = Vector2.Zero;

            pickupIdleCollider   = new Hitbox(18f, 18f, -9, -9);
            pickupMovingCollider = new Hitbox(0f, 0f, 0f, 0f);

            shellHeldCollider    = new Hitbox(8f, 14f, -4f, -7f);
            shellNotHeldCollider = new Hitbox(14f, 14f, -7f, -7f);

            Add(new PlayerCollider(new Action <Player>(OnPlayer)));
            Collider = shellNotHeldCollider;

            onCollideH = new Collision(OnCollideH);
            onCollideV = new Collision(OnCollideV);

            Add((Component)(decorationIdle = new Sprite(GFX.Game, $"objects/pandorasBox/shells/{texture}/deco_idle")));
            decorationIdle.AddLoop("deco_idle", "", 0.1f);
            decorationIdle.Play("deco_idle", true, false);
            decorationIdle.CenterOrigin();

            Add((Component)(shellIdle = new Sprite(GFX.Game, $"objects/pandorasBox/shells/{texture}/shell_idle")));
            shellIdle.AddLoop("shell_idle", "", 0.1f);
            shellIdle.Play("shell_idle", true, false);
            shellIdle.CenterOrigin();
            shellIdle.Color = colors[0];

            Add((Component)(decorationMoving = new Sprite(GFX.Game, $"objects/pandorasBox/shells/{texture}/deco_moving")));
            decorationMoving.AddLoop("deco_moving", "", 0.1f);
            decorationMoving.Play("deco_moving", true, false);
            decorationMoving.CenterOrigin();

            Add((Component)(shellMoving = new Sprite(GFX.Game, $"objects/pandorasBox/shells/{texture}/shell_moving")));
            shellMoving.AddLoop("shell_moving", "", 0.1f);
            shellMoving.Play("shell_moving", true, false);
            shellMoving.CenterOrigin();
            shellMoving.Color = colors[0];

            Add((Component)(Hold = new Holdable()));
            Hold.PickupCollider = new Hitbox(18f, 18f, -9, -9);
            Hold.OnPickup       = new Action(OnPickup);
            Hold.OnRelease      = new Action <Vector2>(OnRelease);
            Hold.SpeedGetter    = () => Speed;
            Hold.DangerousCheck = DangerousCheck;
            Hold.OnHitSpring    = HitSpring;

            decorationMoving.Visible = shellMoving.Visible = false;

            id = data.ID;

            if (lights)
            {
                Add((Component)(bloom = new BloomPoint(1f, 16f)));
                Add((Component)(light = new VertexLight(Collider.Center, Color.White, 1f, 8, 24)));

                bloom.Visible = light.Visible = true;
            }
        }
 public override void Added(Scene scene)
 {
     base.Added(scene);
     if (SaveData.Instance.CheckStrawberry(ID))
     {
         if (Moon)
         {
             sprite = GFX.SpriteBank.Create("moonghostberry");
         }
         else if (Golden)
         {
             sprite = GFX.SpriteBank.Create("goldghostberry");
         }
         else
         {
             sprite = GFX.SpriteBank.Create("ghostberry");
         }
         sprite.Color = Color.White * 0.8f;
     }
     else if (Moon)
     {
         sprite = GFX.SpriteBank.Create("moonberry");
     }
     else if (Golden)
     {
         sprite = GFX.SpriteBank.Create("goldberry");
     }
     else
     {
         sprite = GFX.SpriteBank.Create("strawberry");
     }
     Add(sprite);
     if (Winged)
     {
         sprite.Play("flap");
     }
     sprite.OnFrameChange = OnAnimate;
     Add(wiggler          = Wiggler.Create(0.4f, 4f, delegate(float v) {
         sprite.Scale = Vector2.One * (1f + v * 0.35f);
     }));
     Add(rotateWiggler = Wiggler.Create(0.5f, 4f, delegate(float v) {
         sprite.Rotation = v * 30f * ((float)Math.PI / 180f);
     }));
     Add(bloom      = new BloomPoint((Golden || Moon || isGhostBerry) ? 0.5f : 1f, 12f));
     Add(light      = new VertexLight(Color.White, 1f, 16, 24));
     Add(lightTween = light.CreatePulseTween());
     if (Seeds != null && Seeds.Count > 0)
     {
         Session session = (scene as Level).Session;
         if (!session.GetFlag(gotSeedFlag))
         {
             foreach (GenericStrawberrySeed seed in Seeds)
             {
                 scene.Add(seed);
             }
             Visible        = false;
             Collidable     = false;
             WaitingOnSeeds = true;
             bloom.Visible  = (light.Visible = false);
         }
     }
     if ((scene as Level).Session.BloomBaseAdd > 0.1f)
     {
         bloom.Alpha *= 0.5f;
     }
 }
Exemple #6
0
        public ShieldedRefill(Vector2 position, bool twoDashes, bool oneUse, bool repell)
            : base(position)
        {
            Collider = new Hitbox(16f, 16f, -8f, -8f);
            Add(new PlayerCollider(OnPlayer));
            this.twoDashes = twoDashes;
            bounceBubble   = repell;
            this.oneUse    = oneUse;

            string str;

            if (twoDashes)
            {
                str       = "objects/refillTwo/";
                p_shatter = Refill.P_ShatterTwo;
                p_regen   = Refill.P_RegenTwo;
                p_glow    = Refill.P_GlowTwo;
            }
            else
            {
                str       = "objects/refill/";
                p_shatter = Refill.P_Shatter;
                p_regen   = Refill.P_Regen;
                p_glow    = Refill.P_Glow;
            }

            Add(outline = new Image(GFX.Game[str + "outline"]));
            outline.CenterOrigin();
            outline.Visible = false;
            Add(sprite      = new Sprite(GFX.Game, str + "idle"));
            sprite.AddLoop("idle", "", 0.1f);
            sprite.Play("idle");
            sprite.CenterOrigin();

            Add(flash = new Sprite(GFX.Game, str + "flash"));
            flash.Add("flash", "", 0.05f);
            flash.OnFinish = delegate {
                flash.Visible = false;
            };
            flash.CenterOrigin();
            Add(wiggler = Wiggler.Create(1f, 4f, delegate(float v) {
                sprite.Scale = (flash.Scale = Vector2.One * (1f + v * 0.2f));
            }));

            shieldRadiusWiggle = Wiggler.Create(1f, 4f, delegate(float v) {
                bubbleScale = 8f + v;
            });
            shieldRadiusWiggle.StartZero = true;
            Add(shieldRadiusWiggle);

            moveWiggle           = Wiggler.Create(0.8f, 2f);
            moveWiggle.StartZero = true;
            Add(moveWiggle);

            Add(new MirrorReflection());
            Add(bloom = new BloomPoint(0.8f, 16f));
            Add(light = new VertexLight(Color.White, 1f, 16, 48));
            Add(sine  = new SineWave(0.6f, 0f).Randomize());
            UpdateY();
            Depth = Depths.Pickups;
        }