public CoreKevin(EntityData data, Vector2 offset) : base(data, offset) { Add(Listener = new CoreModeListener(OnCoreMode)); AlwaysAngry = data.Bool("AlwaysAngry"); DefaultToAngry = data.Bool("DefaultToAngry"); Mode = data.Enum("axes", Axes.Both); Giant = Width >= 48f && Height >= 48f && data.Bool("chillout"); // Add an angry face Add(AngryFace = GFX.SpriteBank.Create(AngryPath)); AngryFace.Position = new Vector2(Width, Height) / 2f; AngryFace.Play("idle"); AngryFace.OnLastFrame = Face.OnLastFrame; AngryFace.Visible = false; // Synchronize faces Face.OnChange = (lastID, newID) => { AngryFace.Play(newID); }; }
public CoreSpirit(EntityData data, Vector2 offset) : base(data.Position + offset, false, data.Bool("oneUse")) { Duration = data.Float("duration", 0f); Sprite.RemoveSelf(); // Replace the outline Outline.RemoveSelf(); Add(Outline = new Image(GFX.Game["objects/nyahhelper/corespirit/outline"])); Outline.CenterOrigin(); Outline.Visible = false; // Get sprites Add(HotSprite = new Sprite(GFX.Game, "objects/nyahhelper/corespirit/hot/idle")); HotSprite.AddLoop("idle", "", 0.1f); HotSprite.Play("idle"); HotSprite.CenterOrigin(); Add(ColdSprite = new Sprite(GFX.Game, "objects/nyahhelper/corespirit/cold/idle")); ColdSprite.AddLoop("idle", "", 0.1f); ColdSprite.Play("idle"); ColdSprite.CenterOrigin(); // Initialize sprites switch (Mode = data.Enum("mode", SpiritMode.Hot)) { case SpiritMode.Hot: HotSprite.Visible = true; ColdSprite.Visible = false; Sprite = HotSprite; break; case SpiritMode.Cold: HotSprite.Visible = false; ColdSprite.Visible = true; Sprite = ColdSprite; break; } // Add a core mode synchronizer if (Synchronized = data.Bool("syncWithCoreMode")) { Add(CoreListener = new CoreModeListener(OnCoreMode)); } // Hook the PlayerCollider event PlayerCollider = Get <PlayerCollider>(); var origAction = PlayerCollider.OnCollide; PlayerCollider.OnCollide = (Player player) => { // TODO: Add an outline to the player CoreSpiritHook.Immune = true; CoreSpiritHook.Mode = Mode; // Revoke after the set duration, if it's not set to infinite if (Duration > 0) { Add(new Coroutine(RevokeInvincibilityRoutine())); } Audio.Play("event:/game/general/diamond_touch", Position); Input.Rumble(RumbleStrength.Medium, RumbleLength.Medium); Collidable = false; Add(new Coroutine(RefillRoutine(player))); RespawnTimer = 2.5f; // Use the original refill routine with the current active sprite Sprite = Mode == SpiritMode.Hot ? HotSprite : ColdSprite; origAction(player); }; }