mirror of
https://github.com/Phantop/LADXHD.git
synced 2024-11-27 08:53:32 +00:00
91 lines
3.5 KiB
C#
91 lines
3.5 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.SaveLoad;
|
|
using ProjectZ.InGame.Things;
|
|
|
|
namespace ProjectZ.InGame.GameObjects.Enemies
|
|
{
|
|
internal class EnemyMegaThwomp : GameObject
|
|
{
|
|
private readonly AiComponent _aiComponent;
|
|
private readonly Animator _animator;
|
|
private readonly BodyComponent _body;
|
|
|
|
public EnemyMegaThwomp() : base("mega thwomp") { }
|
|
|
|
public EnemyMegaThwomp(Map.Map map, int posX, int posY) : base(map)
|
|
{
|
|
Tags = Values.GameObjectTag.Enemy;
|
|
|
|
EntityPosition = new CPosition(posX, posY, 0);
|
|
EntitySize = new Rectangle(0, -1, 32, 32);
|
|
|
|
_animator = AnimatorSaveLoad.LoadAnimator("Enemies/mega thwomp");
|
|
_animator.Play("idle");
|
|
|
|
var sprite = new CSprite(EntityPosition);
|
|
var animationComponent = new AnimationComponent(_animator, sprite, new Vector2(0, 0));
|
|
|
|
_body = new BodyComponent(EntityPosition, 0, -1, 32, 32, 8)
|
|
{
|
|
MoveCollision = OnCollision,
|
|
Gravity2D = 0.15f,
|
|
IsActive = false
|
|
};
|
|
|
|
var stateIdle = new AiState();
|
|
// short delay before starting to fall down
|
|
var statePreFalling = new AiState();
|
|
statePreFalling.Trigger.Add(new AiTriggerCountdown(500, null, ToFalling));
|
|
var stateFalling = new AiState();
|
|
var stateFallen = new AiState();
|
|
|
|
_aiComponent = new AiComponent();
|
|
_aiComponent.States.Add("idle", stateIdle);
|
|
_aiComponent.States.Add("preFalling", statePreFalling);
|
|
_aiComponent.States.Add("falling", stateFalling);
|
|
_aiComponent.States.Add("fallen", stateFallen);
|
|
_aiComponent.ChangeState("idle");
|
|
|
|
AddComponent(HittableComponent.Index, new HittableComponent(_body.BodyBox, OnHit));
|
|
AddComponent(BodyComponent.Index, _body);
|
|
AddComponent(AiComponent.Index, _aiComponent);
|
|
AddComponent(BaseAnimationComponent.Index, animationComponent);
|
|
AddComponent(CollisionComponent.Index, new BodyCollisionComponent(_body, Values.CollisionTypes.Normal));
|
|
AddComponent(DrawComponent.Index, new DrawCSpriteComponent(sprite, Values.LayerBottom));
|
|
}
|
|
|
|
private void ToPreFalling()
|
|
{
|
|
_aiComponent.ChangeState("preFalling");
|
|
_animator.Play("hit");
|
|
}
|
|
|
|
private void ToFalling()
|
|
{
|
|
_aiComponent.ChangeState("falling");
|
|
_body.IsActive = true;
|
|
}
|
|
|
|
private Values.HitCollision OnHit(GameObject originObject, Vector2 direction, HitType type, int damage, bool pieceOfPower)
|
|
{
|
|
if (type == HitType.PegasusBootsPush && _aiComponent.CurrentStateId == "idle")
|
|
ToPreFalling();
|
|
|
|
return Values.HitCollision.None;
|
|
}
|
|
|
|
private void OnCollision(Values.BodyCollision collision)
|
|
{
|
|
if ((collision & Values.BodyCollision.Bottom) != 0)
|
|
{
|
|
_body.IsActive = false;
|
|
Game1.GameManager.ShakeScreen(750, 1, 2, 2.5f, 6.5f);
|
|
Game1.GameManager.PlaySoundEffect("D378-12-0C");
|
|
}
|
|
}
|
|
}
|
|
} |