LADXHD/InGame/GameObjects/Bosses/BossFinalBossBat.cs
2023-12-14 17:21:22 -05:00

107 lines
4 KiB
C#

using Microsoft.Xna.Framework;
using ProjectZ.InGame.GameObjects.Base;
using ProjectZ.InGame.GameObjects.Base.Components;
using ProjectZ.InGame.GameObjects.Base.CObjects;
using ProjectZ.InGame.GameObjects.Base.Components.AI;
using ProjectZ.InGame.Map;
using ProjectZ.InGame.SaveLoad;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.GameObjects.Bosses
{
class BossFinalBossBat : GameObject
{
private readonly BodyComponent _body;
private readonly AiComponent _aiComponent;
private readonly Animator _animator;
private readonly CSprite _sprite;
public BossFinalBossBat(Map.Map map, int posX, int posY) : base(map)
{
Tags = Values.GameObjectTag.Enemy;
EntityPosition = new CPosition(posX, posY, 0);
EntitySize = new Rectangle(-8, -8, 16, 16);
_animator = AnimatorSaveLoad.LoadAnimator("Nightmares/nightmare bat");
_sprite = new CSprite(EntityPosition);
var animatorComponent = new AnimationComponent(_animator, _sprite, Vector2.Zero);
_body = new BodyComponent(EntityPosition, -5, -4, 10, 8, 8)
{
IgnoresZ = true,
IgnoreHoles = true,
CollisionTypes = Values.CollisionTypes.None
};
_aiComponent = new AiComponent();
var stateIdle = new AiState() { Init = InitIdle };
stateIdle.Trigger.Add(new AiTriggerCountdown(400, null, () => _aiComponent.ChangeState("fire")));
var stateFire = new AiState() { Init = InitFire };
stateFire.Trigger.Add(new AiTriggerCountdown(400, null, () => _aiComponent.ChangeState("bat")));
var stateBat = new AiState() { Init = InitBat };
stateBat.Trigger.Add(new AiTriggerCountdown(550, null, () => _aiComponent.ChangeState("flying")));
var stateFlying = new AiState() { Init = InitFlying };
stateFlying.Trigger.Add(new AiTriggerCountdown(2000, FadeOut, Despawn));
_aiComponent.States.Add("idle", stateIdle);
_aiComponent.States.Add("fire", stateFire);
_aiComponent.States.Add("bat", stateBat);
_aiComponent.States.Add("flying", stateFlying);
_aiComponent.ChangeState("idle");
var damageCollider = new CBox(EntityPosition, -5, -4, 0, 10, 8, 8);
AddComponent(DamageFieldComponent.Index, new DamageFieldComponent(damageCollider, HitType.Enemy, 2));
AddComponent(AiComponent.Index, _aiComponent);
AddComponent(BodyComponent.Index, _body);
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
AddComponent(BaseAnimationComponent.Index, animatorComponent);
AddComponent(DrawComponent.Index, new DrawCSpriteComponent(_sprite, Values.LayerTop));
}
private void Update()
{
_sprite.SpriteShader =
Game1.TotalGameTime % (AiDamageState.BlinkTime * 2) < AiDamageState.BlinkTime ? Resources.DamageSpriteShader0 : null;
}
private void InitIdle()
{
_animator.Play("idle");
}
private void InitFire()
{
_animator.Play("fire");
}
private void InitBat()
{
_animator.Play("bat");
}
private void InitFlying()
{
var playerDirection = MapManager.ObjLink.EntityPosition.Position - EntityPosition.Position;
if (playerDirection != Vector2.Zero)
playerDirection.Normalize();
_body.VelocityTarget = playerDirection * 1.75f;
Game1.GameManager.PlaySoundEffect("D378-40-28");
}
private void FadeOut(double time)
{
var percentage = MathHelper.Clamp((float)time / 75, 0, 1);
_sprite.Color = Color.White * percentage;
}
private void Despawn()
{
Map.Objects.DeleteObjects.Add(this);
}
}
}