HexCasting/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/lists/OpLastNToList.kt

33 lines
1.4 KiB
Kotlin

package at.petrak.hexcasting.common.casting.actions.lists
import at.petrak.hexcasting.api.casting.asActionResult
import at.petrak.hexcasting.api.casting.castables.Action
import at.petrak.hexcasting.api.casting.eval.CastingEnvironment
import at.petrak.hexcasting.api.casting.eval.OperationResult
import at.petrak.hexcasting.api.casting.eval.vm.CastingImage
import at.petrak.hexcasting.api.casting.eval.vm.SpellContinuation
import at.petrak.hexcasting.api.casting.getPositiveIntUnderInclusive
import at.petrak.hexcasting.api.casting.iota.Iota
import at.petrak.hexcasting.api.casting.mishaps.MishapNotEnoughArgs
import at.petrak.hexcasting.common.lib.hex.HexEvalSounds
object OpLastNToList : Action {
override fun operate(env: CastingEnvironment, image: CastingImage, continuation: SpellContinuation): OperationResult {
val stack = image.stack.toMutableList()
if (stack.isEmpty())
throw MishapNotEnoughArgs(1, 0)
val yoinkCount = stack.takeLast(1).getPositiveIntUnderInclusive(0, stack.size - 1)
stack.removeLast()
val output = mutableListOf<Iota>()
output.addAll(stack.takeLast(yoinkCount))
for (i in 0 until yoinkCount) {
stack.removeLast()
}
stack.addAll(output.asActionResult)
val image2 = image.withUsedOp().copy(stack = stack)
return OperationResult(image2, listOf(), continuation, HexEvalSounds.NORMAL_EXECUTE)
}
}