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 }); }
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; } }
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; }