Exit Full View

Cavern Quest 2 / src / commonMain / kotlin / Rock.kt

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

}