import uk.co.nickthecoder.kyd.Actor
import uk.co.nickthecoder.kyd.appearance.*
import uk.co.nickthecoder.kyd.nodes.PlayActView
interface Killable {
fun killedBy(killer: Actor, victim: Actor)
}
class Rock : Item() {
/**
* Set in [soilRemoved]
*/
private var soilRemovedDelay: FlipBookAnimation? = null
override fun tick(actor: Actor, seconds: Float) {
soilRemovedDelay.let { delay ->
if (delay == null) {
val belowActor = look(0, - 1)
val belowBehaviour = belowActor?.behaviour
if (belowBehaviour is Monster) {
// We don't move, but the monster turns into soil.
belowActor.behaviour = Soil()
(PlayActView.instance.game.find("/graphics/soil") as AppearanceResource).applyToActor(belowActor)
PlayDirector.instance.spawnNewMonster()
} else if (belowActor.isEmpty()) {
move(actor, 0, - 1)
(belowActor?.behaviour as? Killable)?.killedBy(actor, belowActor)
}
} else {
delay.tick(actor, seconds)
}
}
}
/**
* Called by a [Soil] below us when it has been destroyed.
*/
fun soilRemoved() {
// (Ab)using FlipBookAnimation to cause a delay before the rock falls
// when soil below us has been removed.
// We *could* make it an actual animation - e.g. shaking left/right.
soilRemovedDelay = flipBookAnimation {
repetitions = 1
page(null, rockFallDelay)
onFinished {
soilRemovedDelay = null
}
}
}
}