Added SetBackgroundColorEvent.

This commit is contained in:
2026-07-01 22:09:28 +08:00
parent 71c1ed05fc
commit 491e96ec86
5 changed files with 194 additions and 0 deletions
@@ -0,0 +1,40 @@
package cn.rdlevel.rdkt.core.data.action
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
/**
* Represents how the content will be rescaled in [SetBackgroundColorEvent][cn.rdlevel.rdkt.core.events.SetBackgroundColorEvent].
*/
@Serializable
public enum class ContentMode {
/**
* Rescale the content to fill the space.
*/
@SerialName("ScaleToFill")
SCALE_TO_FILL,
/**
* Rescale the content to fit the space while maintaining its aspect ratio.
*/
@SerialName("AspectFit")
ASPECT_FIT,
/**
* Rescale the content to fill the space while maintaining its aspect ratio.
*/
@SerialName("AspectFill")
ASPECT_FILL,
/**
* Center the content in the space.
*/
@SerialName("Center")
CENTER,
/**
* Tile the content in the space.
*/
@SerialName("Tiled")
TILED,
}
@@ -0,0 +1,22 @@
package cn.rdlevel.rdkt.core.data.action
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
/**
* Represent how to render the image when the image is rescaled.
*/
@Serializable
public enum class RescaleFilter {
/**
* The color of the rescaled pixel will be the nearest neighbor's.
*/
@SerialName("NearestNeighbor")
NEAREST_NEIGHBOR,
/**
* The color of the rescaled pixel will be a weighted average of the nearest neighbors.
*/
@SerialName("Bilinear")
BILINEAR,
}
@@ -0,0 +1,36 @@
package cn.rdlevel.rdkt.core.data.action
import cn.rdlevel.rdkt.core.data.Easing
import cn.rdlevel.rdkt.core.data.Vector2
import cn.rdlevel.rdkt.core.data.vectorOf
import kotlinx.serialization.Serializable
/**
* Represents how the content should be tiled.
*
* @property tilingType The type of tiling to apply.
* @property scrollX The X component of the scroll speed of the tiling in px.
* @property scrollY The Y component of the scroll speed of the tiling in px.
* @property duration The duration of the tiling animation change in beats.
* @property interval The interval between pulses in beats when [tilingType] is [TilingType.PULSE].
* @property ease The easing function for the tiling animation change.
*/
@Serializable
public data class TilingConfig(
var tilingType: TilingType = TilingType.SCROLL,
var scrollX: Double = 0.0,
var scrollY: Double = 0.0,
var duration: Double = 0.0,
var interval: Double = 1.0,
var ease: Easing = Easing.LINEAR,
) {
/**
* The scroll speed of the tiling in px.
*/
var scroll: Vector2
get() = vectorOf(scrollX, scrollY)
set(value) {
scrollX = value.x
scrollY = value.y
}
}
@@ -0,0 +1,22 @@
package cn.rdlevel.rdkt.core.data.action
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
/**
* Represents the tiling type of tiled content.
*/
@Serializable
public enum class TilingType {
/**
* The content will be scrolling.
*/
@SerialName("Scroll")
SCROLL,
/**
* The content will be pulsing repeatedly.
*/
@SerialName("Pulse")
PULSE,
}
@@ -0,0 +1,74 @@
@file:OptIn(RDKTInternalAPI::class, ExperimentalSerializationApi::class)
package cn.rdlevel.rdkt.core.events
import cn.rdlevel.rdkt.core.annotations.RDKTInternalAPI
import cn.rdlevel.rdkt.core.data.*
import cn.rdlevel.rdkt.core.data.action.ContentMode
import cn.rdlevel.rdkt.core.data.action.RescaleFilter
import cn.rdlevel.rdkt.core.data.action.TilingConfig
import cn.rdlevel.rdkt.core.serialization.Flatten
import cn.rdlevel.rdkt.core.serialization.flatten
import kotlinx.serialization.*
import kotlinx.serialization.json.JsonClassDiscriminator
/**
* Sets the background of rooms.
* @property type The type of the background.
* @property filter How should the pixels' color of the background be when rescaled.
*/
@ConsistentCopyVisibility
@Serializable(SetBackgroundColorEvent.Serializer::class)
@KeepGeneratedSerializer
@SerialName("SetBackgroundColor")
public data class SetBackgroundColorEvent private constructor(
@Flatten
private var type: Type,
var filter: RescaleFilter = RescaleFilter.NEAREST_NEIGHBOR,
override val rooms: RoomsOrTopLayer = roomsOf(ROOM1),
) : ActionEvent(), RoomsOrTopLayerSpecificEvent {
/**
* Represents the type and the settings of the background.
*/
@Serializable
@JsonClassDiscriminator("backgroundType")
public sealed class Type {
/**
* The color of the background.
*/
public abstract var color: ColorWithAlpha
/**
* Represents a pure color background.
*/
@SerialName("Color")
@Serializable
public data class Color(override var color: ColorWithAlpha = WHITE) : Type()
/**
* Represents a background with images.
*
* @property image The images to be used. When there's none, it clears the image background. When there are multiple, they will be played in a loop.
* @property color The color filter to be applied on images.
* @property fps The speed of the image loop in frames per second when there are multiple images.
* @property contentMode The content mode of the images.
* @property tilingConfig The tiling configuration of the images when [contentMode] is [ContentMode.TILED].
*/
@SerialName("Image")
@Serializable(Image.Serializer::class)
@KeepGeneratedSerializer
public data class Image(
var image: List<String> = listOf(),
override var color: ColorWithAlpha = WHITE,
var fps: Double = 30.0,
var contentMode: ContentMode = ContentMode.SCALE_TO_FILL,
@Flatten
var tilingConfig: TilingConfig = TilingConfig()
) : Type() {
public object Serializer : KSerializer<Image> by generatedSerializer().flatten()
}
}
public object Serializer : KSerializer<SetBackgroundColorEvent> by generatedSerializer().flatten()
}