public override void Update() { base.Update(); if (_preset.Alive) { if (touching != Touching.NONE) { walk_t = 0; } Vector2 grid = MapUtilities.GetInGridPosition(Position); if ((grid.X < 5 && velocity.X < 0) || (grid.X + width > 155 && velocity.X > 0) || (grid.Y < 5 && velocity.Y < 0) || (grid.Y + height > 155 && velocity.Y > 0)) { walk_t = 0; } walk_t -= GameTimes.DeltaTime; if (walk_t <= 0) { (velocity.X, velocity.Y) = (velocity.Y, -velocity.X); FaceTowards(Position + velocity); PlayFacing("walk"); walk_t = walk_t_max; } } else if (_curAnim.Finished && !blood.exists) { SpawnBlood(); } }
IEnumerator CutSceneState() { while (!GlobalState.LastDialogueFinished) { yield return("wait"); } GlobalState.disable_menu = true; _player.BeIdle(); _player.state = PlayerState.INTERACT; velocity = -Vector2.UnitY * 40; Play("walk_u"); while (MapUtilities.GetInGridPosition(Position).Y > 6 * 16) { yield return("move up"); } velocity = Vector2.UnitX * 40; Play("walk_r"); while (MapUtilities.GetInGridPosition(Position).X > 10) //wraps around when on next screen { yield return("move right"); } exists = false; GlobalState.disable_menu = false; _player.state = PlayerState.GROUND; yield break; }
IEnumerator <string> StateLogic() { while (MapUtilities.GetInGridPosition(_p.Position).X > 80) { volume.Update(); yield return("Waiting"); } Sounds.SoundManager.StopSong(); var sound = Sounds.SoundManager.PlaySoundEffect("red_cave_rise"); GlobalState.Dialogue = Dialogue.DialogueManager.GetDialogue("happy_npc", "briar"); while (!GlobalState.LastDialogueFinished || sound.State == Microsoft.Xna.Framework.Audio.SoundState.Playing) { GlobalState.screenShake.Shake(0.02f, 0.1f); _p.dontMove = true; yield return("Dialogue"); } _p.dontMove = false; GlobalState.events.IncEvent("HappyStarted"); GlobalState.flash.Flash(1f, Color.Red, () => { ((Map)GlobalState.Map).ReloadSettings(_p); GlobalState.darkness.ForceAlpha(1); }); yield break; }
public virtual void Draw() { if (exists) { if (visible) { Rectangle srect = sprite.GetRect(_curAnim.Frame); srect.Height -= (int)y_push; SpriteDrawer.DrawSprite(sprite.Tex, MathUtilities.CreateRectangle(Position.X - offset.X * scale, Position.Y - offset.Y * scale + (int)y_push, srect.Width * scale, srect.Height * scale), srect, color * opacity, rotation, _flip, DrawingUtilities.GetDrawingZ(layer, MapUtilities.GetInGridPosition(Position).Y + height)); } if (shadow != null) { shadow.Draw(); } if (GlobalState.draw_hitboxes && HasVisibleHitbox) { SpriteDrawer.DrawSprite(ResourceManager.GetTexture("hitbox"), Hitbox, color: Color.Red, Z: DrawingUtilities.GetDrawingZ(DrawOrder.HITBOX, 0)); } } }
public PlayerDieDummy(Vector2 pos, string textureName) : base(MapUtilities.GetInGridPosition(pos), textureName, 16, 16, DrawOrder.PLAYER_DIE_DUMMY) { Position.Y += 20; AddAnimation("die", CreateAnimFrameArray(25, 26, 27, 24, 25, 26, 27, 24, 25, 26, 27, 32), 12, false); Play("die"); }
public override void Collided(Entity other) { if (other is Player p && !disable_player_hit) { SoundManager.PlaySoundEffect("player_hit_1"); Vector2 targetInGrid = new(16, 8 * 16); Vector2 target = p.Position + (targetInGrid - MapUtilities.GetInGridPosition(p.Position)); p.AutoJump(1, target, 50, -500); disable_player_hit = true; } }
public override void Update() { base.Update(); if (_curAnim.Finished) { velocity = Vector2.Zero; exists = false; return; } if (MapUtilities.GetInGridPosition(Position).X < 32) { Play("fall"); } }
public override void Draw() { if (visible && exists) { float draw_y = MapUtilities.GetInGridPosition(Position).Y; if (!is_behind_player) { float player_y = MapUtilities.GetInGridPosition(_root.Position).Y; draw_y = player_y + 0.5f; } SpriteDrawer.DrawSprite(Texture, MathUtilities.CreateRectangle(Position.X - offset.X, Position.Y - offset.Y, frameWidth, frameHeight), spriteRect, rotation: rotation, Z: DrawingUtilities.GetDrawingZ(layer, draw_y)); wide_attack.Draw(); long_attack.Draw(); } }
IEnumerator CutSceneState() { while (!GlobalState.LastDialogueFinished) { yield return("wait"); } GlobalState.disable_menu = true; _player.BeIdle(); _player.state = PlayerState.INTERACT; GlobalState.events.IncEvent("icky.rescued"); velocity = Vector2.UnitX * 20; Play("walk_r"); while (MapUtilities.GetInGridPosition(Position).X < 85) { yield return("move right"); } velocity = Vector2.Zero; Play("walk_d"); GlobalState.disable_menu = false; _player.state = PlayerState.GROUND; GlobalState.Dialogue = DialogueManager.GetDialogue("goldman", "etc", 3); while (!GlobalState.LastDialogueFinished) { yield return("say thanks"); } velocity = Vector2.UnitX * 20; Play("walk_r"); while (MapUtilities.GetInGridPosition(Position).X < 6 * 16) { yield return("move to final position"); } velocity = Vector2.Zero; Play("walk_d"); yield break; }
IEnumerator <CutsceneEvent> Entrance() { VolumeEvent volume = new(0, 0.6f); yield return(new EntityEvent(Enumerable.Repeat(volume, 1))); while (!volume.ReachedTarget) { yield return(null); } Play("walk_d"); opacity = 0; visible = true; Sounds.SoundManager.StopSong(); while (!MathUtilities.MoveTo(ref opacity, 0.4f, appearance_vel)) { yield return(null); } velocity.Y = 20; Sounds.SoundManager.PlaySong("go", 0.4f); volume.SetTarget(1f); volume.speed = appearance_vel; water_anim = CoroutineUtils.OnceEvery(WaterAnim.DoWaterAnim(Position), 0.3f); while (MapUtilities.GetInGridPosition(Position).Y < 44) { MathUtilities.MoveTo(ref opacity, 1f, appearance_vel); yield return(null); } opacity = 1f; velocity = 20 * Vector2.UnitX; Play("walk_r"); while (MapUtilities.GetInGridPosition(Position).X > 20) //wraps around when off screen { yield return(null); } exists = preset.Alive = false; GlobalState.events.IncEvent("HappyDone"); }
public virtual void Draw() { if (visible && exists) { SpriteDrawer.DrawSprite(Texture, MathUtilities.CreateRectangle(Position.X - offset.X * scale, Position.Y - offset.Y * scale, frameWidth * scale, frameHeight * scale), spriteRect, Color.White * _opacity, rotation, _flip, DrawingUtilities.GetDrawingZ(layer, MapUtilities.GetInGridPosition(Position).Y)); if (shadow != null) { shadow.Draw(); } } }
IEnumerator <CutsceneEvent> Exit() { yield return(new DialogueEvent(DialogueManager.GetDialogue("misc", "any", "mitra", 3))); bike.exists = false; OnBike(); velocity.X = 37; Solid = false; //disable collisions to not push player out of the screen while (MapUtilities.GetInGridPosition(Position).X > 10) //until wrap around from exiting the screen { yield return(null); } _preset.Alive = exists = false; GlobalState.SpawnEntity(new FadeSwitchSong("cliff")); yield break; }
public override void Draw() { if (visible && exists) { float draw_y = MapUtilities.GetInGridPosition(Position).Y; if (!is_behind_player) { float player_y = MapUtilities.GetInGridPosition(_root.Position).Y + _root.height; draw_y = player_y + 0.5f; } SpriteDrawer.DrawSprite(sprite.Tex, MathUtilities.CreateRectangle(Position.X - offset.X, Position.Y - offset.Y, sprite.Width, sprite.Height), sprite.GetRect(_curAnim.Frame), rotation: rotation, Z: DrawingUtilities.GetDrawingZ(layer, draw_y)); wide_attack.Draw(); long_attack.Draw(); //Draw hitbox, but not yourself visible = false; base.Draw(); visible = true; } }
public IEnumerator Stomp() { stomp_parabola.ResetTime(); velocity.X = -30; shadow.visible = true; while (true) { if ((velocity.X < 0 && MapUtilities.GetInGridPosition(Position).X < 16) || (velocity.X > 0 && MapUtilities.GetInGridPosition(Position).X > 16 * 9 - width)) { velocity *= -1; } if (stomp_parabola.Tick()) { SoundManager.PlaySoundEffect("wb_tap_ground"); SpawnExplosion(); stomp_parabola.ResetTime(); } yield return(null); } }
public override void Update() { base.Update(); if (_player.state == PlayerState.AIR) { player_jumped = true; } Vector2 player_grid_pos = MapUtilities.GetInGridPosition(_player.Position); if (!visible && player_grid_pos.Y > 50) { Position = MapUtilities.GetRoomUpperLeftPos(GlobalState.CurrentMapGrid) + new Vector2(180, 80); visible = true; GlobalState.StartCutscene = Entrance(); } else if (!exiting && visible && (player_grid_pos.X > 135 || player_grid_pos.Y < 49)) { exiting = true; GlobalState.StartCutscene = Exit(); } }
public IEnumerator Attack() { Play("charge"); Flicker(1.3f); SoundManager.PlaySoundEffect("sun_guy_charge"); while (_flickering) { yield return(null); } Play("attack"); velocity.Y = 50; while (MapUtilities.GetInGridPosition(Position).Y < 16 * 6 + 11) { yield return(null); } velocity.Y = -65; while (MapUtilities.GetInGridPosition(Position).Y > 45) { yield return(null); } velocity.Y = 80; while (MapUtilities.GetInGridPosition(Position).Y < 16 * 6 + 11) { yield return(null); } velocity = Vector2.Zero; while (!MathUtilities.MoveTo(ref Position.Y, start_loc.Y, 110)) { yield return(null); } yield break; }
public override void Update() { base.Update(); if (_curAnim.Finished) { if (_curAnim.name == "fall") { velocity = Vector2.Zero; exists = false; return; } else //rise { Launch(); } } if (MapUtilities.GetInGridPosition(Position).X < 32) { Play("fall"); disable_player_hit = true; } }
public override void Update() { base.Update(); if (_curAnim.Finished || opacity == 0) { exists = false; } if (_flickering) { Flicker(0.05f); } if (opacity != 1f) { MathUtilities.MoveTo(ref opacity, 0, 0.3f); } if (opacity == 1f && MapUtilities.GetInGridPosition(Position).Y > 8 * 16) { Play("fizzle"); } }
IEnumerator State() { y_push = sprite.Height; player.grid_entrance = MapUtilities.GetRoomUpperLeftPos(GlobalState.CurrentMapGrid) + Vector2.One * 20; GlobalState.SpawnEntity(new VolumeEvent(0, 3)); while (MapUtilities.GetInGridPosition(player.Position).X < 48) { yield return(null); } GlobalState.Dialogue = Dialogue.DialogueManager.GetDialogue("redboss", "before_fight"); float push_timer = 0f; loopSFX = true; while (!GlobalState.LastDialogueFinished) { push_timer += GameTimes.DeltaTime; if (push_timer >= push_tick_max) { push_timer = 0f; if (y_push > 0) { GlobalState.screenShake.Shake(0.021f, 0.1f); y_push--; } } yield return(null); } loopSFX = false; SoundManager.PlaySong("redcave-boss"); Play("bob"); IState state = new StateMachineBuilder() .State <SplashState>("Splash") .Enter((s) => amp = 5) .Event("Splash", (s) => { splash_bullets.Spawn(b => b.Spawn(), 4); }) .Event("Tentacles", (s) => { SpawnTentacles(); if (proximity_hits != Touching.NONE) { s.got_too_close++; if (s.got_too_close == 2) { s.got_too_close = 0; s.Parent.ChangeState("Stun"); } } }) .End() .State <DashState>("Dash") .Enter((s) => { amp = 0; velocity = new Vector2(30, 20); Play("bob"); }) .Update((s, _) => { Drawing.Effects.ScreenShake.Directions dirs = new(); Vector2 tl = MapUtilities.GetInGridPosition(Position); Vector2 br = MapUtilities.GetInGridPosition(Position + new Vector2(width, height)); if (tl.Y < 2 * 16) { velocity.Y = 60; dirs |= Drawing.Effects.ScreenShake.Directions.Vertical; } else if (br.Y > 16 * 8) { velocity.Y = -60; dirs |= Drawing.Effects.ScreenShake.Directions.Vertical; } if (tl.X < 2 * 16) { velocity.X = 60; dirs |= Drawing.Effects.ScreenShake.Directions.Horizontal; } else if (br.X > 16 * 8) { velocity.X = -60; dirs |= Drawing.Effects.ScreenShake.Directions.Horizontal; } GlobalState.screenShake.Shake(0.05f, 0.1f, dirs); }) .Event("Tentacles", (s) => { SpawnTentacles(); if (proximity_hits != Touching.NONE) { s.got_too_close++; if (s.got_too_close == 2) { s.got_too_close = 0; s.Parent.ChangeState("Splash"); } } }) .Event("EndDash", (s) => { s.Parent.ChangeState("Stun"); }) .Exit((s) => velocity = Vector2.Zero) .End() .State <StunState>("Stun") .Enter((s) => s.stateLogic = StunStateLogic()) .Update((s, _) => { if (!s.stateLogic.MoveNext()) { s.Parent.ChangeState("Dash"); } }) .End() .Build(); state.ChangeState("Splash"); state.TriggerEvent("Splash"); //First time instantly fires splash bullets while (health > 0) { state.Update(GameTimes.DeltaTime); pushdown_timer += GameTimes.DeltaTime * 3; y_push = (int)(amp + MathF.Sin(pushdown_timer) * amp); yield return(null); } velocity = Vector2.Zero; SoundManager.StopSong(); GlobalState.Dialogue = Dialogue.DialogueManager.GetDialogue("redboss", "after_fight"); GlobalState.screenShake.Shake(0.05f, 0.1f); GlobalState.flash.Flash(1f, Color.Red); while (!GlobalState.LastDialogueFinished) { yield return(null); } Play("die"); SoundManager.PlaySoundEffect("redboss_death"); GlobalState.wave.active = true; y_push = 0; while (y_push < sprite.Height) { MathUtilities.MoveTo(ref ripple.opacity, 0, 0.3f); push_timer += GameTimes.DeltaTime; if (push_timer >= push_tick_max) { push_timer = 0f; y_push++; } yield return(null); } float final_timer = 2f; while (final_timer > 0f) { final_timer -= GameTimes.DeltaTime; yield return(null); } preset.Alive = exists = false; GlobalState.wave.active = false; SoundManager.PlaySong("redcave"); GlobalState.events.BossDefeated.Add("REDCAVE"); yield break; }
protected IEnumerator <string> StateLogic() { //s_invisible ctr -1 while (GlobalState.IsDungeon && !GlobalState.events.BossDefeated.Contains(GlobalState.CURRENT_MAP_NAME)) { yield return("WaitForBoss"); } Vector2 targetPos = MapUtilities.GetInGridPosition(_sentinel.Position); visible = true; Play("fly"); _chirp = true; //s_animating ctr -1 while (!(MathUtilities.MoveTo(ref Position.X, targetPos.X, Movement) & MathUtilities.MoveTo(ref Position.Y, targetPos.Y + 20, Movement))) { yield return("FlyToStart"); } _sentinel.Activated = true; Play("idle"); //s_visible ctr 0 while (!_sentinel.PlayerCollided) { if (_sentinel.PlayerAway) { Play("fly"); velocity.Y = -100; //s_visible crt 1 while (!MathUtilities.MoveTo(ref opacity, 0, 1.2f)) { yield return("FlyAway"); } _sentinel.exists = false; yield break; } yield return("WaitForPlayer"); } float timer = 0; _player.BeIdle(); _player.state = PlayerState.INTERACT; GlobalState.disable_menu = true; Play("fly"); //s_animating ctr 0 while (GlobalState.CUR_HEALTH < GlobalState.MAX_HEALTH) { timer += GameTimes.DeltaTime; if (timer > 0.5f) { timer = 0; SoundManager.PlaySoundEffect("get_small_health"); GlobalState.CUR_HEALTH++; } yield return("HealPlayer"); } //TODO hp up achievement? targetPos = HealthBar.GetHealthPiecePos(GlobalState.MAX_HEALTH); _chirp = false; //s_animating ctr 1 while (!(MathUtilities.MoveTo(ref Position.X, targetPos.X - 4, Movement) & MathUtilities.MoveTo(ref Position.Y, targetPos.Y - 4, Movement))) { yield return("FlyToHealth"); } Play("gnaw"); int gnaws = 0; //First one is instant timer = 2f; while (gnaws < 3) { timer += GameTimes.DeltaTime; if (timer > 1.7f) { timer = 0; gnaws++; SoundManager.PlaySoundEffect("4sht_pop"); foreach (var box in _particles) { box.Spawn(Position); } } yield return("Gnaw"); } GlobalState.MAX_HEALTH++; GlobalState.CUR_HEALTH++; Play("fly"); velocity.Y = -40; _preset.Alive = false; while (!MathUtilities.MoveTo(ref opacity, 0, 0.6f)) { yield return("FadingOut"); } _player.state = PlayerState.GROUND; GlobalState.disable_menu = false; while (_particles.Any(p => p.exists)) { yield return("WaitingForBoxes"); } _sentinel.exists = false; yield break; }