Рассчет ежедневных заданий, еженедельных наград и заданий недели
This commit is contained in:
157
src/main/kotlin/Main.kt
Normal file
157
src/main/kotlin/Main.kt
Normal file
@ -0,0 +1,157 @@
|
||||
import androidx.compose.desktop.ui.tooling.preview.Preview
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.OutlinedTextField
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.darkColorScheme
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.window.Window
|
||||
import androidx.compose.ui.window.application
|
||||
import utils.SliderCard
|
||||
import utils.VSpace
|
||||
import utils.parseInt
|
||||
import kotlin.math.ceil
|
||||
|
||||
const val BATTLE_PASS_MAX_LEVEL = 115
|
||||
const val DAILY_TASKS_XP = 450
|
||||
const val WEEKLY_REWARD_XP = 2250
|
||||
const val WEEKLY_TASKS_XP = 1550
|
||||
|
||||
@Composable
|
||||
@Preview
|
||||
fun App() {
|
||||
MaterialTheme(
|
||||
colorScheme = darkColorScheme(),
|
||||
) {
|
||||
Surface {
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.padding(16.dp),
|
||||
horizontalArrangement = Arrangement.spacedBy(48.dp),
|
||||
) {
|
||||
var daysLeft by remember { mutableStateOf(0) }
|
||||
val weeksLeft = ceil(daysLeft.toFloat() / 7).toInt()
|
||||
var currentLevel by remember { mutableStateOf(0) }
|
||||
|
||||
var dailyTasksDays by remember { mutableStateOf(0) }
|
||||
var weeklyRewardWeeks by remember { mutableStateOf(0) }
|
||||
var weeklyTasksWeeks by remember { mutableStateOf(0) }
|
||||
|
||||
val xp = (
|
||||
DAILY_TASKS_XP * dailyTasksDays
|
||||
+ WEEKLY_REWARD_XP * weeklyRewardWeeks
|
||||
+ WEEKLY_TASKS_XP * weeklyTasksWeeks
|
||||
)
|
||||
|
||||
Column {
|
||||
Text(
|
||||
text = "Исходные значения",
|
||||
style = MaterialTheme.typography.headlineSmall,
|
||||
)
|
||||
|
||||
VSpace(16)
|
||||
|
||||
OutlinedTextField(
|
||||
value = daysLeft.toString(),
|
||||
onValueChange = {
|
||||
daysLeft = parseInt(it)
|
||||
},
|
||||
label = {
|
||||
Text("Дней до завершения события")
|
||||
},
|
||||
)
|
||||
|
||||
VSpace(8)
|
||||
|
||||
OutlinedTextField(
|
||||
value = currentLevel.toString(),
|
||||
onValueChange = {
|
||||
currentLevel = parseInt(it)
|
||||
},
|
||||
label = {
|
||||
Text("Текущий уровень")
|
||||
},
|
||||
)
|
||||
|
||||
VSpace(32)
|
||||
|
||||
Text(
|
||||
text = "${currentLevel + xp.toFloat() / 1000}/$BATTLE_PASS_MAX_LEVEL",
|
||||
style = MaterialTheme.typography.displaySmall,
|
||||
)
|
||||
}
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.verticalScroll(
|
||||
state = rememberScrollState(),
|
||||
)
|
||||
) {
|
||||
Text(
|
||||
text = "Приоритеты заданий",
|
||||
style = MaterialTheme.typography.headlineSmall,
|
||||
)
|
||||
VSpace(8)
|
||||
Text(
|
||||
text = "Расставьте приоритеты на задания, которые вам нравится выполнять",
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
)
|
||||
|
||||
VSpace(32)
|
||||
|
||||
Column(
|
||||
verticalArrangement = Arrangement.spacedBy(8.dp),
|
||||
) {
|
||||
SliderCard(
|
||||
name = "Ежедневные задания",
|
||||
value = dailyTasksDays,
|
||||
onValueChange = {
|
||||
dailyTasksDays = it
|
||||
},
|
||||
valueRange = 0..daysLeft,
|
||||
)
|
||||
|
||||
SliderCard(
|
||||
name = "Еженедельная награда",
|
||||
description = "Для получения еженедельной награды необходимо проходить ежедневные задания",
|
||||
value = weeklyRewardWeeks,
|
||||
onValueChange = {
|
||||
weeklyRewardWeeks = it
|
||||
},
|
||||
valueRange = 0..weeksLeft,
|
||||
)
|
||||
|
||||
SliderCard(
|
||||
name = "Задания недели",
|
||||
value = weeklyTasksWeeks,
|
||||
onValueChange = {
|
||||
weeklyTasksWeeks = it
|
||||
},
|
||||
valueRange = 0..weeksLeft,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun main() = application {
|
||||
Window(onCloseRequest = ::exitApplication) {
|
||||
App()
|
||||
}
|
||||
}
|
67
src/main/kotlin/utils/Compose.kt
Normal file
67
src/main/kotlin/utils/Compose.kt
Normal file
@ -0,0 +1,67 @@
|
||||
package utils
|
||||
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.OutlinedCard
|
||||
import androidx.compose.material3.Slider
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
|
||||
@Composable
|
||||
fun VSpace(
|
||||
height: Int,
|
||||
) {
|
||||
Spacer(
|
||||
modifier = Modifier.height(height.dp)
|
||||
)
|
||||
}
|
||||
|
||||
fun parseInt(
|
||||
value: String,
|
||||
) = value.toIntOrNull() ?: 0
|
||||
|
||||
@Composable
|
||||
fun SliderCard(
|
||||
name: String,
|
||||
description: String? = null,
|
||||
value: Int,
|
||||
onValueChange: (Int) -> Unit,
|
||||
valueRange: IntRange,
|
||||
) {
|
||||
OutlinedCard {
|
||||
Column (
|
||||
modifier = Modifier
|
||||
.padding(
|
||||
horizontal = 16.dp,
|
||||
vertical = 12.dp,
|
||||
),
|
||||
) {
|
||||
Text(
|
||||
text = name,
|
||||
style = MaterialTheme.typography.titleMedium,
|
||||
)
|
||||
description?.let {
|
||||
VSpace(8)
|
||||
Text(
|
||||
text = it,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
)
|
||||
|
||||
}
|
||||
VSpace(8)
|
||||
Slider(
|
||||
value = value.toFloat(),
|
||||
onValueChange = {
|
||||
onValueChange(it.toInt())
|
||||
},
|
||||
steps = valueRange.endInclusive - valueRange.start,
|
||||
valueRange = valueRange.start.toFloat()..valueRange.endInclusive.toFloat(),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user