mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-01 04:14:22 +00:00
107 lines
4 KiB
C#
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);
|
|
}
|
|
}
|
|
} |