Added AddFreeTimeBeatEvent and PulseFreeTimeBeatEvent.

This commit is contained in:
2026-03-07 23:07:31 +08:00
parent 51b0454fbc
commit f6d02dfcd9
2 changed files with 130 additions and 0 deletions
@@ -0,0 +1,40 @@
package cn.rdlevel.rdkt.core.events
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
/**
* Adds a freetime beat to the row.
*/
@Serializable
@SerialName("AddFreeTimeBeat")
public class AddFreeTimeBeatEvent() : RowEvent() {
/**
* The start pulse of the freetime beat. It must be between 0 and 6, where 0 is the first pulse.
*/
public var pulse: Int = 0
set(value) {
require(value in 0..6) { "Pulse must be between 0 and 6, but found: $value." }
field = value
}
/**
* The hold time this pulse will last in beats. 0 means disable the hold.
*/
public var hold: Double = 0.0
public constructor(
pulse: Int,
hold: Double,
) : this() {
this.pulse = pulse
this.hold = hold
}
public constructor(
pulse: Int,
) : this() {
this.pulse = pulse
}
}
@@ -0,0 +1,90 @@
@file:OptIn(RDKTInternalAPI::class)
package cn.rdlevel.rdkt.core.events
import cn.rdlevel.rdkt.core.annotations.RDKTInternalAPI
import cn.rdlevel.rdkt.core.serialization.TransformSerializer
import kotlinx.serialization.Serializable
import kotlin.jvm.JvmOverloads
/**
* Advance or modify existing freetime beat on the specified row.
*
* @property action The action to perform on the freetime beat.
* @property hold The hold time this pulse will last in beats. 0 means disable the hold.
*/
@Serializable(PulseFreeTimeBeatEvent.Serializer::class)
public data class PulseFreeTimeBeatEvent @JvmOverloads constructor(
var action: Action = Action.Increment,
var hold: Int = 0,
) : RowEvent() {
/**
* Represents the action to perform on the freetime beat.
*/
public sealed class Action(public val action: String) {
/**
* Advance the pulse of the freetime beat by 1.
*/
public object Increment : Action("Increment")
/**
* Retreat the pulse of the freetime beat by 1.
*/
public object Decrement : Action("Decrement")
/**
* Set the pulse of the freetime beat to a specific value.
*
* @property pulse The pulse to set the freetime beat to. It must be between 0 and 6, where 0 is the first pulse.
*/
public class Custom(pulse: Int) : Action("Custom") {
public var pulse: Int = pulse
set(value) {
require(value in 0..6) { "Pulse must be between 0 and 6, but found: $value." }
field = value
}
init {
this.pulse = pulse
}
}
/**
* Remove the freetime beat.
*/
public object Remove : Action("Remove")
}
public object Serializer : TransformSerializer<PulseFreeTimeBeatEvent, Serializer.Data>(Data.serializer()) {
override fun toData(value: PulseFreeTimeBeatEvent): Data {
return Data(
action = value.action.action,
hold = value.hold,
customPulse = (value.action as? Action.Custom)?.pulse,
)
}
override fun fromData(data: Data): PulseFreeTimeBeatEvent {
val action = when (data.action) {
"Increment" -> Action.Increment
"Decrement" -> Action.Decrement
"Custom" -> Action.Custom(data.customPulse ?: error("Custom action requires customPulse value."))
"Remove" -> Action.Remove
else -> throw IllegalArgumentException("Unknown action: ${data.action}")
}
return PulseFreeTimeBeatEvent(
action = action,
hold = data.hold,
)
}
@RDKTInternalAPI
@Serializable
public data class Data(
var action: String = "Increment",
var hold: Int = 0,
var customPulse: Int? = null,
)
}
}