Files

85 lines
1.5 KiB
Plaintext

package enemy
import (
"aego/curve"
"aego/physics"
"aego/timer"
"aego/tween"
"mygame/combat"
"mygame/shared"
)
script EnemyAI {
signal Died()
@export
var PointA NodeRef
@export
var PointB NodeRef
@export
var Target NodeRef
@export(tip="Speed, cooldown, damage and tint of this kind of enemy")
var Stats AssetRef<EnemyStats>
var toB bool = true
var hit timer.Timer
var dead bool
var fade Connection
func Ready() {
hit = timer.Cooldown(Stats.Cooldown)
sprite := node.Get<SpriteRenderer>()
if sprite != nil {
sprite.Tint = Stats.Tint
}
}
func FixedUpdate(dt float) {
if dead || PointA == nil || PointB == nil {
return
}
body := node.Get<Body2D>()
if body == nil {
return
}
goal := PointA.Position()
if toB {
goal = PointB.Position()
}
dir := shared.Toward(node.Position().X, goal.X, 0.05)
if dir == 0 {
toB = !toB
}
v := body.Velocity
v.X = dir * Stats.Speed
body.SetVelocity(v)
}
func OnTriggerEnter(other NodeRef) {
if dead || other != Target {
return
}
tb := other.Get<Body2D>()
if tb == nil || tb.Velocity.Y <= 0 {
return
}
dead = true
Died.Emit()
fade = tween.ToFloat(node, "SpriteRenderer.Tint.a", 0, 0.2, curve.OutQuad).Completed.Connect(OnFaded)
}
func OnFaded(finished bool) {
node.Destroy()
}
func OnCollisionEnter(other NodeRef, c physics.Contact) {
if dead || other != Target || c.Normal.Y > 0.5 || !hit.Use() {
return
}
combat.Damage(Target, Stats.Damage)
}
}