diff --git a/Common/src/main/java/at/petrak/hexcasting/api/casting/ActionUtils.kt b/Common/src/main/java/at/petrak/hexcasting/api/casting/ActionUtils.kt index e8342cc3b..0ab2799c2 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/casting/ActionUtils.kt +++ b/Common/src/main/java/at/petrak/hexcasting/api/casting/ActionUtils.kt @@ -290,15 +290,17 @@ fun List.getLongOrList(idx: Int, argc: Int = 0): Either> = - when (datum) { +fun List.getEvaluatable(idx: Int, argc: Int = 0): Either> { + val datum = this.getOrElse(idx) { throw MishapNotEnoughArgs(idx + 1, this.size) } + return when (datum) { is ListIota -> Either.right(datum.list) - else -> if (datum.executable()) Either.left(datum) else throw MishapInvalidIota( + else -> if (datum.executable()) Either.left(datum) else throw MishapInvalidIota.of( datum, - reverseIdx, - "hexcasting.mishap.invalid_value.evaluatable".asTranslatedComponent + if (argc == 0) idx else argc - (idx + 1), + "evaluatable" ) } +} fun Iota?.orNull() = this ?: NullIota() diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/OpEval.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/OpEval.kt index 940320423..03e36713b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/OpEval.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/OpEval.kt @@ -7,22 +7,27 @@ import at.petrak.hexcasting.api.casting.eval.vm.CastingImage import at.petrak.hexcasting.api.casting.eval.vm.FrameEvaluate import at.petrak.hexcasting.api.casting.eval.vm.FrameFinishEval import at.petrak.hexcasting.api.casting.eval.vm.SpellContinuation -import at.petrak.hexcasting.api.casting.evaluatable +import at.petrak.hexcasting.api.casting.getEvaluatable import at.petrak.hexcasting.api.casting.iota.Iota import at.petrak.hexcasting.api.casting.mishaps.MishapNotEnoughArgs import at.petrak.hexcasting.api.utils.TreeList import at.petrak.hexcasting.common.lib.hex.HexEvalSounds +import com.mojang.datafixers.util.Either object OpEval : Action { override fun operate(env: CastingEnvironment, image: CastingImage, continuation: SpellContinuation): OperationResult { val stack = image.stack - val iota = stack.lastOrNull() ?: throw MishapNotEnoughArgs(1, 0) - return exec(env, image, continuation, stack.init(), iota) + + if (stack.isEmpty()) + throw MishapNotEnoughArgs(1, 0) + + val instrs = stack.getEvaluatable(stack.lastIndex, stack.size) + + return exec(env, image, continuation, stack.init(), instrs) } - fun exec(env: CastingEnvironment, image: CastingImage, continuation: SpellContinuation, newStack: TreeList, iota: Iota): OperationResult { + fun exec(env: CastingEnvironment, image: CastingImage, continuation: SpellContinuation, newStack: TreeList, instrs: Either>): OperationResult { // also, never make a break boundary when evaluating just one pattern - val instrs = evaluatable(iota, 0) val newCont = if (instrs.left().isPresent || (continuation is SpellContinuation.NotDone && continuation.frame is FrameFinishEval)) { continuation diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/OpEvalBreakable.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/OpEvalBreakable.kt index 0646c3ea0..f825ad594 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/OpEvalBreakable.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/OpEvalBreakable.kt @@ -5,6 +5,7 @@ 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.getEvaluatable import at.petrak.hexcasting.api.casting.iota.ContinuationIota import at.petrak.hexcasting.api.casting.mishaps.MishapNotEnoughArgs @@ -13,7 +14,13 @@ object OpEvalBreakable : Action { image: CastingImage, continuation: SpellContinuation): OperationResult { val stack = image.stack - val iota = stack.lastOrNull() ?: throw MishapNotEnoughArgs(1, 0) - return OpEval.exec(env, image, continuation, stack.init().appended(ContinuationIota(continuation)), iota) + + if (stack.isEmpty()) + throw MishapNotEnoughArgs(1, 0) + + val instrs = stack.getEvaluatable(stack.lastIndex, stack.size) + + val newStack = stack.init().appended(ContinuationIota(continuation)) + return OpEval.exec(env, image, continuation, newStack, instrs) } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/SpecialHandlerForEach.kt b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/SpecialHandlerForEach.kt index d4f788acb..97e9b0293 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/SpecialHandlerForEach.kt +++ b/Common/src/main/java/at/petrak/hexcasting/common/casting/actions/eval/SpecialHandlerForEach.kt @@ -8,7 +8,7 @@ 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.FrameForEach import at.petrak.hexcasting.api.casting.eval.vm.SpellContinuation -import at.petrak.hexcasting.api.casting.evaluatable +import at.petrak.hexcasting.api.casting.getEvaluatable import at.petrak.hexcasting.api.casting.getList import at.petrak.hexcasting.api.casting.math.HexPattern import at.petrak.hexcasting.api.casting.mishaps.MishapNotEnoughArgs @@ -39,7 +39,7 @@ class SpecialHandlerForEach(val n: Int) : SpecialHandler { throw MishapNotEnoughArgs(2 + n, stack.size) val datums = stack.getList(stack.lastIndex - 1, stack.size) - val instrs = evaluatable(stack[stack.lastIndex], 0) + val instrs = stack.getEvaluatable(stack.lastIndex, stack.size) stack = stack.dropRight(2) val instrList = instrs.map({ TreeList.from(listOf(it)) }, { it })