85 lines
1.5 KiB
Plaintext
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)
|
|
}
|
|
}
|