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 Judged(val value: Int) { NOT(-1), HIGHEST(0), HIGHER(1), HIGH(2), LOW(3), LOWER(4), LOWEST(5) } companion object { const val INPUT_MODE_4 = 4 const val INPUT_MODE_5 = 5 const val INPUT_MODE_6 = 6 const val INPUT_MODE_7 = 7 const val INPUT_MODE_8 = 8 const val INPUT_MODE_9 = 9 const val INPUT_MODE_51 = 10 const val INPUT_MODE_71 = 11 const val INPUT_MODE_102 = 12 const val INPUT_MODE_142 = 13 const val INPUT_MODE_10 = 14 const val INPUT_MODE_242 = 15 const val INPUT_MODE_484 = 16 const val BMS = 1 const val BMSON = 3 const val EVENT_NOTE = 5 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[INPUT_MODE_4] = 4 INPUT_COUNTS[INPUT_MODE_5] = 5 INPUT_COUNTS[INPUT_MODE_6] = 6 INPUT_COUNTS[INPUT_MODE_7] = 7 INPUT_COUNTS[INPUT_MODE_8] = 8 INPUT_COUNTS[INPUT_MODE_9] = 9 INPUT_COUNTS[INPUT_MODE_10] = 10 INPUT_COUNTS[INPUT_MODE_51] = 6 INPUT_COUNTS[INPUT_MODE_71] = 8 INPUT_COUNTS[INPUT_MODE_102] = 12 INPUT_COUNTS[INPUT_MODE_142] = 16 INPUT_COUNTS[INPUT_MODE_242] = 26 INPUT_COUNTS[INPUT_MODE_484] = 52 AUTOABLE_INPUTS[INPUT_MODE_4] = IntArray(0) AUTOABLE_INPUTS[INPUT_MODE_5] = IntArray(0) AUTOABLE_INPUTS[INPUT_MODE_6] = IntArray(0) AUTOABLE_INPUTS[INPUT_MODE_7] = IntArray(0) AUTOABLE_INPUTS[INPUT_MODE_8] = IntArray(0) AUTOABLE_INPUTS[INPUT_MODE_9] = IntArray(0) AUTOABLE_INPUTS[INPUT_MODE_10] = IntArray(0) AUTOABLE_INPUTS[INPUT_MODE_51] = intArrayOf(1) AUTOABLE_INPUTS[INPUT_MODE_71] = intArrayOf(1) AUTOABLE_INPUTS[INPUT_MODE_102] = intArrayOf(1, 12) AUTOABLE_INPUTS[INPUT_MODE_142] = intArrayOf(1, 16) AUTOABLE_INPUTS[INPUT_MODE_242] = intArrayOf(1, 26) AUTOABLE_INPUTS[INPUT_MODE_484] = intArrayOf(1, 2, 51, 52) IS_IN_2P[INPUT_MODE_4] = BooleanArray(5) IS_IN_2P[INPUT_MODE_5] = BooleanArray(6) IS_IN_2P[INPUT_MODE_6] = BooleanArray(7) IS_IN_2P[INPUT_MODE_7] = BooleanArray(8) IS_IN_2P[INPUT_MODE_8] = BooleanArray(9) IS_IN_2P[INPUT_MODE_9] = BooleanArray(10) IS_IN_2P[INPUT_MODE_51] = BooleanArray(7) IS_IN_2P[INPUT_MODE_71] = BooleanArray(9) IS_IN_2P[INPUT_MODE_102] = booleanArrayOf(false, false, false, false, false, false, false, true, true, true, true, true, true) IS_IN_2P[INPUT_MODE_142] = booleanArrayOf( false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true ) IS_IN_2P[INPUT_MODE_242] = BooleanArray(27) IS_IN_2P[INPUT_MODE_484] = BooleanArray(53) val averageColor1 = 65535 val averageColor2 = 4294967295.toInt() val averageColor3 = 4294902015.toInt() val averageColor4 = 16777215 NET_DRAWINGS[INPUT_MODE_4] = intArrayOf(0, averageColor2, averageColor3, averageColor3, averageColor2) NET_DRAWINGS[INPUT_MODE_5] = intArrayOf(0, averageColor2, averageColor3, averageColor4, averageColor3, averageColor2) NET_DRAWINGS[INPUT_MODE_6] = intArrayOf(0, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2) NET_DRAWINGS[INPUT_MODE_7] = intArrayOf( 0, averageColor2, averageColor3, averageColor2, averageColor4, averageColor2, averageColor3, averageColor2 ) NET_DRAWINGS[INPUT_MODE_8] = intArrayOf( 0, averageColor2, averageColor3, averageColor2, averageColor3, averageColor3, averageColor2, averageColor3, averageColor2 ) NET_DRAWINGS[INPUT_MODE_9] = intArrayOf( 0, averageColor2, averageColor3, averageColor2, averageColor3, averageColor4, averageColor3, averageColor2, averageColor3, averageColor2 ) NET_DRAWINGS[INPUT_MODE_10] = intArrayOf( 0, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2, averageColor3, averageColor2 ) NET_DRAWINGS[INPUT_MODE_51] = intArrayOf(0, averageColor1, averageColor2, averageColor3, averageColor4, averageColor3, averageColor2) NET_DRAWINGS[INPUT_MODE_71] = intArrayOf( 0, averageColor1, averageColor2, averageColor3, averageColor2, averageColor4, averageColor2, averageColor3, averageColor2 ) NET_DRAWINGS[INPUT_MODE_102] = intArrayOf( 0, averageColor1, averageColor2, averageColor3, averageColor4, averageColor3, averageColor2, averageColor2, averageColor3, averageColor4, averageColor3, averageColor2, averageColor1 ) NET_DRAWINGS[INPUT_MODE_142] = intArrayOf( 0, averageColor1, averageColor2, averageColor3, averageColor2, averageColor4, averageColor2, averageColor3, averageColor2, averageColor2, averageColor3, averageColor2, averageColor4, averageColor2, averageColor3, averageColor2, averageColor1 ) NET_DRAWINGS[INPUT_MODE_242] = 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[INPUT_MODE_484] = 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 } } }