From a0133a1745d7f59137ccb3c700a167dc2c2e96fa Mon Sep 17 00:00:00 2001 From: NoMathExpectation <85624722+NoMathExpectation@users.noreply.github.com> Date: Mon, 23 Mar 2026 00:24:24 +0800 Subject: [PATCH] Added SetVFXPresetEvent. --- .../rdlevel/rdkt/core/data/ColorOrPalette.kt | 51 +- .../rdkt/core/data/action/VFXPreset.kt | 877 ++++++++++++++++++ .../rdkt/core/events/SetVFXPresetEvent.kt | 24 + 3 files changed, 951 insertions(+), 1 deletion(-) create mode 100644 core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/data/action/VFXPreset.kt create mode 100644 core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/events/SetVFXPresetEvent.kt diff --git a/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/data/ColorOrPalette.kt b/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/data/ColorOrPalette.kt index 2fe7517..5044d02 100644 --- a/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/data/ColorOrPalette.kt +++ b/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/data/ColorOrPalette.kt @@ -9,6 +9,7 @@ import cn.rdlevel.rdkt.core.serialization.TransformSerializer import kotlinx.serialization.Serializable import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.builtins.serializer +import kotlin.jvm.JvmField import kotlin.jvm.JvmName import kotlin.jvm.JvmOverloads import kotlin.jvm.JvmStatic @@ -111,6 +112,28 @@ public sealed interface Color : ColorOrPalette { */ public fun toHex(): String + /** + * Creates a new [Color] instance with the same green and blue components but a different red component. + */ + public fun withRed(red: Int): Color = of(red, green, blue) + + /** + * Creates a new [Color] instance with the same red and blue components but a different green component. + */ + public fun withGreen(green: Int): Color = of(red, green, blue) + + /** + * Creates a new [Color] instance with the same red and green components but a different blue component. + */ + public fun withBlue(blue: Int): Color = of(red, green, blue) + + /** + * Creates a new [ColorWithAlpha] instance with the same red, green, and blue components but a specified alpha component. + * The alpha component is optional and defaults to 255 (fully opaque) if not provided. + */ + @JvmOverloads + public fun withAlpha(alpha: Int = 255): ColorWithAlpha = ColorWithAlpha.of(red, green, blue, alpha) + public object Serializer : PolymorphicDelegatedSerializer(ColorOrPalette.serializer()) public companion object { @@ -151,6 +174,26 @@ public sealed interface ColorWithAlpha : Color, ColorWithAlphaOrPalette { public override fun toHex(): String + /** + * Creates a new [ColorWithAlpha] instance with a different red component. + */ + public override fun withRed(red: Int): ColorWithAlpha = of(red, green, blue, alpha) + + /** + * Creates a new [ColorWithAlpha] instance with a different green component. + */ + public override fun withGreen(green: Int): ColorWithAlpha = of(red, green, blue, alpha) + + /** + * Creates a new [ColorWithAlpha] instance with a different blue component. + */ + public override fun withBlue(blue: Int): ColorWithAlpha = of(red, green, blue, alpha) + + /** + * Creates a new [ColorWithAlpha] instance with a different alpha component. + */ + public override fun withAlpha(alpha: Int): ColorWithAlpha = of(red, green, blue, alpha) + public object Serializer : PolymorphicDelegatedSerializer(ColorWithAlphaOrPalette.serializer()) @@ -290,4 +333,10 @@ public fun colorOf(r: Int, g: Int, b: Int): Color = Color.of(r, g, b) * Creates a [ColorWithAlpha] instance with the specified RGBA components. The alpha component is optional and defaults to 255 (fully opaque) if not provided. */ @JvmName("ofColor") -public fun colorOf(r: Int, g: Int, b: Int, a: Int = 255): ColorWithAlpha = ColorWithAlpha.of(r, g, b, a) \ No newline at end of file +public fun colorOf(r: Int, g: Int, b: Int, a: Int = 255): ColorWithAlpha = ColorWithAlpha.of(r, g, b, a) + +@JvmField +public val WHITE: ColorWithAlpha = colorOf(255, 255, 255, 255) + +@JvmField +public val BLACK: ColorWithAlpha = colorOf(0, 0, 0, 255) \ No newline at end of file diff --git a/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/data/action/VFXPreset.kt b/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/data/action/VFXPreset.kt new file mode 100644 index 0000000..e95e05f --- /dev/null +++ b/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/data/action/VFXPreset.kt @@ -0,0 +1,877 @@ +@file:OptIn(ExperimentalSerializationApi::class) + +package cn.rdlevel.rdkt.core.data.action + +import cn.rdlevel.rdkt.core.annotations.RDDeprecated +import cn.rdlevel.rdkt.core.data.* +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonClassDiscriminator +import kotlin.jvm.JvmField + +@Serializable +@JsonClassDiscriminator("preset") +public sealed interface VFXPreset { + public val rooms: RoomsOrTopLayer + + @Serializable + @SerialName("Vignette") + public class Vignette( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("VignetteFlicker") + public class VignetteFlicker( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("CutsceneMode") + public class CutsceneMode( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("WavyRows") + public class WavyRows( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, SpeedSpecificVFXPreset, + DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var speedPerc: Double? = 100.0 + set(value) { + checkSpeed(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("LightStripVert") + public class LightStripVert( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("SilhouettesOnHBeat") + public class SilhouettesOnHBeat( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("ColourfulShockwaves") + public class ColourfulShockwaves( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("BassDropOnHit") + public class BassDropOnHit( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("ShakeOnHeartBeat") + public class ShakeOnHeartBeat( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("ShakeOnHit") + public class ShakeOnHit( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("NumbersAbovePulses") + public class NumbersAbovePulses( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("FallingPetals") + public class FallingPetals( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("FallingPetalsInstant") + public class FallingPetalsInstant( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("FallingPetalsSnow") + public class FallingPetalsSnow( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("FallingLeaves") + public class FallingLeaves( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("Rain") + public class Rain( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("Snow") + public class Snow( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("Blizzard") + public class Blizzard( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("Embers") + public class Embers( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, ColorSpecificVFXPreset, + DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var color: ColorOrPalette? = DEFAULT_COLOR + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + + public companion object { + @JvmField + public val DEFAULT_COLOR: ColorWithAlpha = colorOf(208, 73, 73, 255) + } + } + + @Serializable + @SerialName("Matrix") + public class Matrix( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("Diamonds") + public class Diamonds( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, ColorSpecificVFXPreset, + DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var color: ColorOrPalette? = DEFAULT_COLOR + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + + public companion object { + @JvmField + public val DEFAULT_COLOR: ColorWithAlpha = WHITE + } + } + + @Serializable + @SerialName("Confetti") + public class Confetti( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("ConfettiBurst") + public class ConfettiBurst( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("Balloons") + public class Balloons( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("VHS") + public class VHS( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("VHSRewind") + public class VHSRewind( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("Scanlines") + public class Scanlines( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("Aberration") + public class Aberration( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("JPEG") + public class JPEG( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("Grain") + public class Grain( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("Blur") + public class Blur( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("Blur") + public class RadialBlur( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, Vector2AmountSpecificVFXPreset, + DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var amount: Vector2 = Vector2.ONE + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("Fisheye") + public class Fisheye( + override var enable: Boolean, + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("HallOfMirrors") + public class HallOfMirrors( + override var enable: Boolean, + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("TileN") + public class TileN( + override var enable: Boolean, + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset, ToggleableVFXPreset, Vector2AmountSpecificVFXPreset, + DurationSpecificVFXPreset { + override var amount: Vector2 = Vector2.ONE + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("CustomScreenScroll") + public class CustomScreenScroll( + override var enable: Boolean, + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset, ToggleableVFXPreset, Vector2SpeedSpecificVFXPreset, + DurationSpecificVFXPreset { + override var xySpeed: Vector2 = Vector2.ZERO + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("ScreenWaves") + public class ScreenWaves( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("HeatDistortion") + public class HeatDistortion( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("Pixelate") + public class Pixelate( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, Vector2AmountSpecificVFXPreset, DurationSpecificVFXPreset { + override var amount: Vector2 = Vector2.ONE + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("Mosaic") + public class Mosaic( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("GlassShatter") + public class GlassShatter( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("GlitchObstruction") + public class GlitchObstruction( + override var enable: Boolean, + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("Noise") + public class Noise( + override var enable: Boolean, + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("HueShift") + public class HueShift( + override var enable: Boolean, + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("Brightness") + public class Brightness( + override var enable: Boolean, + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("Contrast") + public class Contrast( + override var enable: Boolean, + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("Saturation") + public class Saturation( + override var enable: Boolean, + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("BlackAndWhite") + public class BlackAndWhite( + override var enable: Boolean, + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("Sepia") + public class Sepia( + override var enable: Boolean, + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("Bloom") + public class Bloom( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, ThresholdSpecificVFXPreset, IntensitySpecificVFXPreset, + ColorSpecificVFXPreset, DurationSpecificVFXPreset { + override var threshold: Double? = 0.3 + override var intensity: Double? = 5.0 + set(value) { + checkIntensity(value) + field = value + } + override var color: ColorOrPalette? = DEFAULT_COLOR + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + + public companion object { + @JvmField + public val DEFAULT_COLOR: ColorWithAlpha = WHITE + } + } + + @Serializable + @SerialName("OrangeBloom") + public class OrangeBloom( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("BlueBloom") + public class BlueBloom( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("Funk") + public class Funk( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("Drawing") + public class Drawing( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, ColorSpecificVFXPreset, + SpeedSpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var color: ColorOrPalette? = DEFAULT_COLOR + override var speedPerc: Double? = 100.0 + set(value) { + checkSpeed(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + + public companion object { + @JvmField + public val DEFAULT_COLOR: ColorWithAlpha = BLACK + } + } + + @Serializable + @SerialName("Dots") + public class Dots( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + } + + @Serializable + @SerialName("EyesBig") + public class EyesBig( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, ColorSpecificVFXPreset, + Vector2SpeedSpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var color: ColorOrPalette? = DEFAULT_COLOR + override var xySpeed: Vector2 = Vector2.ZERO + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + + public companion object { + @JvmField + public val DEFAULT_COLOR: ColorWithAlpha = WHITE + } + } + + @Serializable + @SerialName("EyesSmall") + public class EyesSmall( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, ColorSpecificVFXPreset, + Vector2SpeedSpecificVFXPreset, DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var color: ColorOrPalette? = DEFAULT_COLOR + override var xySpeed: Vector2 = Vector2.ZERO + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + + public companion object { + @JvmField + public val DEFAULT_COLOR: ColorWithAlpha = WHITE + } + } + + @Serializable + @SerialName("Tutorial") + public class Tutorial( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset, IntensitySpecificVFXPreset, ColorSpecificVFXPreset, + DurationSpecificVFXPreset { + override var intensity: Double? = 100.0 + set(value) { + checkIntensity(value) + field = value + } + override var color: ColorOrPalette? = DEFAULT_COLOR + override var duration: Double = 0.0 + override var ease: Easing = Easing.LINEAR + + public companion object { + @JvmField + public val DEFAULT_COLOR: ColorWithAlpha = WHITE + } + } + + @Serializable + @SerialName("Tile2") + @RDDeprecated + public class Tile2( + override var enable: Boolean, + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("Tile3") + @RDDeprecated + public class Tile3( + override var enable: Boolean, + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("Tile4") + @RDDeprecated + public class Tile4( + override var enable: Boolean, + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("ScreenScrollX") + @RDDeprecated + public class ScreenScrollX( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("ScreenScroll") + @RDDeprecated + public class ScreenScroll( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("ScreenScrollSansVHS") + @RDDeprecated + public class ScreenScrollSansVHS( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("ScreenScrollXSansVHS") + @RDDeprecated + public class ScreenScrollXSansVHS( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("RowGlowWhite") + @RDDeprecated + public class RowGlowWhite( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("RowOutline") + @RDDeprecated + public class RowOutline( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("RowShadow") + @RDDeprecated + public class RowShadow( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("RowAllWhite") + @RDDeprecated + public class RowAllWhite( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("RowSilhouetteGlow") + @RDDeprecated + public class RowSilhouetteGlow( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("RowPlain") + @RDDeprecated + public class RowPlain( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("Blackout") + @RDDeprecated + public class Blackout( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("MiawMiaw") + @RDDeprecated + public class MiawMiaw( + override var enable: Boolean, + override var rooms: Rooms, + ) : RoomsSpecificVFXPreset, ToggleableVFXPreset + + @Serializable + @SerialName("DisableAll") + public class DisableAll( + override var rooms: RoomsOrTopLayer, + ) : RoomsOrTopLayerSpecificVFXPreset +} + +public sealed interface RoomsOrTopLayerSpecificVFXPreset : VFXPreset { + override var rooms: RoomsOrTopLayer +} + +public sealed interface RoomsSpecificVFXPreset : VFXPreset { + override var rooms: Rooms +} + +public sealed interface ToggleableVFXPreset : VFXPreset { + public var enable: Boolean +} + +public sealed interface ThresholdSpecificVFXPreset : VFXPreset { + public var threshold: Double? +} + +public sealed interface IntensitySpecificVFXPreset : VFXPreset { + public var intensity: Double? +} + +private fun IntensitySpecificVFXPreset.checkIntensity(value: Double? = intensity) { + require(value == null || value in -9999.0..9999.0) { "Intensity must be between -9999 and 9999, but was $value." } +} + +public sealed interface ColorSpecificVFXPreset : VFXPreset { + public var color: ColorOrPalette? +} + +public sealed interface Vector2AmountSpecificVFXPreset : VFXPreset { + public var amount: Vector2 +} + +public sealed interface SpeedSpecificVFXPreset : VFXPreset { + public var speedPerc: Double? +} + +private fun SpeedSpecificVFXPreset.checkSpeed(value: Double? = speedPerc) { + require(value == null || value in -9999.0..9999.0) { "Speed must be between -9999 and 9999, but was $value." } +} + +public sealed interface Vector2SpeedSpecificVFXPreset : VFXPreset { + public var xySpeed: Vector2 +} + +public sealed interface DurationSpecificVFXPreset : VFXPreset { + public var duration: Double + public var ease: Easing +} \ No newline at end of file diff --git a/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/events/SetVFXPresetEvent.kt b/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/events/SetVFXPresetEvent.kt new file mode 100644 index 0000000..17c5c4c --- /dev/null +++ b/core/src/commonMain/kotlin/cn/rdlevel/rdkt/core/events/SetVFXPresetEvent.kt @@ -0,0 +1,24 @@ +@file:OptIn(RDKTInternalAPI::class) + +package cn.rdlevel.rdkt.core.events + +import cn.rdlevel.rdkt.core.annotations.RDKTInternalAPI +import cn.rdlevel.rdkt.core.data.RoomsOrTopLayer +import cn.rdlevel.rdkt.core.data.action.VFXPreset +import cn.rdlevel.rdkt.core.serialization.Flatten +import cn.rdlevel.rdkt.core.serialization.flatten +import kotlinx.serialization.* + +@OptIn(ExperimentalSerializationApi::class) +@Serializable(SetVFXPresetEvent.Serializer::class) +@KeepGeneratedSerializer +@SerialName("SetVFXPreset") +public data class SetVFXPresetEvent( + @Flatten + var vfxPreset: VFXPreset +) : ActionEvent(), RoomsOrTopLayerSpecificEvent { + override val rooms: RoomsOrTopLayer + get() = vfxPreset.rooms + + public object Serializer : KSerializer by generatedSerializer().flatten() +} \ No newline at end of file