ci-platforms / windows amd64 smoke (push) Skipped
ci / release (push) Successful in 8m58s
ci-platforms / darwin amd64 smoke (push) Skipped
ci-platforms / darwin arm64 smoke (push) Skipped
ci / checks (push) Successful in 4m46s
ci / build (amd64, linux, ubuntu-24.04) (push) Successful in 13m28s
87 lines
1.8 KiB
Plaintext
87 lines
1.8 KiB
Plaintext
package enemy
|
|
|
|
import (
|
|
"aego/audio"
|
|
"aego/math"
|
|
"mygame/shared"
|
|
)
|
|
|
|
script EnemyAI {
|
|
signal Died()
|
|
|
|
@export
|
|
var PointA NodeRef
|
|
|
|
@export
|
|
var PointB NodeRef
|
|
|
|
@export(tip="Speed, cooldown, damage and tint of this kind of enemy")
|
|
var Stats AssetRef<EnemyStats>
|
|
|
|
@export
|
|
var DieSound AssetRef<AudioEvent>
|
|
|
|
var toB bool = true
|
|
var dead bool
|
|
var phase float
|
|
var deathTime float
|
|
var baseSize Vec2
|
|
|
|
func Ready() {
|
|
baseSize = node.Get<SpriteRenderer>().Size
|
|
node.Get<SpriteRenderer>().Tint = Stats.Tint
|
|
hit := node.Get<Hitbox2D>()
|
|
hit.Damage = Stats.Damage
|
|
hit.Period = Stats.Cooldown
|
|
node.Get<Health>().Died.Connect(OnDied)
|
|
node.Get<Animator>().StateEntered.Connect(OnState)
|
|
}
|
|
|
|
func Update(dt float) {
|
|
sprite := node.Get<SpriteRenderer>()
|
|
if dead {
|
|
deathTime += dt
|
|
t := math.Clamp(deathTime / 0.2, 0, 1)
|
|
sprite.Size = Vec2{baseSize.X * (1 + 0.35 * t), baseSize.Y * (1 - 0.55 * t)}
|
|
} else {
|
|
phase += dt * (8 + Stats.Speed * 2)
|
|
bounce := math.Sin(phase) * 0.06
|
|
sprite.Size = Vec2{baseSize.X * (1 - bounce), baseSize.Y * (1 + bounce)}
|
|
}
|
|
}
|
|
|
|
func FixedUpdate(dt float) {
|
|
if dead || PointA == nil || PointB == nil {
|
|
return
|
|
}
|
|
body := node.Get<Body2D>()
|
|
goal := PointA.Position()
|
|
if toB {
|
|
goal = PointB.Position()
|
|
}
|
|
dir := shared.Toward(node.Position().X, goal.X, 0.05)
|
|
if dir == 0 {
|
|
toB = !toB
|
|
} else {
|
|
node.Get<SpriteRenderer>().FlipX = dir < 0
|
|
}
|
|
v := body.Velocity
|
|
v.X = dir * Stats.Speed
|
|
body.SetVelocity(v)
|
|
}
|
|
|
|
func OnDied(source NodeRef) {
|
|
dead = true
|
|
node.Get<Hitbox2D>().Deactivate()
|
|
node.Get<Animator>().SetTrigger("Die")
|
|
Died.Emit()
|
|
audio.PlayEventAt(DieSound, node.Position())
|
|
}
|
|
|
|
func OnState(state int) {
|
|
if node.Get<Animator>().StateName(state) == "Gone" {
|
|
node.Destroy()
|
|
}
|
|
}
|
|
}
|