208 lines
3.5 KiB
Plaintext
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)))
|
|
}
|
|
}
|
|
}
|