package net.taehui.twilight.awilight import net.taehui.twilight.awilight.Component.JudgmentAssist.* class Component { var millisLoopUnit = 0.0 var levyingHeight: Double var logicalYMillis = 0.0 private var logicalYLoopUnit = 0.0 var logicalYMeter = 0.0 var millisMeter = 0.0 constructor(bpm: Double, loopUnit: Int) { millisLoopUnit = 1000.0 / loopUnit setBPM(bpm) levyingHeight = STANDARD_HEIGHT - logicalYMillis * LEVYING_WAIT } constructor(bpm: Double) { setBPM(bpm) levyingHeight = STANDARD_HEIGHT - logicalYMillis * LEVYING_WAIT } fun setBPM(bpm: Double) { logicalYMeter = 192.0 millisMeter = 240000.0 / bpm logicalYMillis = logicalYMeter / millisMeter logicalYLoopUnit = millisLoopUnit * logicalYMillis } enum class JudgmentAssist { DEFAULT, LONG_NOTE_UP } enum class InputMode { VOID_0, VOID_1, VOID_2, VOID_3, INPUT_MODE_4, INPUT_MODE_5, INPUT_MODE_6, INPUT_MODE_7, INPUT_MODE_8, INPUT_MODE_9, INPUT_MODE_51, INPUT_MODE_71, INPUT_MODE_102, INPUT_MODE_142, INPUT_MODE_10, INPUT_MODE_242, INPUT_MODE_484; } enum class Judged(val value: Int) { NOT(-1), HIGHEST(0), HIGHER(1), HIGH(2), LOW(3), LOWER(4), LOWEST(5) } enum class NoteVariety { VOID_0, BMS, VOID_2, BMSON, VOID_4, EVENT_NOTE } companion object { const val STANDARD_HEIGHT = 720.0 const val STANDARD_BPM = 130.0 const val STANDARD_METER = 192 const val LEVYING_WAIT = 3000.0 const val QUIT_WAIT = 2000.0 private val JUDGMENT_MAP = arrayOfNulls<DoubleArray>(6) private val IS_IN_2P = arrayOfNulls<BooleanArray>(17) val STAND_MAP = DoubleArray(6) val POINT_MAP = DoubleArray(6) val HIT_POINTS_MAP = DoubleArray(6) val INPUT_COUNTS = IntArray(17) val AUTOABLE_INPUTS = arrayOfNulls<IntArray>(17) val NET_DRAWINGS = arrayOfNulls<IntArray>(17) init { HIT_POINTS_MAP[Judged.HIGHEST.value] = 1.0 HIT_POINTS_MAP[Judged.HIGHER.value] = 0.2 / 3 HIT_POINTS_MAP[Judged.HIGH.value] = 0.1 / 3 HIT_POINTS_MAP[Judged.LOW.value] = 0.1 HIT_POINTS_MAP[Judged.LOWER.value] = 0.0 HIT_POINTS_MAP[Judged.LOWEST.value] = -0.1 / 3 JUDGMENT_MAP[Judged.HIGHEST.value] = doubleArrayOf(-25.0, 25.0) JUDGMENT_MAP[Judged.HIGHER.value] = doubleArrayOf(-60.0, 60.0) JUDGMENT_MAP[Judged.HIGH.value] = doubleArrayOf(-95.0, 95.0) JUDGMENT_MAP[Judged.LOW.value] = doubleArrayOf(-130.0, 130.0) JUDGMENT_MAP[Judged.LOWER.value] = doubleArrayOf(-165.0, 165.0) JUDGMENT_MAP[Judged.LOWEST.value] = doubleArrayOf(-200.0, 200.0) POINT_MAP[Judged.HIGHEST.value] = 1.0 POINT_MAP[Judged.HIGHER.value] = 1.0 POINT_MAP[Judged.HIGH.value] = 0.7 POINT_MAP[Judged.LOW.value] = 0.5 POINT_MAP[Judged.LOWER.value] = 0.3 POINT_MAP[Judged.LOWEST.value] = 0.0 STAND_MAP[Judged.HIGHEST.value] = 1.0 STAND_MAP[Judged.HIGHER.value] = 0.9 STAND_MAP[Judged.HIGH.value] = 0.1 STAND_MAP[Judged.LOW.value] = 0.01 STAND_MAP[Judged.LOWER.value] = 0.0 STAND_MAP[Judged.LOWEST.value] = 0.0 INPUT_COUNTS[InputMode.INPUT_MODE_4.ordinal] = 4 INPUT_COUNTS[InputMode.INPUT_MODE_5.ordinal] = 5 INPUT_COUNTS[InputMode.INPUT_MODE_6.ordinal] = 6 INPUT_COUNTS[InputMode.INPUT_MODE_7.ordinal] = 7 INPUT_COUNTS[InputMode.INPUT_MODE_8.ordinal] = 8 INPUT_COUNTS[InputMode.INPUT_MODE_9.ordinal] = 9 INPUT_COUNTS[InputMode.INPUT_MODE_10.ordinal] = 10 INPUT_COUNTS[InputMode.INPUT_MODE_51.ordinal] = 6 INPUT_COUNTS[InputMode.INPUT_MODE_71.ordinal] = 8 INPUT_COUNTS[InputMode.INPUT_MODE_102.ordinal] = 12 INPUT_COUNTS[InputMode.INPUT_MODE_142.ordinal] = 16 INPUT_COUNTS[InputMode.INPUT_MODE_242.ordinal] = 26 INPUT_COUNTS[InputMode.INPUT_MODE_484.ordinal] = 52 AUTOABLE_INPUTS[InputMode.INPUT_MODE_4.ordinal] = IntArray(0) AUTOABLE_INPUTS[InputMode.INPUT_MODE_5.ordinal] = IntArray(0) AUTOABLE_INPUTS[InputMode.INPUT_MODE_6.ordinal] = IntArray(0) AUTOABLE_INPUTS[InputMode.INPUT_MODE_7.ordinal] = IntArray(0) AUTOABLE_INPUTS[InputMode.INPUT_MODE_8.ordinal] = IntArray(0) AUTOABLE_INPUTS[InputMode.INPUT_MODE_9.ordinal] = IntArray(0) AUTOABLE_INPUTS[InputMode.INPUT_MODE_10.ordinal] = IntArray(0) AUTOABLE_INPUTS[InputMode.INPUT_MODE_51.ordinal] = intArrayOf(1) AUTOABLE_INPUTS[InputMode.INPUT_MODE_71.ordinal] = intArrayOf(1) AUTOABLE_INPUTS[InputMode.INPUT_MODE_102.ordinal] = intArrayOf(1, 12) AUTOABLE_INPUTS[InputMode.INPUT_MODE_142.ordinal] = intArrayOf(1, 16) AUTOABLE_INPUTS[InputMode.INPUT_MODE_242.ordinal] = intArrayOf(1, 26) AUTOABLE_INPUTS[InputMode.INPUT_MODE_484.ordinal] = intArrayOf(1, 2, 51, 52) IS_IN_2P[InputMode.INPUT_MODE_4.ordinal] = BooleanArray(5) IS_IN_2P[InputMode.INPUT_MODE_5.ordinal] = BooleanArray(6) IS_IN_2P[InputMode.INPUT_MODE_6.ordinal] = BooleanArray(7) IS_IN_2P[InputMode.INPUT_MODE_7.ordinal] = BooleanArray(8) IS_IN_2P[InputMode.INPUT_MODE_8.ordinal] = BooleanArray(9) IS_IN_2P[InputMode.INPUT_MODE_9.ordinal] = BooleanArray(10) IS_IN_2P[InputMode.INPUT_MODE_51.ordinal] = BooleanArray(7) IS_IN_2P[InputMode.INPUT_MODE_71.ordinal] = BooleanArray(9) IS_IN_2P[InputMode.INPUT_MODE_102.ordinal] = booleanArrayOf(false, false, false, false, false, false, false, true, true, true, true, true, true) IS_IN_2P[InputMode.INPUT_MODE_142.ordinal] = booleanArrayOf( false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true ) IS_IN_2P[InputMode.INPUT_MODE_242.ordinal] = BooleanArray(27) IS_IN_2P[InputMode.INPUT_MODE_484.ordinal] = BooleanArray(53) val averageColor1 = 65535 val averageColor2 = 4294967295.toInt() val averageColor3 = 4294902015.toInt() val averageColor4 = 16777215 NET_DRAWINGS[InputMode.INPUT_MODE_4.ordinal] = intArrayOf(0, averageColor2, averageColor3, averageColor3, averageColor2) NET_DRAWINGS[InputMode.INPUT_MODE_5.ordinal] = intArrayOf(0, averageColor2, averageColor3, averageColor4, averageColor3, averageColor2) NET_DRAWINGS[InputMode.INPUT_MODE_6.ordinal] = intArrayOf(0, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2) NET_DRAWINGS[InputMode.INPUT_MODE_7.ordinal] = intArrayOf( 0, averageColor2, averageColor3, averageColor2, averageColor4, averageColor2, averageColor3, averageColor2 ) NET_DRAWINGS[InputMode.INPUT_MODE_8.ordinal] = intArrayOf( 0, averageColor2, averageColor3, averageColor2, averageColor3, averageColor3, averageColor2, averageColor3, averageColor2 ) NET_DRAWINGS[InputMode.INPUT_MODE_9.ordinal] = intArrayOf( 0, averageColor2, averageColor3, averageColor2, averageColor3, averageColor4, averageColor3, averageColor2, averageColor3, averageColor2 ) NET_DRAWINGS[InputMode.INPUT_MODE_10.ordinal] = intArrayOf( 0, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2 ) NET_DRAWINGS[InputMode.INPUT_MODE_51.ordinal] = intArrayOf(0, averageColor1, averageColor2, averageColor3, averageColor4, averageColor3, averageColor2) NET_DRAWINGS[InputMode.INPUT_MODE_71.ordinal] = intArrayOf( 0, averageColor1, averageColor2, averageColor3, averageColor2, averageColor4, averageColor2, averageColor3, averageColor2 ) NET_DRAWINGS[InputMode.INPUT_MODE_102.ordinal] = intArrayOf( 0, averageColor1, averageColor2, averageColor3, averageColor4, averageColor3, averageColor2, averageColor2, averageColor3, averageColor4, averageColor3, averageColor2, averageColor1 ) NET_DRAWINGS[InputMode.INPUT_MODE_142.ordinal] = intArrayOf( 0, averageColor1, averageColor2, averageColor3, averageColor2, averageColor4, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2, averageColor4, averageColor2, averageColor3, averageColor2, averageColor1 ) NET_DRAWINGS[InputMode.INPUT_MODE_242.ordinal] = intArrayOf( 0, averageColor1, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor1 ) NET_DRAWINGS[InputMode.INPUT_MODE_484.ordinal] = intArrayOf( 0, averageColor1, averageColor1, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor1, averageColor1 ) } fun getJudgmentMillis(judged: Judged, judgmentStage: Double, i: Int, judgmentAssist: JudgmentAssist): Double { var judgmentMillis = JUDGMENT_MAP[judged.value]!![i] * 10 / (judgmentStage + 10) when (judgmentAssist) { DEFAULT -> Unit LONG_NOTE_UP -> judgmentMillis *= 1.5 } return judgmentMillis } fun getIsJudgment( loopingCounter: Double, judged: Judged, judgmentStage: Double, judgmentAssist: JudgmentAssist ): Boolean { return getJudgmentMillis( judged, judgmentStage, 0, judgmentAssist ) <= loopingCounter && loopingCounter <= getJudgmentMillis(judged, judgmentStage, 1, judgmentAssist) } fun getJudged(judgmentMeter: Double, judgmentStage: Double, judgmentAssist: JudgmentAssist): Judged { if (getIsJudgment(judgmentMeter, Judged.HIGHEST, judgmentStage, judgmentAssist)) { return Judged.HIGHEST } else if (getIsJudgment(judgmentMeter, Judged.HIGHER, judgmentStage, judgmentAssist)) { return Judged.HIGHER } else if (getIsJudgment(judgmentMeter, Judged.HIGH, judgmentStage, judgmentAssist)) { return Judged.HIGH } else if (getIsJudgment(judgmentMeter, Judged.LOW, judgmentStage, judgmentAssist)) { return Judged.LOW } else if (getIsJudgment(judgmentMeter, Judged.LOWER, judgmentStage, judgmentAssist)) { return Judged.LOWER } else if (getIsJudgment(judgmentMeter, Judged.LOWEST, judgmentStage, judgmentAssist)) { return Judged.LOWEST } return Judged.NOT } } }