HexCasting/Common/src/main/java/at/petrak/hexcasting/api/casting/mishaps/MishapDivideByZero.kt

75 lines
2.7 KiB
Kotlin

package at.petrak.hexcasting.api.casting.mishaps
import at.petrak.hexcasting.api.casting.eval.CastingEnvironment
import at.petrak.hexcasting.api.casting.iota.DoubleIota
import at.petrak.hexcasting.api.casting.iota.GarbageIota
import at.petrak.hexcasting.api.casting.iota.Iota
import at.petrak.hexcasting.api.casting.iota.Vec3Iota
import at.petrak.hexcasting.api.pigment.FrozenPigment
import at.petrak.hexcasting.api.utils.asTranslatedComponent
import net.minecraft.network.chat.Component
import net.minecraft.world.item.DyeColor
import net.minecraft.world.phys.Vec3
class MishapDivideByZero(val operand1: Component, val operand2: Component, val suffix: String = "divide") : Mishap() {
override fun accentColor(ctx: CastingEnvironment, errorCtx: Context): FrozenPigment =
dyeColor(DyeColor.RED)
override fun execute(ctx: CastingEnvironment, errorCtx: Context, stack: MutableList<Iota>) {
stack.add(GarbageIota())
ctx.mishapEnvironment.damage(0.5f)
}
override fun errorMessage(ctx: CastingEnvironment, errorCtx: Context) =
error("divide_by_zero.$suffix", operand1, operand2)
companion object {
private const val PREFIX = "hexcasting.mishap.divide_by_zero"
@JvmStatic
fun of(operand1: Iota, operand2: Iota, suffix: String = "divide"): MishapDivideByZero {
if (suffix == "exponent")
return MishapDivideByZero(translate(operand1), powerOf(operand2), suffix)
return MishapDivideByZero(translate(operand1), translate(operand2), suffix)
}
@JvmStatic
fun tan(angle: DoubleIota): MishapDivideByZero {
val translatedAngle = translate(angle)
return MishapDivideByZero(
"$PREFIX.sin".asTranslatedComponent(translatedAngle),
"$PREFIX.cos".asTranslatedComponent(translatedAngle)
)
}
@JvmStatic
val zero
get() = "$PREFIX.zero".asTranslatedComponent
@JvmStatic
val zerothPower
get() = "$PREFIX.zero.power".asTranslatedComponent
@JvmStatic
val zeroVector
get() = "$PREFIX.zero.vec".asTranslatedComponent
@JvmStatic
fun powerOf(power: Component) = "$PREFIX.power".asTranslatedComponent(power)
@JvmStatic
fun powerOf(datum: Iota): Component = when {
datum is DoubleIota && datum.double == 0.0 -> zerothPower
else -> datum.display()
}
@JvmStatic
fun translate(datum: Iota): Component = when {
datum is DoubleIota && datum.double == 0.0 -> zero
datum is Vec3Iota && datum.vec3 == Vec3.ZERO -> zeroVector
else -> datum.display()
}
}
}