SupaLidlGame/State/NPC/Doc/DocShungiteDartState.cs

81 lines
2.2 KiB
C#
Raw Normal View History

using Godot;
using GodotUtilities;
using SupaLidlGame.Entities;
namespace SupaLidlGame.State.NPC.Doc;
public partial class DocShungiteDartState : DocAttackState
{
[Export]
public override double Duration { get; set; }
[Export]
public override double AttackDuration { get; set; }
[Export]
public override PackedScene Projectile { get; set; }
[Export]
2023-07-18 00:57:28 -07:00
public override DocChooseAttackState ChooseAttackState { get; set; }
2023-07-18 00:57:28 -07:00
[Export]
public Characters.Doc Doc { get; set; }
2023-07-24 00:43:21 -07:00
public override NPCState Enter(IState<NPCState> nextState)
{
2023-07-24 00:43:21 -07:00
return base.Enter(nextState);
}
protected virtual Projectile SpawnProjectile(
Vector2 position,
Vector2 direction)
{
var projectile = _map.SpawnEntity<Projectile>(Projectile);
projectile.Hitbox.Faction = NPC.Faction;
projectile.GlobalPosition = position;
projectile.Direction = direction;
projectile.GlobalRotation = direction.Angle();
2023-07-18 00:57:28 -07:00
projectile.Delay = 1.0 / Doc.Intensity;
return projectile;
}
protected override void Attack()
{
2023-07-31 01:12:47 -07:00
var player = NPC.FindBestTarget();
2023-08-03 10:09:12 -07:00
if (player is null)
{
return;
}
var playerPos = player.GlobalPosition;
// global position is (from npc to player) * 2 = (2 * npc) - player
//projectile.GlobalPosition = 2 * NPC.GlobalPosition - playerPos;
2023-07-24 21:29:14 -07:00
Vector2 position1 = 3 * NPC.GlobalPosition - 2 * playerPos;
Vector2 position2 = 3 * playerPos - 2 * NPC.GlobalPosition;
Vector2 direction1 = position1.DirectionTo(playerPos);
Vector2 direction2 = -direction1;
SpawnProjectile(position1, direction1);
SpawnProjectile(position2, direction2);
2023-07-18 00:57:28 -07:00
_currentAttackDuration = AttackDuration / Doc.Intensity;
}
public override NPCState Process(double delta)
{
2023-07-23 23:39:20 -07:00
if (Doc.StunTime > 0)
{
return null;
}
2023-07-24 21:29:14 -07:00
if ((_currentDuration -= delta) <= 0 || Doc.Intensity > 2)
{
2023-07-18 00:57:28 -07:00
return ChooseAttackState;
}
if ((_currentAttackDuration -= delta) <= 0)
{
Attack();
}
return null;
}
}