diff --git a/app/src/main/assets/items.db b/app/src/main/assets/items.db index 80a883b..b67ef1d 100644 Binary files a/app/src/main/assets/items.db and b/app/src/main/assets/items.db differ diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt b/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt index 114e946..16ae708 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/components/CharacterEntry.kt @@ -5,11 +5,14 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -28,6 +31,9 @@ import com.github.nacabaro.vbhelper.utils.getBitmap import androidx.compose.ui.graphics.Shape import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight +import com.github.cfogrady.vbnfc.vb.SpecialMission +import com.github.nacabaro.vbhelper.R +import com.github.nacabaro.vbhelper.domain.device_data.SpecialMissions import com.github.nacabaro.vbhelper.utils.getObscuredBitmap @Composable @@ -114,4 +120,90 @@ fun ItemDisplay( ) } } +} + +@Composable +fun SpecialMissionsEntry( + specialMission: SpecialMissions, + modifier: Modifier = Modifier, + onClickCard: () -> Unit = { }, +) { + val textValue = when (specialMission.missionType) { + SpecialMission.Type.NONE -> "No mission selected" + SpecialMission.Type.STEPS -> "Walk ${specialMission.goal} steps" + SpecialMission.Type.BATTLES -> "Battle ${specialMission.goal} times" + SpecialMission.Type.WINS -> "Win ${specialMission.goal} battles" + SpecialMission.Type.VITALS -> "Earn ${specialMission.goal} vitals" + } + + val progress = if (specialMission.status == SpecialMission.Status.COMPLETED) { + specialMission.goal + } else { + specialMission.progress + } + + val completion = when (specialMission.missionType) { + SpecialMission.Type.NONE -> "" + SpecialMission.Type.STEPS -> "Walked $progress steps" + SpecialMission.Type.BATTLES -> "Battled $progress times" + SpecialMission.Type.WINS -> "Won $progress battles" + SpecialMission.Type.VITALS -> "Earned $progress vitals" + } + + val icon = when (specialMission.missionType) { + SpecialMission.Type.NONE -> R.drawable.baseline_free_24 + SpecialMission.Type.STEPS -> R.drawable.baseline_agility_24 + SpecialMission.Type.BATTLES -> R.drawable.baseline_swords_24 + SpecialMission.Type.WINS -> R.drawable.baseline_trophy_24 + SpecialMission.Type.VITALS -> R.drawable.baseline_vitals_24 + } + + val color = when (specialMission.status) + { + SpecialMission.Status.IN_PROGRESS -> MaterialTheme.colorScheme.secondary + SpecialMission.Status.COMPLETED -> MaterialTheme.colorScheme.primary + SpecialMission.Status.FAILED -> MaterialTheme.colorScheme.error + else -> MaterialTheme.colorScheme.surfaceContainerHighest + } + + Card( + modifier = modifier, + shape = androidx.compose.material.MaterialTheme.shapes.small, + onClick = if (specialMission.status == SpecialMission.Status.COMPLETED) { + onClickCard + } else { + { } + }, + colors = CardDefaults.cardColors( + containerColor = color + ) + + ) { + Row ( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + modifier = Modifier + .fillMaxSize() + .padding(16.dp) + ) { + Icon( + painter = painterResource(icon), + contentDescription = "Vitals", + modifier = Modifier + .fillMaxHeight() + .padding(16.dp) + ) + Column { + Text( + text = textValue, + fontFamily = MaterialTheme.typography.titleLarge.fontFamily, + fontWeight = FontWeight.Bold, + ) + Text( + text = completion, + fontFamily = MaterialTheme.typography.titleSmall.fontFamily, + ) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/ItemDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/ItemDao.kt index a655369..1164815 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/daos/ItemDao.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/ItemDao.kt @@ -31,7 +31,7 @@ interface ItemDao { WHERE Items.id = :itemId """ ) - fun getItem(itemId: Long): ItemDtos.ItemsWithQuantities + suspend fun getItem(itemId: Long): ItemDtos.ItemsWithQuantities @Query( """ @@ -40,7 +40,7 @@ interface ItemDao { WHERE id = :itemId """ ) - fun useItem(itemId: Long) + suspend fun useItem(itemId: Long) @Query( """ diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/SpecialMissionDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/SpecialMissionDao.kt new file mode 100644 index 0000000..7dc5c74 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/SpecialMissionDao.kt @@ -0,0 +1,15 @@ +package com.github.nacabaro.vbhelper.daos + +import androidx.room.Dao +import androidx.room.Query + +@Dao +interface SpecialMissionDao { + @Query(""" + UPDATE SpecialMissions SET + missionType = "NONE", + status = "UNAVAILABLE" + WHERE id = :id + """) + suspend fun clearSpecialMission(id: Long) +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt index 39d43ee..352f180 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt @@ -34,7 +34,7 @@ interface UserCharacterDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertTransformationHistory(vararg transformationHistory: TransformationHistory) - @Insert + @Upsert fun insertSpecialMissions(vararg specialMissions: SpecialMissions) @Query(""" @@ -172,4 +172,54 @@ interface UserCharacterDao { @Query("""SELECT * FROM VitalsHistory WHERE charId = :charId ORDER BY id ASC""") suspend fun getVitalsHistory(charId: Long): List + + @Query( + """ + SELECT + uc.*, + c.stage, + c.attribute, + s.spriteIdle1 AS spriteIdle, + s.spriteIdle2 AS spriteIdle2, + s.width AS spriteWidth, + s.height AS spriteHeight, + c.name as nameSprite, + c.nameWidth as nameSpriteWidth, + c.nameHeight as nameSpriteHeight, + d.isBEm as isBemCard, + a.characterId = uc.id as isInAdventure + FROM UserCharacter uc + JOIN Character c ON uc.charId = c.id + JOIN Card d ON d.id = c.dimId + JOIN Sprite s ON s.id = c.spriteId + LEFT JOIN Adventure a ON a.characterId = uc.id + WHERE d.isBEm = 1 + """ + ) + suspend fun getBEBemCharacters(): List + + @Query( + """ + SELECT + uc.*, + c.stage, + c.attribute, + s.spriteIdle1 AS spriteIdle, + s.spriteIdle2 AS spriteIdle2, + s.width AS spriteWidth, + s.height AS spriteHeight, + c.name as nameSprite, + c.nameWidth as nameSpriteWidth, + c.nameHeight as nameSpriteHeight, + d.isBEm as isBemCard, + a.characterId = uc.id as isInAdventure + FROM UserCharacter uc + JOIN Character c ON uc.charId = c.id + JOIN Card d ON d.id = c.dimId + JOIN Sprite s ON s.id = c.spriteId + LEFT JOIN Adventure a ON a.characterId = uc.id + WHERE uc.characterType = "VBDevice" + """ + ) + suspend fun getVBDimCharacters(): List } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt b/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt index 1cd5dfe..0f963ce 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt @@ -8,6 +8,7 @@ import com.github.nacabaro.vbhelper.daos.DexDao import com.github.nacabaro.vbhelper.daos.CardDao import com.github.nacabaro.vbhelper.daos.CardProgressDao import com.github.nacabaro.vbhelper.daos.ItemDao +import com.github.nacabaro.vbhelper.daos.SpecialMissionDao import com.github.nacabaro.vbhelper.daos.SpriteDao import com.github.nacabaro.vbhelper.daos.UserCharacterDao import com.github.nacabaro.vbhelper.domain.characters.Character @@ -51,4 +52,5 @@ abstract class AppDatabase : RoomDatabase() { abstract fun itemDao(): ItemDao abstract fun adventureDao(): AdventureDao abstract fun spriteDao(): SpriteDao + abstract fun specialMissionDao(): SpecialMissionDao } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/items/Items.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/items/Items.kt index 18dfc68..3a7747e 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/items/Items.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/items/Items.kt @@ -3,6 +3,13 @@ package com.github.nacabaro.vbhelper.domain.items import androidx.room.Entity import androidx.room.PrimaryKey +enum class ItemType { + VBITEM, + BEITEM, + UNIVERSAL, + SPECIALMISSION +} + @Entity data class Items( @PrimaryKey val id: Long, @@ -11,5 +18,6 @@ data class Items( val itemIcon: Int, val itemLength: Int, val price: Int, - val quantity: Int + val quantity: Int, + val itemType: ItemType ) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/dtos/ItemDtos.kt b/app/src/main/java/com/github/nacabaro/vbhelper/dtos/ItemDtos.kt index e2e7df6..4738280 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/dtos/ItemDtos.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/dtos/ItemDtos.kt @@ -1,5 +1,7 @@ package com.github.nacabaro.vbhelper.dtos +import com.github.nacabaro.vbhelper.domain.items.ItemType + object ItemDtos { data class ItemsWithQuantities( @@ -10,6 +12,7 @@ object ItemDtos { val itemLength: Int, val price: Int, val quantity: Int, + val itemType: ItemType ) data class PurchasedItem( @@ -18,6 +21,7 @@ object ItemDtos { val itemDescription: String, val itemIcon: Int, val itemLength: Int, - val itemAmount: Int + val itemAmount: Int, + val itemType: ItemType ) } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreenControllerImpl.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreenControllerImpl.kt index b775728..535d1f4 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreenControllerImpl.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreenControllerImpl.kt @@ -94,7 +94,8 @@ class AdventureScreenControllerImpl( itemName = randomItem.name, itemIcon = randomItem.itemIcon, itemLength = randomItem.itemLength, - itemDescription = randomItem.description + itemDescription = randomItem.description, + itemType = randomItem.itemType ) } } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreen.kt index b0ca324..4a5d3a0 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreen.kt @@ -28,9 +28,15 @@ import com.github.nacabaro.vbhelper.components.TopBanner import com.github.nacabaro.vbhelper.di.VBHelper import com.github.nacabaro.vbhelper.utils.DeviceType import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData +import com.github.nacabaro.vbhelper.domain.device_data.SpecialMissions import com.github.nacabaro.vbhelper.domain.device_data.VBCharacterData import com.github.nacabaro.vbhelper.dtos.CharacterDtos +import com.github.nacabaro.vbhelper.dtos.ItemDtos import com.github.nacabaro.vbhelper.navigation.NavigationItems +import com.github.nacabaro.vbhelper.screens.homeScreens.screens.BEBEmHomeScreen +import com.github.nacabaro.vbhelper.screens.homeScreens.screens.BEDiMHomeScreen +import com.github.nacabaro.vbhelper.screens.homeScreens.screens.VBDiMHomeScreen +import com.github.nacabaro.vbhelper.screens.itemsScreen.ObtainedItemDialog import com.github.nacabaro.vbhelper.source.StorageRepository import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -46,10 +52,12 @@ fun HomeScreen( val transformationHistory = remember { mutableStateOf?>(null) } val beData = remember { mutableStateOf(null) } val vbData = remember { mutableStateOf(null) } + val vbSpecialMissions = remember { mutableStateOf>(emptyList()) } var adventureMissionsFinished by rememberSaveable { mutableStateOf(false) } var betaWarning by rememberSaveable { mutableStateOf(true) } + var collectedItem by remember { mutableStateOf(null) } - LaunchedEffect(storageRepository, activeMon) { + LaunchedEffect(storageRepository, activeMon, collectedItem) { withContext(Dispatchers.IO) { activeMon.value = storageRepository.getActiveCharacter() if (activeMon.value != null && activeMon.value!!.characterType == DeviceType.BEDevice) { @@ -57,6 +65,7 @@ fun HomeScreen( transformationHistory.value = storageRepository.getTransformationHistory(activeMon.value!!.id) } else if (activeMon.value != null && activeMon.value!!.characterType == DeviceType.VBDevice) { vbData.value = storageRepository.getCharacterVbData(activeMon.value!!.id) + vbSpecialMissions.value = storageRepository.getSpecialMissions(activeMon.value!!.id) transformationHistory.value = storageRepository.getTransformationHistory(activeMon.value!!.id) } } @@ -114,12 +123,26 @@ fun HomeScreen( activeMon = activeMon.value!!, vbData = vbData.value!!, transformationHistory = transformationHistory.value!!, - contentPadding = contentPadding + contentPadding = contentPadding, + specialMissions = vbSpecialMissions.value, + homeScreenController = homeScreenController, + onClickCollect = { item -> + collectedItem = item + } ) } } } + if (collectedItem != null) { + ObtainedItemDialog( + obtainedItem = collectedItem!!, + onClickDismiss = { + collectedItem = null + } + ) + } + if (adventureMissionsFinished) { Dialog( onDismissRequest = { adventureMissionsFinished = false }, diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreenController.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreenController.kt index b524ba2..52572ce 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreenController.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreenController.kt @@ -1,5 +1,8 @@ package com.github.nacabaro.vbhelper.screens.homeScreens +import com.github.nacabaro.vbhelper.dtos.ItemDtos + interface HomeScreenController { fun didAdventureMissionsFinish(onCompletion: (Boolean) -> Unit) + fun clearSpecialMission(missionId: Long, onCleared: (ItemDtos.PurchasedItem) -> Unit) } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreenControllerImpl.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreenControllerImpl.kt index a38bf0b..89fbdd0 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreenControllerImpl.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreenControllerImpl.kt @@ -3,8 +3,11 @@ package com.github.nacabaro.vbhelper.screens.homeScreens import androidx.activity.ComponentActivity import androidx.lifecycle.lifecycleScope import com.github.nacabaro.vbhelper.di.VBHelper +import com.github.nacabaro.vbhelper.dtos.ItemDtos import kotlinx.coroutines.launch import java.time.Instant +import kotlin.math.roundToInt +import kotlin.random.Random class HomeScreenControllerImpl( private val componentActivity: ComponentActivity, @@ -26,4 +29,38 @@ class HomeScreenControllerImpl( onCompletion(finishedAdventureCharacters.isNotEmpty()) } } + + override fun clearSpecialMission(missionId: Long, onCleared: (ItemDtos.PurchasedItem) -> Unit) { + componentActivity.lifecycleScope.launch { + database + .specialMissionDao() + .clearSpecialMission(missionId) + + val randomItem = database + .itemDao() + .getAllItems() + .random() + + val randomItemAmount = (Random.nextFloat() * 5).roundToInt() + + database + .itemDao() + .purchaseItem( + itemId = randomItem.id, + itemAmount = randomItemAmount + ) + + val purchasedItem = ItemDtos.PurchasedItem( + itemId = randomItem.id, + itemName = randomItem.name, + itemDescription = randomItem.description, + itemIcon = randomItem.itemIcon, + itemLength = randomItem.itemLength, + itemAmount = randomItemAmount, + itemType = randomItem.itemType + ) + + onCleared(purchasedItem) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEBEmHomeScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/screens/BEBEmHomeScreen.kt similarity index 99% rename from app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEBEmHomeScreen.kt rename to app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/screens/BEBEmHomeScreen.kt index 344ecc5..a35d577 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEBEmHomeScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/screens/BEBEmHomeScreen.kt @@ -1,4 +1,4 @@ -package com.github.nacabaro.vbhelper.screens.homeScreens +package com.github.nacabaro.vbhelper.screens.homeScreens.screens import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEDiMHomeScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/screens/BEDiMHomeScreen.kt similarity index 99% rename from app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEDiMHomeScreen.kt rename to app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/screens/BEDiMHomeScreen.kt index 05b250b..065b6c6 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BEDiMHomeScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/screens/BEDiMHomeScreen.kt @@ -1,4 +1,4 @@ -package com.github.nacabaro.vbhelper.screens.homeScreens +package com.github.nacabaro.vbhelper.screens.homeScreens.screens import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/VBDiMHomeScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/screens/VBDiMHomeScreen.kt similarity index 81% rename from app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/VBDiMHomeScreen.kt rename to app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/screens/VBDiMHomeScreen.kt index a91bd7a..22e67b8 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/VBDiMHomeScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/screens/VBDiMHomeScreen.kt @@ -1,4 +1,4 @@ -package com.github.nacabaro.vbhelper.screens.homeScreens +package com.github.nacabaro.vbhelper.screens.homeScreens.screens import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -8,15 +8,21 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import com.github.nacabaro.vbhelper.R import com.github.nacabaro.vbhelper.components.CharacterEntry import com.github.nacabaro.vbhelper.components.ItemDisplay +import com.github.nacabaro.vbhelper.components.SpecialMissionsEntry import com.github.nacabaro.vbhelper.components.TransformationHistoryCard +import com.github.nacabaro.vbhelper.domain.device_data.SpecialMissions import com.github.nacabaro.vbhelper.domain.device_data.VBCharacterData import com.github.nacabaro.vbhelper.dtos.CharacterDtos +import com.github.nacabaro.vbhelper.dtos.ItemDtos +import com.github.nacabaro.vbhelper.screens.homeScreens.HomeScreenControllerImpl import com.github.nacabaro.vbhelper.utils.BitmapData import java.util.Locale @@ -24,8 +30,11 @@ import java.util.Locale fun VBDiMHomeScreen( activeMon: CharacterDtos.CharacterWithSprites, vbData: VBCharacterData, + specialMissions: List, + homeScreenController: HomeScreenControllerImpl, transformationHistory: List, - contentPadding: PaddingValues + contentPadding: PaddingValues, + onClickCollect: (ItemDtos.PurchasedItem) -> Unit ) { Column( modifier = Modifier @@ -151,5 +160,30 @@ fun VBDiMHomeScreen( .padding(8.dp) ) } + Row ( + modifier = Modifier + .padding(16.dp) + ) { + Text( + text = "Special missions", + fontSize = 24.sp + ) + } + for (mission in specialMissions) { + Row( + modifier = Modifier + .fillMaxWidth() + ) { + SpecialMissionsEntry( + specialMission = mission, + modifier = Modifier + .weight(1f) + .padding(8.dp), + ) { + homeScreenController + .clearSpecialMission(mission.id, onClickCollect) + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ChooseCharacterScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ChooseCharacterScreen.kt index fe52df1..0d09f13 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ChooseCharacterScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ChooseCharacterScreen.kt @@ -19,7 +19,9 @@ import androidx.navigation.NavController import com.github.nacabaro.vbhelper.components.CharacterEntry import com.github.nacabaro.vbhelper.components.TopBanner import com.github.nacabaro.vbhelper.di.VBHelper +import com.github.nacabaro.vbhelper.domain.items.ItemType import com.github.nacabaro.vbhelper.dtos.CharacterDtos +import com.github.nacabaro.vbhelper.dtos.ItemDtos import com.github.nacabaro.vbhelper.source.StorageRepository import com.github.nacabaro.vbhelper.utils.BitmapData import kotlinx.coroutines.launch @@ -39,10 +41,25 @@ fun ChooseCharacterScreen( } var selectedCharacter by remember { mutableStateOf(null) } + var selectedItem by remember { mutableStateOf(null) } LaunchedEffect(storageRepository) { coroutineScope.launch { - characterList.value = storageRepository.getAllCharacters() + selectedItem = storageRepository.getItem(itemId) + when (selectedItem?.itemType) { + ItemType.BEITEM -> { + characterList.value = storageRepository.getBEBEmCharacters() + } + ItemType.VBITEM -> { + characterList.value = storageRepository.getVBCharacters() + } + ItemType.SPECIALMISSION-> { + characterList.value = storageRepository.getVBCharacters() + } + else -> { + characterList.value = storageRepository.getAllCharacters() + } + } } } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreenControllerImpl.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreenControllerImpl.kt index f1a6716..db9194d 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreenControllerImpl.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/itemsScreen/ItemsScreenControllerImpl.kt @@ -2,9 +2,12 @@ package com.github.nacabaro.vbhelper.screens.itemsScreen import androidx.activity.ComponentActivity import androidx.lifecycle.lifecycleScope +import com.github.cfogrady.vbnfc.vb.SpecialMission +import com.github.nacabaro.vbhelper.domain.device_data.SpecialMissions import com.github.nacabaro.vbhelper.database.AppDatabase import com.github.nacabaro.vbhelper.di.VBHelper import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData +import com.github.nacabaro.vbhelper.domain.device_data.VBCharacterData import com.github.nacabaro.vbhelper.dtos.ItemDtos import com.github.nacabaro.vbhelper.utils.DeviceType import kotlinx.coroutines.Dispatchers @@ -24,7 +27,15 @@ class ItemsScreenControllerImpl ( AllTraining(5), EvoTimer(6), LimitTimer(7), - Vitals(8) + Vitals(8), + Step8k(9), + Step4k(10), + Vitals1000(11), + Vitals250(12), + Battle20(13), + Battle5(14), + Win10(15), + Win4(16) } init { @@ -37,17 +48,20 @@ class ItemsScreenControllerImpl ( withContext(Dispatchers.IO) { val item = getItem(itemId) val characterData = database.userCharacterDao().getCharacter(characterId) - val beCharacterData: BECharacterData - //var vbCharacterData: VBCharacterData + var beCharacterData: BECharacterData? = null + var vbCharacterData: VBCharacterData? = null if (characterData.characterType == DeviceType.BEDevice) { beCharacterData = database.userCharacterDao().getBeData(characterId) - } else { - TODO("Not implemented") - //vbCharacterData = database.userCharacterDao().getVbData(characterId) + } else if (characterData.characterType == DeviceType.VBDevice) { + vbCharacterData = database.userCharacterDao().getVbData(characterId) } - if (item.itemIcon in 1 .. 5 && characterData.characterType == DeviceType.BEDevice) { + if ( + item.itemIcon in 1 .. 5 && + characterData.characterType == DeviceType.BEDevice && + beCharacterData != null + ) { beCharacterData.itemType = item.itemIcon beCharacterData.itemMultiplier = 3 beCharacterData.itemRemainingTime = item.itemLength @@ -72,7 +86,11 @@ class ItemsScreenControllerImpl ( .userCharacterDao() .updateCharacter(characterData) - } else if (item.itemIcon == ItemTypes.LimitTimer.id) { + } else if ( + item.itemIcon == ItemTypes.LimitTimer.id && + characterData.characterType == DeviceType.BEDevice && + beCharacterData != null + ) { beCharacterData.remainingTrainingTimeInMinutes += item.itemLength if (beCharacterData.remainingTrainingTimeInMinutes > 6000) { beCharacterData.remainingTrainingTimeInMinutes = 6000 @@ -93,6 +111,12 @@ class ItemsScreenControllerImpl ( database .userCharacterDao() .updateCharacter(characterData) + + } else if (item.itemIcon in ItemTypes.Step8k.id .. ItemTypes.Win4.id && + characterData.characterType == DeviceType.VBDevice && + vbCharacterData != null + ) { + applySpecialMission(item.itemIcon, item.itemLength, characterId) } consumeItem(item.id) @@ -104,13 +128,72 @@ class ItemsScreenControllerImpl ( } } - private fun getItem(itemId: Long): ItemDtos.ItemsWithQuantities { + private suspend fun applySpecialMission(itemIcon: Int, itemLength: Int, characterId: Long) { + // Hello, it's me, naca! No! I don't like this, I'll see how I can improve it later on... + val specialMissionType = when (itemIcon) { + ItemTypes.Step8k.id -> SpecialMission.Type.STEPS + ItemTypes.Step4k.id -> SpecialMission.Type.STEPS + ItemTypes.Vitals1000.id -> SpecialMission.Type.VITALS + ItemTypes.Vitals250.id -> SpecialMission.Type.VITALS + ItemTypes.Battle20.id -> SpecialMission.Type.BATTLES + ItemTypes.Battle5.id -> SpecialMission.Type.BATTLES + ItemTypes.Win10.id -> SpecialMission.Type.WINS + ItemTypes.Win4.id -> SpecialMission.Type.WINS + else -> SpecialMission.Type.NONE + } + + val specialMissionGoal = when (itemIcon) { + ItemTypes.Step8k.id -> 8000 + ItemTypes.Step4k.id -> 4000 + ItemTypes.Vitals1000.id -> 1000 + ItemTypes.Vitals250.id -> 250 + ItemTypes.Battle20.id -> 20 + ItemTypes.Battle5.id -> 5 + ItemTypes.Win10.id -> 10 + ItemTypes.Win4.id -> 4 + else -> 0 + } + + val availableSpecialMissions = database + .userCharacterDao() + .getSpecialMissions(characterId) + + var firstUnavailableMissionSlot: Long = 0 + var watchId = 0 + + for ((index, mission) in availableSpecialMissions.withIndex()) { + if ( + mission.status == SpecialMission.Status.UNAVAILABLE + ) { + firstUnavailableMissionSlot = mission.id + watchId = index + 1 + } + } + + val newSpecialMission = SpecialMissions( + id = firstUnavailableMissionSlot, + characterId = characterId, + missionType = specialMissionType, + goal = specialMissionGoal, + timeLimitInMinutes = itemLength, + watchId = watchId, + status = SpecialMission.Status.AVAILABLE, + progress = 0, + timeElapsedInMinutes = 0 + ) + + database + .userCharacterDao() + .insertSpecialMissions(newSpecialMission) + } + + private suspend fun getItem(itemId: Long): ItemDtos.ItemsWithQuantities { return database .itemDao() .getItem(itemId) } - private fun consumeItem(itemId: Long) { + private suspend fun consumeItem(itemId: Long) { database .itemDao() .useItem(itemId) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/source/StorageRepository.kt b/app/src/main/java/com/github/nacabaro/vbhelper/source/StorageRepository.kt index 65bdeb0..a222a21 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/source/StorageRepository.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/source/StorageRepository.kt @@ -2,8 +2,10 @@ package com.github.nacabaro.vbhelper.source import com.github.nacabaro.vbhelper.database.AppDatabase import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData +import com.github.nacabaro.vbhelper.domain.device_data.SpecialMissions import com.github.nacabaro.vbhelper.domain.device_data.VBCharacterData import com.github.nacabaro.vbhelper.dtos.CharacterDtos +import com.github.nacabaro.vbhelper.dtos.ItemDtos class StorageRepository ( private val db: AppDatabase @@ -28,6 +30,14 @@ class StorageRepository ( return db.userCharacterDao().getVbData(id) } + suspend fun getSpecialMissions(id: Long): List { + return db.userCharacterDao().getSpecialMissions(id) + } + + suspend fun getItem(id: Long): ItemDtos.ItemsWithQuantities { + return db.itemDao().getItem(id) + } + suspend fun getActiveCharacter(): CharacterDtos.CharacterWithSprites? { return db.userCharacterDao().getActiveCharacter() } @@ -39,4 +49,12 @@ class StorageRepository ( suspend fun getAdventureCharacters(): List { return db.adventureDao().getAdventureCharacters() } + + suspend fun getBEBEmCharacters(): List { + return db.userCharacterDao().getBEBemCharacters() + } + + suspend fun getVBCharacters(): List { + return db.userCharacterDao().getVBDimCharacters() + } } \ No newline at end of file