Рассчет ежедневных заданий, еженедельных наград и заданий недели

This commit is contained in:
2025-05-19 03:06:07 +03:00
commit e2d91a5d0d
18 changed files with 738 additions and 0 deletions

157
src/main/kotlin/Main.kt Normal file
View 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()
}
}

View 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(),
)
}
}
}