Files

208 lines
3.5 KiB
Plaintext

package player
import (
"aego/camera"
"aego/input"
"aego/log"
"aego/physics"
"aego/save"
"aego/settings"
"mygame/enemy"
"mygame/shared"
)
enum State {
Idle
Run
Air
}
script PlayerController {
@export(min=0, max=20, unit="u/s")
var Speed float = 7
@export(gizmo="vector")
var JumpImpulse Vec2 = Vec2{0, -5}
@export(display="Hit Tint")
var HitTint Color
@export
var EnemyA NodeRef
@export
var EnemyB NodeRef
@export(min=0)
var LandShake float = 5.6
var ground int
var jumpWait float
var state State
var base Color
var lastHits int
var flash float
@persist
var kills int
var blink Coroutine
func Ready() {
sr := node.Get<SpriteRenderer>()
if sr != nil {
base = sr.Tint
}
watch(EnemyA)
watch(EnemyB)
log.Info("player ready at x=" + string(node.Position().X))
}
func watch(n NodeRef) {
if n == nil || !n.IsAlive() {
return
}
e := n.GetScript<enemy.EnemyAI>()
if e != nil {
e.Died.Connect(OnEnemyDied)
}
}
func OnEnemyDied() {
kills++
save.SetGlobalInt("kills", save.GlobalInt("kills", 0) + 1)
log.Info("kills=" + string(kills))
body := node.Get<Body2D>()
if body == nil {
return
}
v := body.Velocity
body.SetVelocity(Vec2{v.X, 0})
body.ApplyImpulse(JumpImpulse * 0.6)
}
func OnSave() {
save.PutInt("state", int(state))
}
func OnLoad() {
state = State(save.GetInt("state", 0))
hp := node.Get<Health>()
if hp != nil {
lastHits = hp.Hits
}
log.Info("loaded, kills=" + string(kills) + ", total kills=" + string(save.GlobalInt("kills", 0)))
}
func OnCollisionEnter(other NodeRef, c physics.Contact) {
if shared.IsFloor(c.Normal) {
ground++
}
if shared.IsFloor(c.Normal) && c.NormalImpulse > LandShake {
camera.Shake(0.35)
}
}
func OnCollisionExit(other NodeRef, c physics.Contact) {
if shared.IsFloor(c.Normal) && ground > 0 {
ground--
}
}
func Blink() coroutine {
on := true
for flash > 0 {
sr := node.Get<SpriteRenderer>()
if sr != nil {
if on {
sr.Tint = HitTint
} else {
sr.Tint = base
}
}
on = !on
yield wait(0.1)
}
sr := node.Get<SpriteRenderer>()
if sr != nil {
sr.Tint = base
}
}
func Reloaded() {
if flash > 0 {
blink = start Blink()
}
}
func FixedUpdate(dt float) {
body := node.Get<Body2D>()
if body == nil {
return
}
if jumpWait > 0 {
jumpWait -= dt
}
x := input.Axis("Move")
v := body.Velocity
v.X = x * Speed
body.SetVelocity(v)
if ground > 0 && jumpWait <= 0 && input.Buffered("Jump", 0) {
input.Consume("Jump")
body.SetVelocity(Vec2{v.X, 0})
body.ApplyImpulse(JumpImpulse)
jumpWait = 0.25
}
if ground == 0 {
state = State.Air
} else if x != 0 {
state = State.Run
} else {
state = State.Idle
}
}
func Update(dt float) {
if input.Pressed("QuickSave") {
save.Save("quick")
}
if input.Pressed("QuickLoad") && save.Exists("quick") {
save.Load("quick")
return
}
if input.Pressed("Pause") {
settings.OpenView()
return
}
sr := node.Get<SpriteRenderer>()
if sr == nil {
return
}
x := input.Axis("Move")
if x != 0 {
sr.FlipX = x < 0
}
hp := node.Get<Health>()
if hp != nil && hp.Hits != lastHits {
lastHits = hp.Hits
flash = 1
if !blink.Running() {
blink = start Blink()
}
}
if flash > 0 {
flash -= dt
return
}
if state == State.Air {
sr.Tint = Color{base.R, base.G, base.B, 0.8}
} else {
sr.Tint = base
}
}
func OnSettingChanged(id string) {
if id == "audio.bus.music.volume" {
log.Info("music volume " + string(settings.GetFloat(id)))
}
}
}