Files
sanspie a6822156cd
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
Finish Stage 12 editor fixes and refreshed platformer
2026-11-05 17:36:42 +03:00

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()
}
}
}