LADXHD/InGame/GameObjects/Enemies/EnemyGopongaFlower.cs

84 lines
3.7 KiB
C#
Raw Normal View History

2023-12-14 22:21:22 +00:00
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.SaveLoad;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.GameObjects.Enemies
{
internal class EnemyGopongaFlower : GameObject
{
private readonly AiDamageState _aiDamageState;
private readonly Animator _animator;
private readonly int _animationLength;
public EnemyGopongaFlower() : base("goponga flower") { }
public EnemyGopongaFlower(Map.Map map, int posX, int posY) : base(map)
{
Tags = Values.GameObjectTag.Enemy;
EntityPosition = new CPosition(posX + 8, posY + 8, 0);
EntitySize = new Rectangle(-8, -8, 16, 16);
_animator = AnimatorSaveLoad.LoadAnimator("Enemies/goponga flower");
_animator.Play("idle");
foreach (var frame in _animator.CurrentAnimation.Frames)
_animationLength += frame.FrameTime;
var sprite = new CSprite(EntityPosition);
var animationComponent = new AnimationComponent(_animator, sprite, new Vector2(-8, -8));
var body = new BodyComponent(EntityPosition, -8, -8, 16, 16, 8) { IgnoresZ = true };
var collisionBox = new CBox(EntityPosition, -7, -7, 14, 14, 8);
var hittableBox = new CBox(EntityPosition, -8, -8, 16, 16, 8);
var aiComponent = new AiComponent();
aiComponent.States.Add("idle", new AiState());
_aiDamageState = new AiDamageState(this, body, aiComponent, sprite, 4)
{
HitMultiplierX = 0,
HitMultiplierY = 0
};
aiComponent.ChangeState("idle");
AddComponent(AiComponent.Index, aiComponent);
AddComponent(DamageFieldComponent.Index, new DamageFieldComponent(hittableBox, HitType.Enemy, 4));
AddComponent(CollisionComponent.Index, new BoxCollisionComponent(collisionBox, Values.CollisionTypes.Enemy));
AddComponent(HittableComponent.Index, new HittableComponent(hittableBox, OnHit));
AddComponent(BodyComponent.Index, body);
AddComponent(BaseAnimationComponent.Index, animationComponent);
AddComponent(UpdateComponent.Index, new UpdateComponent(Update));
AddComponent(DrawComponent.Index, new BodyDrawComponent(body, sprite, Values.LayerPlayer) { WaterOutline = false });
}
private void Update()
{
// @HACK: this is used to sync all the animations with the same length
// otherwise they would not be in sync if they did not get updated at the same time
_animator.SetFrame(0);
_animator.SetTime(Game1.TotalGameTime % _animationLength);
_animator.Update();
}
private Values.HitCollision OnHit(GameObject originObject, Vector2 direction, HitType type, int damage, bool pieceOfPower)
{
// only bowwow can attack
if (type != HitType.BowWow && type != HitType.Hookshot && type != HitType.MagicRod && type != HitType.Boomerang)
return Values.HitCollision.Blocking;
if (type != HitType.BowWow && (type == HitType.MagicRod || damage >= _aiDamageState.CurrentLives))
{
_aiDamageState.HitMultiplierX = 4;
_aiDamageState.HitMultiplierY = 4;
}
return _aiDamageState.OnHit(originObject, direction, type, damage, pieceOfPower);
}
}
}