mirror of
https://github.com/nacabaro/vbhelper.git
synced 2026-10-01 15:41:36 +00:00
Compare commits
28
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f96f00e05a | ||
|
|
3c17e93d0f | ||
|
|
f8ce81e932 | ||
|
|
7bb7693876 | ||
|
|
2b33042fe0 | ||
|
|
4d8dcde26e | ||
|
|
0b1eed7da9 | ||
|
|
36c3e25fd3 | ||
|
|
ac05dfc541 | ||
|
|
220a61a553 | ||
|
|
d847f600f1 | ||
|
|
f7a4039d66 | ||
|
|
1eed6a4c17 | ||
|
|
1a09e40d1d | ||
|
|
13051145b7 | ||
|
|
1a150ce7ce | ||
|
|
39ba48d867 | ||
|
|
3f324ca141 | ||
|
|
1e28a8c249 | ||
|
|
d46769b0cb | ||
|
|
fce05870c5 | ||
|
|
9f5f806786 | ||
|
|
d749af0a9c | ||
|
|
076f6bfacf | ||
|
|
a4f3b701e5 | ||
|
|
da134247b1 | ||
|
|
f7b3b7256a | ||
|
|
e36a700d9f |
@@ -15,7 +15,7 @@ android {
|
|||||||
minSdk = 28
|
minSdk = 28
|
||||||
targetSdk = 35
|
targetSdk = 35
|
||||||
versionCode = 1
|
versionCode = 1
|
||||||
versionName = "1.0"
|
versionName = "Alpha 0.4"
|
||||||
|
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@@ -14,6 +14,7 @@ import com.github.nacabaro.vbhelper.screens.itemsScreen.ItemsScreenControllerImp
|
|||||||
import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreenControllerImpl
|
import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreenControllerImpl
|
||||||
import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreenControllerImpl
|
import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreenControllerImpl
|
||||||
import com.github.nacabaro.vbhelper.screens.adventureScreen.AdventureScreenControllerImpl
|
import com.github.nacabaro.vbhelper.screens.adventureScreen.AdventureScreenControllerImpl
|
||||||
|
import com.github.nacabaro.vbhelper.screens.spriteViewer.SpriteViewerControllerImpl
|
||||||
import com.github.nacabaro.vbhelper.screens.storageScreen.StorageScreenControllerImpl
|
import com.github.nacabaro.vbhelper.screens.storageScreen.StorageScreenControllerImpl
|
||||||
import com.github.nacabaro.vbhelper.ui.theme.VBHelperTheme
|
import com.github.nacabaro.vbhelper.ui.theme.VBHelperTheme
|
||||||
|
|
||||||
@@ -45,6 +46,7 @@ class MainActivity : ComponentActivity() {
|
|||||||
val adventureScreenController = AdventureScreenControllerImpl(this)
|
val adventureScreenController = AdventureScreenControllerImpl(this)
|
||||||
val storageScreenController = StorageScreenControllerImpl(this)
|
val storageScreenController = StorageScreenControllerImpl(this)
|
||||||
val homeScreenController = HomeScreenControllerImpl(this)
|
val homeScreenController = HomeScreenControllerImpl(this)
|
||||||
|
val spriteViewerController = SpriteViewerControllerImpl(this)
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
@@ -58,7 +60,8 @@ class MainActivity : ComponentActivity() {
|
|||||||
itemsScreenController = itemsScreenController,
|
itemsScreenController = itemsScreenController,
|
||||||
adventureScreenController = adventureScreenController,
|
adventureScreenController = adventureScreenController,
|
||||||
homeScreenController = homeScreenController,
|
homeScreenController = homeScreenController,
|
||||||
storageScreenController = storageScreenController
|
storageScreenController = storageScreenController,
|
||||||
|
spriteViewerController = spriteViewerController
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -90,7 +93,7 @@ class MainActivity : ComponentActivity() {
|
|||||||
adventureScreenController: AdventureScreenControllerImpl,
|
adventureScreenController: AdventureScreenControllerImpl,
|
||||||
storageScreenController: StorageScreenControllerImpl,
|
storageScreenController: StorageScreenControllerImpl,
|
||||||
homeScreenController: HomeScreenControllerImpl,
|
homeScreenController: HomeScreenControllerImpl,
|
||||||
|
spriteViewerController: SpriteViewerControllerImpl
|
||||||
) {
|
) {
|
||||||
AppNavigation(
|
AppNavigation(
|
||||||
applicationNavigationHandlers = AppNavigationHandlers(
|
applicationNavigationHandlers = AppNavigationHandlers(
|
||||||
@@ -99,7 +102,8 @@ class MainActivity : ComponentActivity() {
|
|||||||
itemsScreenController,
|
itemsScreenController,
|
||||||
adventureScreenController,
|
adventureScreenController,
|
||||||
storageScreenController,
|
storageScreenController,
|
||||||
homeScreenController
|
homeScreenController,
|
||||||
|
spriteViewerController
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,11 +5,14 @@ import androidx.compose.foundation.Image
|
|||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
import androidx.compose.foundation.layout.aspectRatio
|
import androidx.compose.foundation.layout.aspectRatio
|
||||||
|
import androidx.compose.foundation.layout.fillMaxHeight
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.layout.size
|
import androidx.compose.foundation.layout.size
|
||||||
import androidx.compose.material3.Card
|
import androidx.compose.material3.Card
|
||||||
|
import androidx.compose.material3.CardDefaults
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.Text
|
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.graphics.Shape
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.text.font.FontWeight
|
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
|
import com.github.nacabaro.vbhelper.utils.getObscuredBitmap
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@@ -115,3 +121,89 @@ 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,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,14 +21,17 @@ interface AdventureDao {
|
|||||||
@Query("""
|
@Query("""
|
||||||
SELECT
|
SELECT
|
||||||
uc.*,
|
uc.*,
|
||||||
c.sprite1 AS spriteIdle,
|
c.stage,
|
||||||
c.spritesWidth AS spriteWidth,
|
c.attribute,
|
||||||
c.spritesHeight AS spriteHeight,
|
s.spriteIdle1 AS spriteIdle,
|
||||||
|
s.width AS spriteWidth,
|
||||||
|
s.height AS spriteHeight,
|
||||||
d.isBEm as isBemCard,
|
d.isBEm as isBemCard,
|
||||||
a.finishesAdventure AS finishesAdventure,
|
a.finishesAdventure AS finishesAdventure,
|
||||||
a.originalDuration AS originalTimeInMinutes
|
a.originalDuration AS originalTimeInMinutes
|
||||||
FROM UserCharacter uc
|
FROM UserCharacter uc
|
||||||
JOIN Character c ON uc.charId = c.id
|
JOIN Character c ON uc.charId = c.id
|
||||||
|
JOIN Sprite s ON s.id = c.spriteId
|
||||||
JOIN Card d ON c.dimId = d.id
|
JOIN Card d ON c.dimId = d.id
|
||||||
JOIN Adventure a ON uc.id = a.characterId
|
JOIN Adventure a ON uc.id = a.characterId
|
||||||
""")
|
""")
|
||||||
|
|||||||
+3
-6
@@ -4,16 +4,13 @@ import androidx.room.Dao
|
|||||||
import androidx.room.Insert
|
import androidx.room.Insert
|
||||||
import androidx.room.OnConflictStrategy
|
import androidx.room.OnConflictStrategy
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Card
|
import com.github.nacabaro.vbhelper.domain.card.Card
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
interface DiMDao {
|
interface CardDao {
|
||||||
@Insert(onConflict = OnConflictStrategy.IGNORE)
|
@Insert(onConflict = OnConflictStrategy.IGNORE)
|
||||||
suspend fun insertNewDim(card: Card): Long
|
suspend fun insertNewDim(card: Card): Long
|
||||||
|
|
||||||
@Query("SELECT * FROM Card")
|
@Query("SELECT * FROM Card WHERE cardId = :id")
|
||||||
suspend fun getAllDims(): List<Card>
|
|
||||||
|
|
||||||
@Query("SELECT * FROM Card WHERE dimId = :id")
|
|
||||||
fun getDimById(id: Int): Card?
|
fun getDimById(id: Int): Card?
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.daos
|
||||||
|
|
||||||
|
import androidx.room.Dao
|
||||||
|
import androidx.room.Query
|
||||||
|
import androidx.room.Upsert
|
||||||
|
import com.github.nacabaro.vbhelper.domain.card.CardProgress
|
||||||
|
|
||||||
|
@Dao
|
||||||
|
interface CardProgressDao {
|
||||||
|
@Upsert
|
||||||
|
fun updateDimProgress(vararg cardProgresses: CardProgress)
|
||||||
|
|
||||||
|
@Query(
|
||||||
|
"SELECT currentStage FROM CardProgress WHERE cardId = :cardId"
|
||||||
|
)
|
||||||
|
fun getCardProgress(cardId: Int): Int
|
||||||
|
}
|
||||||
@@ -4,7 +4,7 @@ import androidx.room.Dao
|
|||||||
import androidx.room.Insert
|
import androidx.room.Insert
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Character
|
import com.github.nacabaro.vbhelper.domain.characters.Character
|
||||||
import com.github.nacabaro.vbhelper.domain.Sprites
|
import com.github.nacabaro.vbhelper.domain.characters.Sprite
|
||||||
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
@@ -12,40 +12,24 @@ interface CharacterDao {
|
|||||||
@Insert
|
@Insert
|
||||||
suspend fun insertCharacter(vararg characterData: Character)
|
suspend fun insertCharacter(vararg characterData: Character)
|
||||||
|
|
||||||
@Query("SELECT * FROM Character")
|
|
||||||
suspend fun getAllCharacters(): List<Character>
|
|
||||||
|
|
||||||
@Query("SELECT * FROM Character WHERE dimId = :dimId")
|
|
||||||
suspend fun getCharacterByDimId(dimId: Int): List<Character>
|
|
||||||
|
|
||||||
@Query("SELECT * FROM Character WHERE monIndex = :monIndex AND dimId = :dimId LIMIT 1")
|
@Query("SELECT * FROM Character WHERE monIndex = :monIndex AND dimId = :dimId LIMIT 1")
|
||||||
fun getCharacterByMonIndex(monIndex: Int, dimId: Long): Character
|
fun getCharacterByMonIndex(monIndex: Int, dimId: Long): Character
|
||||||
|
|
||||||
@Insert
|
@Insert
|
||||||
suspend fun insertSprite(vararg sprite: Sprites)
|
suspend fun insertSprite(vararg sprite: Sprite)
|
||||||
|
|
||||||
@Query("SELECT * FROM Sprites")
|
|
||||||
suspend fun getAllSprites(): List<Sprites>
|
|
||||||
|
|
||||||
@Query(
|
@Query(
|
||||||
"""
|
"""
|
||||||
SELECT
|
SELECT
|
||||||
d.dimId as cardId,
|
d.cardId as cardId,
|
||||||
c.monIndex as charId
|
c.monIndex as charId,
|
||||||
|
c.stage as stage,
|
||||||
|
c.attribute as attribute
|
||||||
FROM Character c
|
FROM Character c
|
||||||
JOIN UserCharacter uc ON c.id = uc.charId
|
JOIN UserCharacter uc ON c.id = uc.charId
|
||||||
JOIN Card d ON c.dimId = d.id
|
JOIN Card d ON c.dimId = d.id
|
||||||
WHERE uc.id = :charId
|
WHERE c.id = :charId
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
suspend fun getCharacterInfo(charId: Long): CharacterDtos.DiMInfo
|
suspend fun getCharacterInfo(charId: Long): CharacterDtos.CardCharacterInfo
|
||||||
|
|
||||||
@Query("""
|
|
||||||
INSERT INTO TransformationHistory(monId, stageId, transformationDate)
|
|
||||||
VALUES
|
|
||||||
(:monId,
|
|
||||||
(SELECT id FROM Character WHERE monIndex = :stage AND dimId = :dimId),
|
|
||||||
:transformationDate)
|
|
||||||
""")
|
|
||||||
fun insertTransformation(monId: Long, stage: Int, dimId: Long, transformationDate: Long)
|
|
||||||
}
|
}
|
||||||
@@ -19,11 +19,12 @@ interface DexDao {
|
|||||||
@Query("""
|
@Query("""
|
||||||
SELECT
|
SELECT
|
||||||
c.id AS id,
|
c.id AS id,
|
||||||
c.sprite1 AS spriteIdle,
|
s.spriteIdle1 AS spriteIdle,
|
||||||
c.spritesWidth AS spriteWidth,
|
s.width AS spriteWidth,
|
||||||
c.spritesHeight AS spriteHeight,
|
s.height AS spriteHeight,
|
||||||
d.discoveredOn AS discoveredOn
|
d.discoveredOn AS discoveredOn
|
||||||
FROM character c
|
FROM Character c
|
||||||
|
JOIN Sprite s ON c.spriteId = s.id
|
||||||
LEFT JOIN dex d ON c.id = d.id
|
LEFT JOIN dex d ON c.id = d.id
|
||||||
WHERE c.dimId = :cardId
|
WHERE c.dimId = :cardId
|
||||||
""")
|
""")
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.github.nacabaro.vbhelper.daos
|
|
||||||
|
|
||||||
import androidx.room.Dao
|
|
||||||
import androidx.room.Upsert
|
|
||||||
import com.github.nacabaro.vbhelper.domain.DimProgress
|
|
||||||
|
|
||||||
@Dao
|
|
||||||
interface DiMProgressDao {
|
|
||||||
@Upsert
|
|
||||||
suspend fun updateDimProgress(vararg dimProgress: DimProgress)
|
|
||||||
}
|
|
||||||
@@ -31,7 +31,7 @@ interface ItemDao {
|
|||||||
WHERE Items.id = :itemId
|
WHERE Items.id = :itemId
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
fun getItem(itemId: Long): ItemDtos.ItemsWithQuantities
|
suspend fun getItem(itemId: Long): ItemDtos.ItemsWithQuantities
|
||||||
|
|
||||||
@Query(
|
@Query(
|
||||||
"""
|
"""
|
||||||
@@ -40,7 +40,7 @@ interface ItemDao {
|
|||||||
WHERE id = :itemId
|
WHERE id = :itemId
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
fun useItem(itemId: Long)
|
suspend fun useItem(itemId: Long)
|
||||||
|
|
||||||
@Query(
|
@Query(
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.daos
|
||||||
|
|
||||||
|
import androidx.room.Dao
|
||||||
|
import androidx.room.Insert
|
||||||
|
import androidx.room.OnConflictStrategy
|
||||||
|
import androidx.room.Query
|
||||||
|
import com.github.nacabaro.vbhelper.domain.characters.Sprite
|
||||||
|
|
||||||
|
@Dao
|
||||||
|
interface SpriteDao {
|
||||||
|
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||||
|
fun insertSprite(sprite: Sprite): Long
|
||||||
|
|
||||||
|
@Query("SELECT * FROM Sprite")
|
||||||
|
suspend fun getAllSprites(): List<Sprite>
|
||||||
|
}
|
||||||
@@ -5,9 +5,13 @@ import androidx.room.Insert
|
|||||||
import androidx.room.OnConflictStrategy
|
import androidx.room.OnConflictStrategy
|
||||||
import androidx.room.Query
|
import androidx.room.Query
|
||||||
import androidx.room.Upsert
|
import androidx.room.Upsert
|
||||||
|
import com.github.nacabaro.vbhelper.domain.characters.Character
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter
|
import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData
|
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.TransformationHistory
|
import com.github.nacabaro.vbhelper.domain.device_data.TransformationHistory
|
||||||
|
import com.github.nacabaro.vbhelper.domain.device_data.VBCharacterData
|
||||||
|
import com.github.nacabaro.vbhelper.domain.device_data.VitalsHistory
|
||||||
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
||||||
|
|
||||||
@Dao
|
@Dao
|
||||||
@@ -18,6 +22,9 @@ interface UserCharacterDao {
|
|||||||
@Insert
|
@Insert
|
||||||
fun insertBECharacterData(characterData: BECharacterData)
|
fun insertBECharacterData(characterData: BECharacterData)
|
||||||
|
|
||||||
|
@Insert
|
||||||
|
fun insertVBCharacterData(characterData: VBCharacterData)
|
||||||
|
|
||||||
@Upsert
|
@Upsert
|
||||||
fun updateCharacter(character: UserCharacter)
|
fun updateCharacter(character: UserCharacter)
|
||||||
|
|
||||||
@@ -27,27 +34,34 @@ interface UserCharacterDao {
|
|||||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||||
fun insertTransformationHistory(vararg transformationHistory: TransformationHistory)
|
fun insertTransformationHistory(vararg transformationHistory: TransformationHistory)
|
||||||
|
|
||||||
|
@Upsert
|
||||||
|
fun insertSpecialMissions(vararg specialMissions: SpecialMissions)
|
||||||
|
|
||||||
@Query("""
|
@Query("""
|
||||||
SELECT
|
SELECT
|
||||||
c.id AS id,
|
c.id AS id,
|
||||||
c.sprite1 AS spriteIdle,
|
s.spriteIdle1 AS spriteIdle,
|
||||||
c.spritesWidth AS spriteWidth,
|
s.width AS spriteWidth,
|
||||||
c.spritesHeight AS spriteHeight,
|
s.height AS spriteHeight,
|
||||||
c.monIndex AS monIndex,
|
c.monIndex AS monIndex,
|
||||||
t.transformationDate AS transformationDate
|
t.transformationDate AS transformationDate
|
||||||
FROM TransformationHistory t
|
FROM TransformationHistory t
|
||||||
JOIN Character c ON c.id = t.stageId
|
JOIN Character c ON c.id = t.stageId
|
||||||
|
JOIN Sprite s ON s.id = c.spriteId
|
||||||
WHERE monId = :monId
|
WHERE monId = :monId
|
||||||
""")
|
""")
|
||||||
fun getTransformationHistory(monId: Long): List<CharacterDtos.TransformationHistory>?
|
suspend fun getTransformationHistory(monId: Long): List<CharacterDtos.TransformationHistory>?
|
||||||
|
|
||||||
@Query(
|
@Query(
|
||||||
"""
|
"""
|
||||||
SELECT
|
SELECT
|
||||||
uc.*,
|
uc.*,
|
||||||
c.sprite1 AS spriteIdle,
|
c.stage,
|
||||||
c.spritesWidth AS spriteWidth,
|
c.attribute,
|
||||||
c.spritesHeight AS spriteHeight,
|
s.spriteIdle1 AS spriteIdle,
|
||||||
|
s.spriteIdle2 AS spriteIdle2,
|
||||||
|
s.width AS spriteWidth,
|
||||||
|
s.height AS spriteHeight,
|
||||||
c.name as nameSprite,
|
c.name as nameSprite,
|
||||||
c.nameWidth as nameSpriteWidth,
|
c.nameWidth as nameSpriteWidth,
|
||||||
c.nameHeight as nameSpriteHeight,
|
c.nameHeight as nameSpriteHeight,
|
||||||
@@ -55,7 +69,8 @@ interface UserCharacterDao {
|
|||||||
a.characterId = uc.id as isInAdventure
|
a.characterId = uc.id as isInAdventure
|
||||||
FROM UserCharacter uc
|
FROM UserCharacter uc
|
||||||
JOIN Character c ON uc.charId = c.id
|
JOIN Character c ON uc.charId = c.id
|
||||||
JOIN Card d ON c.dimId = d.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
|
LEFT JOIN Adventure a ON a.characterId = uc.id
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
@@ -65,9 +80,12 @@ interface UserCharacterDao {
|
|||||||
"""
|
"""
|
||||||
SELECT
|
SELECT
|
||||||
uc.*,
|
uc.*,
|
||||||
c.sprite1 AS spriteIdle,
|
c.stage,
|
||||||
c.spritesWidth AS spriteWidth,
|
c.attribute,
|
||||||
c.spritesHeight AS spriteHeight,
|
s.spriteIdle1 AS spriteIdle,
|
||||||
|
s.spriteIdle2 AS spriteIdle2,
|
||||||
|
s.width AS spriteWidth,
|
||||||
|
s.height AS spriteHeight,
|
||||||
c.name as nameSprite,
|
c.name as nameSprite,
|
||||||
c.nameWidth as nameSpriteWidth,
|
c.nameWidth as nameSpriteWidth,
|
||||||
c.nameHeight as nameSpriteHeight,
|
c.nameHeight as nameSpriteHeight,
|
||||||
@@ -76,6 +94,7 @@ interface UserCharacterDao {
|
|||||||
FROM UserCharacter uc
|
FROM UserCharacter uc
|
||||||
JOIN Character c ON uc.charId = c.id
|
JOIN Character c ON uc.charId = c.id
|
||||||
JOIN Card d ON c.dimId = d.id
|
JOIN Card d ON c.dimId = d.id
|
||||||
|
JOIN Sprite s ON s.id = c.spriteId
|
||||||
LEFT JOIN Adventure a ON a.characterId = uc.id
|
LEFT JOIN Adventure a ON a.characterId = uc.id
|
||||||
WHERE uc.id = :id
|
WHERE uc.id = :id
|
||||||
""")
|
""")
|
||||||
@@ -87,13 +106,22 @@ interface UserCharacterDao {
|
|||||||
@Query("SELECT * FROM BECharacterData WHERE id = :id")
|
@Query("SELECT * FROM BECharacterData WHERE id = :id")
|
||||||
suspend fun getBeData(id: Long): BECharacterData
|
suspend fun getBeData(id: Long): BECharacterData
|
||||||
|
|
||||||
|
@Query("SELECT * FROM VBCharacterData WHERE id = :id")
|
||||||
|
suspend fun getVbData(id: Long): VBCharacterData
|
||||||
|
|
||||||
|
@Query("SELECT * FROM SpecialMissions WHERE characterId = :id")
|
||||||
|
suspend fun getSpecialMissions(id: Long): List<SpecialMissions>
|
||||||
|
|
||||||
@Query(
|
@Query(
|
||||||
"""
|
"""
|
||||||
SELECT
|
SELECT
|
||||||
uc.*,
|
uc.*,
|
||||||
c.sprite1 AS spriteIdle,
|
c.stage,
|
||||||
c.spritesWidth AS spriteWidth,
|
c.attribute,
|
||||||
c.spritesHeight AS spriteHeight,
|
s.spriteIdle1 AS spriteIdle,
|
||||||
|
s.spriteIdle2 AS spriteIdle2,
|
||||||
|
s.width AS spriteWidth,
|
||||||
|
s.height AS spriteHeight,
|
||||||
c.name as nameSprite,
|
c.name as nameSprite,
|
||||||
c.nameWidth as nameSpriteWidth,
|
c.nameWidth as nameSpriteWidth,
|
||||||
c.nameHeight as nameSpriteHeight,
|
c.nameHeight as nameSpriteHeight,
|
||||||
@@ -102,6 +130,7 @@ interface UserCharacterDao {
|
|||||||
FROM UserCharacter uc
|
FROM UserCharacter uc
|
||||||
JOIN Character c ON uc.charId = c.id
|
JOIN Character c ON uc.charId = c.id
|
||||||
JOIN Card d ON c.dimId = d.id
|
JOIN Card d ON c.dimId = d.id
|
||||||
|
JOIN Sprite s ON s.id = c.spriteId
|
||||||
LEFT JOIN Adventure a ON a.characterId = uc.id
|
LEFT JOIN Adventure a ON a.characterId = uc.id
|
||||||
WHERE uc.isActive = 1
|
WHERE uc.isActive = 1
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
@@ -116,4 +145,81 @@ interface UserCharacterDao {
|
|||||||
|
|
||||||
@Query("UPDATE UserCharacter SET isActive = 1 WHERE id = :id")
|
@Query("UPDATE UserCharacter SET isActive = 1 WHERE id = :id")
|
||||||
fun setActiveCharacter(id: Long)
|
fun setActiveCharacter(id: Long)
|
||||||
|
|
||||||
|
@Query(
|
||||||
|
"""
|
||||||
|
SELECT c.*
|
||||||
|
FROM Character c
|
||||||
|
join UserCharacter uc on c.id = uc.charId
|
||||||
|
where uc.id = :charId
|
||||||
|
LIMIT 1
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
suspend fun getCharacterInfo(charId: Long): Character
|
||||||
|
|
||||||
|
|
||||||
|
@Query("""
|
||||||
|
INSERT INTO TransformationHistory(monId, stageId, transformationDate)
|
||||||
|
VALUES
|
||||||
|
(:monId,
|
||||||
|
(SELECT id FROM Character WHERE monIndex = :stage AND dimId = :dimId),
|
||||||
|
:transformationDate)
|
||||||
|
""")
|
||||||
|
fun insertTransformation(monId: Long, stage: Int, dimId: Long, transformationDate: Long)
|
||||||
|
|
||||||
|
@Upsert
|
||||||
|
fun insertVitals(vararg vitalsHistory: VitalsHistory)
|
||||||
|
|
||||||
|
@Query("""SELECT * FROM VitalsHistory WHERE charId = :charId ORDER BY id ASC""")
|
||||||
|
suspend fun getVitalsHistory(charId: Long): List<VitalsHistory>
|
||||||
|
|
||||||
|
@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<CharacterDtos.CharacterWithSprites>
|
||||||
|
|
||||||
|
@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<CharacterDtos.CharacterWithSprites>
|
||||||
}
|
}
|
||||||
@@ -5,38 +5,52 @@ import androidx.room.RoomDatabase
|
|||||||
import com.github.nacabaro.vbhelper.daos.AdventureDao
|
import com.github.nacabaro.vbhelper.daos.AdventureDao
|
||||||
import com.github.nacabaro.vbhelper.daos.CharacterDao
|
import com.github.nacabaro.vbhelper.daos.CharacterDao
|
||||||
import com.github.nacabaro.vbhelper.daos.DexDao
|
import com.github.nacabaro.vbhelper.daos.DexDao
|
||||||
import com.github.nacabaro.vbhelper.daos.DiMDao
|
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.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.daos.UserCharacterDao
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Character
|
import com.github.nacabaro.vbhelper.domain.characters.Character
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Card
|
import com.github.nacabaro.vbhelper.domain.card.Card
|
||||||
import com.github.nacabaro.vbhelper.domain.Sprites
|
import com.github.nacabaro.vbhelper.domain.card.CardProgress
|
||||||
|
import com.github.nacabaro.vbhelper.domain.characters.Sprite
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Adventure
|
import com.github.nacabaro.vbhelper.domain.characters.Adventure
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Dex
|
import com.github.nacabaro.vbhelper.domain.characters.Dex
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData
|
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.TransformationHistory
|
import com.github.nacabaro.vbhelper.domain.device_data.TransformationHistory
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter
|
import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter
|
||||||
|
import com.github.nacabaro.vbhelper.domain.device_data.VBCharacterData
|
||||||
|
import com.github.nacabaro.vbhelper.domain.device_data.VitalsHistory
|
||||||
import com.github.nacabaro.vbhelper.domain.items.Items
|
import com.github.nacabaro.vbhelper.domain.items.Items
|
||||||
|
|
||||||
@Database(
|
@Database(
|
||||||
version = 1,
|
version = 1,
|
||||||
entities = [
|
entities = [
|
||||||
Card::class,
|
Card::class,
|
||||||
|
CardProgress::class,
|
||||||
Character::class,
|
Character::class,
|
||||||
Sprites::class,
|
Sprite::class,
|
||||||
UserCharacter::class,
|
UserCharacter::class,
|
||||||
BECharacterData::class,
|
BECharacterData::class,
|
||||||
|
VBCharacterData::class,
|
||||||
|
SpecialMissions::class,
|
||||||
TransformationHistory::class,
|
TransformationHistory::class,
|
||||||
|
VitalsHistory::class,
|
||||||
Dex::class,
|
Dex::class,
|
||||||
Items::class,
|
Items::class,
|
||||||
Adventure::class
|
Adventure::class
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
abstract class AppDatabase : RoomDatabase() {
|
abstract class AppDatabase : RoomDatabase() {
|
||||||
abstract fun dimDao(): DiMDao
|
abstract fun cardDao(): CardDao
|
||||||
|
abstract fun cardProgressDao(): CardProgressDao
|
||||||
abstract fun characterDao(): CharacterDao
|
abstract fun characterDao(): CharacterDao
|
||||||
abstract fun userCharacterDao(): UserCharacterDao
|
abstract fun userCharacterDao(): UserCharacterDao
|
||||||
abstract fun dexDao(): DexDao
|
abstract fun dexDao(): DexDao
|
||||||
abstract fun itemDao(): ItemDao
|
abstract fun itemDao(): ItemDao
|
||||||
abstract fun adventureDao(): AdventureDao
|
abstract fun adventureDao(): AdventureDao
|
||||||
|
abstract fun spriteDao(): SpriteDao
|
||||||
|
abstract fun specialMissionDao(): SpecialMissionDao
|
||||||
}
|
}
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
package com.github.nacabaro.vbhelper.domain
|
|
||||||
|
|
||||||
import androidx.room.Entity
|
|
||||||
import androidx.room.ForeignKey
|
|
||||||
import androidx.room.PrimaryKey
|
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Card
|
|
||||||
|
|
||||||
@Entity(
|
|
||||||
foreignKeys = [
|
|
||||||
ForeignKey(
|
|
||||||
entity = User::class,
|
|
||||||
parentColumns = ["id"],
|
|
||||||
childColumns = ["userId"],
|
|
||||||
onDelete = ForeignKey.CASCADE
|
|
||||||
),
|
|
||||||
ForeignKey(
|
|
||||||
entity = Card::class,
|
|
||||||
parentColumns = ["id"],
|
|
||||||
childColumns = ["dimId"],
|
|
||||||
onDelete = ForeignKey.CASCADE
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
data class DimProgress(
|
|
||||||
@PrimaryKey val dimId: Int,
|
|
||||||
@PrimaryKey val userId: Int,
|
|
||||||
val currentStage: Int,
|
|
||||||
val unlocked: Boolean
|
|
||||||
)
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
package com.github.nacabaro.vbhelper.domain
|
|
||||||
|
|
||||||
import androidx.room.Entity
|
|
||||||
import androidx.room.PrimaryKey
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
data class Sprites(
|
|
||||||
@PrimaryKey(autoGenerate = true) val id : Int,
|
|
||||||
val sprite: ByteArray,
|
|
||||||
val width: Int,
|
|
||||||
val height: Int
|
|
||||||
)
|
|
||||||
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
package com.github.nacabaro.vbhelper.domain.characters
|
package com.github.nacabaro.vbhelper.domain.card
|
||||||
|
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
@@ -7,7 +7,7 @@ import androidx.room.PrimaryKey
|
|||||||
data class Card(
|
data class Card(
|
||||||
@PrimaryKey(autoGenerate = true)
|
@PrimaryKey(autoGenerate = true)
|
||||||
val id: Long = 0,
|
val id: Long = 0,
|
||||||
val dimId: Int,
|
val cardId: Int,
|
||||||
val logo: ByteArray,
|
val logo: ByteArray,
|
||||||
val logoWidth: Int,
|
val logoWidth: Int,
|
||||||
val logoHeight: Int,
|
val logoHeight: Int,
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.domain.card
|
||||||
|
|
||||||
|
import androidx.room.Entity
|
||||||
|
import androidx.room.ForeignKey
|
||||||
|
import androidx.room.PrimaryKey
|
||||||
|
|
||||||
|
@Entity(
|
||||||
|
foreignKeys = [
|
||||||
|
ForeignKey(
|
||||||
|
entity = Card::class,
|
||||||
|
parentColumns = ["id"],
|
||||||
|
childColumns = ["cardId"],
|
||||||
|
onDelete = ForeignKey.CASCADE
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
data class CardProgress(
|
||||||
|
@PrimaryKey val cardId: Long,
|
||||||
|
val currentStage: Int,
|
||||||
|
val unlocked: Boolean
|
||||||
|
)
|
||||||
@@ -3,6 +3,8 @@ package com.github.nacabaro.vbhelper.domain.characters
|
|||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
import androidx.room.ForeignKey
|
import androidx.room.ForeignKey
|
||||||
|
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
||||||
|
import com.github.nacabaro.vbhelper.domain.card.Card
|
||||||
|
|
||||||
@Entity(
|
@Entity(
|
||||||
foreignKeys = [
|
foreignKeys = [
|
||||||
@@ -11,23 +13,32 @@ import androidx.room.ForeignKey
|
|||||||
parentColumns = ["id"],
|
parentColumns = ["id"],
|
||||||
childColumns = ["dimId"],
|
childColumns = ["dimId"],
|
||||||
onDelete = ForeignKey.CASCADE
|
onDelete = ForeignKey.CASCADE
|
||||||
|
),
|
||||||
|
ForeignKey(
|
||||||
|
entity = Sprite::class,
|
||||||
|
parentColumns = ["id"],
|
||||||
|
childColumns = ["spriteId"],
|
||||||
|
onDelete = ForeignKey.CASCADE
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Character represents a character on a card. There should only be one of these per dimId
|
||||||
|
* and monIndex.
|
||||||
|
* TODO: Customs will mean this should be unique per cardName and monIndex
|
||||||
|
*/
|
||||||
data class Character (
|
data class Character (
|
||||||
@PrimaryKey(autoGenerate = true) val id: Long = 0,
|
@PrimaryKey(autoGenerate = true) val id: Long = 0,
|
||||||
val dimId: Long,
|
val dimId: Long,
|
||||||
|
val spriteId: Long,
|
||||||
val monIndex: Int,
|
val monIndex: Int,
|
||||||
val name: ByteArray,
|
val name: ByteArray,
|
||||||
val stage: Int, // These should be replaced with enums
|
val stage: Int, // These should be replaced with enums
|
||||||
val attribute: Int, // This one too
|
val attribute: NfcCharacter.Attribute, // This one too
|
||||||
val baseHp: Int,
|
val baseHp: Int,
|
||||||
val baseBp: Int,
|
val baseBp: Int,
|
||||||
val baseAp: Int,
|
val baseAp: Int,
|
||||||
val sprite1: ByteArray,
|
|
||||||
val sprite2: ByteArray,
|
|
||||||
val nameWidth: Int,
|
val nameWidth: Int,
|
||||||
val nameHeight: Int,
|
val nameHeight: Int
|
||||||
val spritesWidth: Int,
|
|
||||||
val spritesHeight: Int
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.domain.characters
|
||||||
|
|
||||||
|
import androidx.room.Entity
|
||||||
|
import androidx.room.PrimaryKey
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
data class Sprite(
|
||||||
|
@PrimaryKey(autoGenerate = true) val id : Int = 0,
|
||||||
|
val spriteIdle1: ByteArray,
|
||||||
|
val spriteIdle2: ByteArray,
|
||||||
|
val spriteWalk1: ByteArray,
|
||||||
|
val spriteWalk2: ByteArray,
|
||||||
|
val spriteRun1: ByteArray,
|
||||||
|
val spriteRun2: ByteArray,
|
||||||
|
val spriteTrain1: ByteArray,
|
||||||
|
val spriteTrain2: ByteArray,
|
||||||
|
val spriteHappy: ByteArray,
|
||||||
|
val spriteSleep: ByteArray,
|
||||||
|
val spriteAttack: ByteArray,
|
||||||
|
val spriteDodge: ByteArray,
|
||||||
|
val width: Int,
|
||||||
|
val height: Int
|
||||||
|
)
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.domain.device_data
|
||||||
|
|
||||||
|
import androidx.room.Entity
|
||||||
|
import androidx.room.ForeignKey
|
||||||
|
import androidx.room.PrimaryKey
|
||||||
|
import com.github.cfogrady.vbnfc.vb.SpecialMission
|
||||||
|
|
||||||
|
@Entity(
|
||||||
|
foreignKeys = [
|
||||||
|
ForeignKey(
|
||||||
|
entity = UserCharacter::class,
|
||||||
|
parentColumns = ["id"],
|
||||||
|
childColumns = ["characterId"],
|
||||||
|
onDelete = ForeignKey.CASCADE
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
data class SpecialMissions (
|
||||||
|
@PrimaryKey(autoGenerate = true) var id: Long = 0,
|
||||||
|
var characterId: Long,
|
||||||
|
var goal: Int,
|
||||||
|
val watchId: Int,
|
||||||
|
val progress: Int,
|
||||||
|
val status: SpecialMission.Status,
|
||||||
|
val timeElapsedInMinutes: Int,
|
||||||
|
val timeLimitInMinutes: Int,
|
||||||
|
val missionType: SpecialMission.Type
|
||||||
|
)
|
||||||
@@ -17,13 +17,13 @@ import com.github.nacabaro.vbhelper.domain.characters.Character
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
/**
|
||||||
|
* UserCharacter represents and instance of a character. The charId should map to a Character
|
||||||
|
*/
|
||||||
data class UserCharacter (
|
data class UserCharacter (
|
||||||
@PrimaryKey(autoGenerate = true) val id: Long = 0,
|
@PrimaryKey(autoGenerate = true) val id: Long = 0,
|
||||||
var charId: Long,
|
var charId: Long,
|
||||||
var stage: Int,
|
|
||||||
var attribute: NfcCharacter.Attribute,
|
|
||||||
var ageInDays: Int,
|
var ageInDays: Int,
|
||||||
var nextAdventureMissionStage: Int, // next adventure mission stage on the character's dim
|
|
||||||
var mood: Int,
|
var mood: Int,
|
||||||
var vitalPoints: Int,
|
var vitalPoints: Int,
|
||||||
var transformationCountdown: Int,
|
var transformationCountdown: Int,
|
||||||
|
|||||||
+19
-2
@@ -1,4 +1,21 @@
|
|||||||
package com.github.nacabaro.vbhelper.domain.device_data
|
package com.github.nacabaro.vbhelper.domain.device_data
|
||||||
|
|
||||||
class VBCharacterData {
|
import androidx.room.Entity
|
||||||
}
|
import androidx.room.ForeignKey
|
||||||
|
import androidx.room.PrimaryKey
|
||||||
|
|
||||||
|
@Entity(
|
||||||
|
foreignKeys = [
|
||||||
|
ForeignKey(
|
||||||
|
entity = UserCharacter::class,
|
||||||
|
parentColumns = ["id"],
|
||||||
|
childColumns = ["id"],
|
||||||
|
onDelete = ForeignKey.CASCADE
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
data class VBCharacterData (
|
||||||
|
@PrimaryKey val id: Long,
|
||||||
|
val generation: Int,
|
||||||
|
val totalTrophies: Int
|
||||||
|
)
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.domain.device_data
|
||||||
|
|
||||||
|
import androidx.room.Entity
|
||||||
|
import androidx.room.ForeignKey
|
||||||
|
import androidx.room.PrimaryKey
|
||||||
|
|
||||||
|
@Entity(
|
||||||
|
foreignKeys = [
|
||||||
|
ForeignKey(
|
||||||
|
entity = UserCharacter::class,
|
||||||
|
parentColumns = ["id"],
|
||||||
|
childColumns = ["charId"],
|
||||||
|
onDelete = ForeignKey.CASCADE
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
data class VitalsHistory (
|
||||||
|
@PrimaryKey(autoGenerate = true) val id: Long = 0,
|
||||||
|
val charId: Long,
|
||||||
|
val year: Int,
|
||||||
|
val month: Int,
|
||||||
|
val day: Int,
|
||||||
|
val vitalPoints: Int
|
||||||
|
)
|
||||||
@@ -3,6 +3,13 @@ package com.github.nacabaro.vbhelper.domain.items
|
|||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
|
|
||||||
|
enum class ItemType {
|
||||||
|
VBITEM,
|
||||||
|
BEITEM,
|
||||||
|
UNIVERSAL,
|
||||||
|
SPECIALMISSION
|
||||||
|
}
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
data class Items(
|
data class Items(
|
||||||
@PrimaryKey val id: Long,
|
@PrimaryKey val id: Long,
|
||||||
@@ -11,5 +18,6 @@ data class Items(
|
|||||||
val itemIcon: Int,
|
val itemIcon: Int,
|
||||||
val itemLength: Int,
|
val itemLength: Int,
|
||||||
val price: Int,
|
val price: Int,
|
||||||
val quantity: Int
|
val quantity: Int,
|
||||||
|
val itemType: ItemType
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ object CharacterDtos {
|
|||||||
var stage: Int,
|
var stage: Int,
|
||||||
var attribute: NfcCharacter.Attribute,
|
var attribute: NfcCharacter.Attribute,
|
||||||
var ageInDays: Int,
|
var ageInDays: Int,
|
||||||
var nextAdventureMissionStage: Int, // next adventure mission stage on the character's dim
|
|
||||||
var mood: Int,
|
var mood: Int,
|
||||||
var vitalPoints: Int,
|
var vitalPoints: Int,
|
||||||
var transformationCountdown: Int,
|
var transformationCountdown: Int,
|
||||||
@@ -25,6 +24,7 @@ object CharacterDtos {
|
|||||||
var heartRateCurrent: Int,
|
var heartRateCurrent: Int,
|
||||||
var characterType: DeviceType,
|
var characterType: DeviceType,
|
||||||
val spriteIdle: ByteArray,
|
val spriteIdle: ByteArray,
|
||||||
|
val spriteIdle2: ByteArray,
|
||||||
val spriteWidth: Int,
|
val spriteWidth: Int,
|
||||||
val spriteHeight: Int,
|
val spriteHeight: Int,
|
||||||
val nameSprite: ByteArray,
|
val nameSprite: ByteArray,
|
||||||
@@ -34,9 +34,11 @@ object CharacterDtos {
|
|||||||
val isInAdventure: Boolean
|
val isInAdventure: Boolean
|
||||||
)
|
)
|
||||||
|
|
||||||
data class DiMInfo(
|
data class CardCharacterInfo(
|
||||||
val cardId: Int,
|
val cardId: Int,
|
||||||
val charId: Int
|
val charId: Int,
|
||||||
|
val stage: Int,
|
||||||
|
val attribute: NfcCharacter.Attribute
|
||||||
)
|
)
|
||||||
|
|
||||||
data class TransformationHistory(
|
data class TransformationHistory(
|
||||||
@@ -62,7 +64,6 @@ object CharacterDtos {
|
|||||||
var stage: Int,
|
var stage: Int,
|
||||||
var attribute: NfcCharacter.Attribute,
|
var attribute: NfcCharacter.Attribute,
|
||||||
var ageInDays: Int,
|
var ageInDays: Int,
|
||||||
var nextAdventureMissionStage: Int, // next adventure mission stage on the character's dim
|
|
||||||
var mood: Int,
|
var mood: Int,
|
||||||
var vitalPoints: Int,
|
var vitalPoints: Int,
|
||||||
var transformationCountdown: Int,
|
var transformationCountdown: Int,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package com.github.nacabaro.vbhelper.dtos
|
package com.github.nacabaro.vbhelper.dtos
|
||||||
|
|
||||||
|
import com.github.nacabaro.vbhelper.domain.items.ItemType
|
||||||
|
|
||||||
|
|
||||||
object ItemDtos {
|
object ItemDtos {
|
||||||
data class ItemsWithQuantities(
|
data class ItemsWithQuantities(
|
||||||
@@ -10,6 +12,7 @@ object ItemDtos {
|
|||||||
val itemLength: Int,
|
val itemLength: Int,
|
||||||
val price: Int,
|
val price: Int,
|
||||||
val quantity: Int,
|
val quantity: Int,
|
||||||
|
val itemType: ItemType
|
||||||
)
|
)
|
||||||
|
|
||||||
data class PurchasedItem(
|
data class PurchasedItem(
|
||||||
@@ -18,6 +21,7 @@ object ItemDtos {
|
|||||||
val itemDescription: String,
|
val itemDescription: String,
|
||||||
val itemIcon: Int,
|
val itemIcon: Int,
|
||||||
val itemLength: Int,
|
val itemLength: Int,
|
||||||
val itemAmount: Int
|
val itemAmount: Int,
|
||||||
|
val itemType: ItemType
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -1,12 +1,23 @@
|
|||||||
package com.github.nacabaro.vbhelper.navigation
|
package com.github.nacabaro.vbhelper.navigation
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.compose.animation.core.tween
|
||||||
|
import androidx.compose.animation.fadeIn
|
||||||
|
import androidx.compose.animation.fadeOut
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.material3.Scaffold
|
import androidx.compose.material3.Scaffold
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
|
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.Modifier
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.navigation.compose.NavHost
|
import androidx.navigation.compose.NavHost
|
||||||
import androidx.navigation.compose.composable
|
import androidx.navigation.compose.composable
|
||||||
import androidx.navigation.compose.rememberNavController
|
import androidx.navigation.compose.rememberNavController
|
||||||
|
import com.github.nacabaro.vbhelper.di.VBHelper
|
||||||
import com.github.nacabaro.vbhelper.screens.BattlesScreen
|
import com.github.nacabaro.vbhelper.screens.BattlesScreen
|
||||||
import com.github.nacabaro.vbhelper.screens.DexScreen
|
import com.github.nacabaro.vbhelper.screens.DexScreen
|
||||||
import com.github.nacabaro.vbhelper.screens.DiMScreen
|
import com.github.nacabaro.vbhelper.screens.DiMScreen
|
||||||
@@ -15,7 +26,7 @@ import com.github.nacabaro.vbhelper.screens.itemsScreen.ItemsScreen
|
|||||||
import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreen
|
import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreen
|
||||||
import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreenControllerImpl
|
import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreenControllerImpl
|
||||||
import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreen
|
import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreen
|
||||||
import com.github.nacabaro.vbhelper.screens.SpriteViewer
|
import com.github.nacabaro.vbhelper.screens.spriteViewer.SpriteViewer
|
||||||
import com.github.nacabaro.vbhelper.screens.homeScreens.HomeScreenControllerImpl
|
import com.github.nacabaro.vbhelper.screens.homeScreens.HomeScreenControllerImpl
|
||||||
import com.github.nacabaro.vbhelper.screens.storageScreen.StorageScreen
|
import com.github.nacabaro.vbhelper.screens.storageScreen.StorageScreen
|
||||||
import com.github.nacabaro.vbhelper.screens.itemsScreen.ChooseCharacterScreen
|
import com.github.nacabaro.vbhelper.screens.itemsScreen.ChooseCharacterScreen
|
||||||
@@ -23,7 +34,10 @@ import com.github.nacabaro.vbhelper.screens.itemsScreen.ItemsScreenControllerImp
|
|||||||
import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreenControllerImpl
|
import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreenControllerImpl
|
||||||
import com.github.nacabaro.vbhelper.screens.adventureScreen.AdventureScreen
|
import com.github.nacabaro.vbhelper.screens.adventureScreen.AdventureScreen
|
||||||
import com.github.nacabaro.vbhelper.screens.adventureScreen.AdventureScreenControllerImpl
|
import com.github.nacabaro.vbhelper.screens.adventureScreen.AdventureScreenControllerImpl
|
||||||
|
import com.github.nacabaro.vbhelper.screens.settingsScreen.CreditsScreen
|
||||||
|
import com.github.nacabaro.vbhelper.screens.spriteViewer.SpriteViewerControllerImpl
|
||||||
import com.github.nacabaro.vbhelper.screens.storageScreen.StorageScreenControllerImpl
|
import com.github.nacabaro.vbhelper.screens.storageScreen.StorageScreenControllerImpl
|
||||||
|
import com.github.nacabaro.vbhelper.source.StorageRepository
|
||||||
|
|
||||||
data class AppNavigationHandlers(
|
data class AppNavigationHandlers(
|
||||||
val settingsScreenController: SettingsScreenControllerImpl,
|
val settingsScreenController: SettingsScreenControllerImpl,
|
||||||
@@ -31,7 +45,8 @@ data class AppNavigationHandlers(
|
|||||||
val itemsScreenController: ItemsScreenControllerImpl,
|
val itemsScreenController: ItemsScreenControllerImpl,
|
||||||
val adventureScreenController: AdventureScreenControllerImpl,
|
val adventureScreenController: AdventureScreenControllerImpl,
|
||||||
val storageScreenController: StorageScreenControllerImpl,
|
val storageScreenController: StorageScreenControllerImpl,
|
||||||
val homeScreenController: HomeScreenControllerImpl
|
val homeScreenController: HomeScreenControllerImpl,
|
||||||
|
val spriteViewerController: SpriteViewerControllerImpl
|
||||||
)
|
)
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@@ -48,8 +63,19 @@ fun AppNavigation(
|
|||||||
NavHost(
|
NavHost(
|
||||||
navController = navController,
|
navController = navController,
|
||||||
startDestination = NavigationItems.Home.route,
|
startDestination = NavigationItems.Home.route,
|
||||||
|
enterTransition = {
|
||||||
|
fadeIn(
|
||||||
|
animationSpec = tween(200)
|
||||||
|
)
|
||||||
|
},
|
||||||
|
exitTransition = {
|
||||||
|
fadeOut(
|
||||||
|
animationSpec = tween(200)
|
||||||
|
)
|
||||||
|
},
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(contentPadding)
|
.padding(contentPadding)
|
||||||
|
|
||||||
) {
|
) {
|
||||||
composable(NavigationItems.Battles.route) {
|
composable(NavigationItems.Battles.route) {
|
||||||
BattlesScreen()
|
BattlesScreen()
|
||||||
@@ -69,12 +95,29 @@ fun AppNavigation(
|
|||||||
}
|
}
|
||||||
composable(NavigationItems.Scan.route) {
|
composable(NavigationItems.Scan.route) {
|
||||||
val characterIdString = it.arguments?.getString("characterId")
|
val characterIdString = it.arguments?.getString("characterId")
|
||||||
val characterId = characterIdString?.toLongOrNull()
|
var characterId by remember { mutableStateOf(characterIdString?.toLongOrNull()) }
|
||||||
|
Log.d("ScanScreen", "characterId: $characterId")
|
||||||
|
val launchedFromHomeScreen = (characterIdString?.toLongOrNull() == null)
|
||||||
|
|
||||||
|
if (characterId == null) {
|
||||||
|
val context = LocalContext.current.applicationContext as VBHelper
|
||||||
|
val storageRepository = StorageRepository(context.container.db)
|
||||||
|
|
||||||
|
LaunchedEffect(characterId) {
|
||||||
|
if (characterId == null) {
|
||||||
|
val characterData = storageRepository.getActiveCharacter()
|
||||||
|
if (characterData != null) {
|
||||||
|
characterId = characterData.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ScanScreen(
|
ScanScreen(
|
||||||
navController = navController,
|
navController = navController,
|
||||||
scanScreenController = applicationNavigationHandlers.scanScreenController,
|
scanScreenController = applicationNavigationHandlers.scanScreenController,
|
||||||
characterId = characterId
|
characterId = characterId,
|
||||||
|
launchedFromHomeScreen = launchedFromHomeScreen
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
composable(NavigationItems.Dex.route) {
|
composable(NavigationItems.Dex.route) {
|
||||||
@@ -90,7 +133,8 @@ fun AppNavigation(
|
|||||||
}
|
}
|
||||||
composable(NavigationItems.Viewer.route) {
|
composable(NavigationItems.Viewer.route) {
|
||||||
SpriteViewer(
|
SpriteViewer(
|
||||||
navController = navController
|
navController = navController,
|
||||||
|
spriteViewerController = applicationNavigationHandlers.spriteViewerController
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
composable(NavigationItems.CardView.route) {
|
composable(NavigationItems.CardView.route) {
|
||||||
@@ -125,6 +169,11 @@ fun AppNavigation(
|
|||||||
.adventureScreenController
|
.adventureScreenController
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
composable(NavigationItems.Credits.route) {
|
||||||
|
CreditsScreen(
|
||||||
|
navController = navController
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ fun BottomNavigationBar(navController: NavController) {
|
|||||||
NavigationItems.Dex,
|
NavigationItems.Dex,
|
||||||
NavigationItems.Storage,
|
NavigationItems.Storage,
|
||||||
)
|
)
|
||||||
|
|
||||||
NavigationBar {
|
NavigationBar {
|
||||||
val currentBackStackEntry = navController.currentBackStackEntryAsState()
|
val currentBackStackEntry = navController.currentBackStackEntryAsState()
|
||||||
val currentRoute = currentBackStackEntry.value?.destination?.route
|
val currentRoute = currentBackStackEntry.value?.destination?.route
|
||||||
|
|||||||
@@ -20,4 +20,5 @@ sealed class NavigationItems (
|
|||||||
object ItemsStore : NavigationItems("ItemsStore", R.drawable.baseline_data_24, "Items store")
|
object ItemsStore : NavigationItems("ItemsStore", R.drawable.baseline_data_24, "Items store")
|
||||||
object ApplyItem : NavigationItems("ApplyItem/{itemId}", R.drawable.baseline_data_24, "Apply item")
|
object ApplyItem : NavigationItems("ApplyItem/{itemId}", R.drawable.baseline_data_24, "Apply item")
|
||||||
object Adventure : NavigationItems("Adventure", R.drawable.baseline_fort_24, "Adventure")
|
object Adventure : NavigationItems("Adventure", R.drawable.baseline_fort_24, "Adventure")
|
||||||
|
object Credits : NavigationItems("Credits", R.drawable.baseline_data_24, "Credits")
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,33 @@
|
|||||||
package com.github.nacabaro.vbhelper.screens
|
package com.github.nacabaro.vbhelper.screens
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.material3.Scaffold
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import com.github.nacabaro.vbhelper.components.TopBanner
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BattlesScreen() {
|
fun BattlesScreen() {
|
||||||
Text("Battles Screen")
|
Scaffold (
|
||||||
|
topBar = {
|
||||||
|
TopBanner(
|
||||||
|
text = "Online battles"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
) { contentPadding ->
|
||||||
|
Column(
|
||||||
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
|
verticalArrangement = Arrangement.Center,
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(top = contentPadding.calculateTopPadding())
|
||||||
|
.fillMaxSize()
|
||||||
|
) {
|
||||||
|
Text("Coming soon")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import com.github.nacabaro.vbhelper.utils.BitmapData
|
|||||||
import com.github.nacabaro.vbhelper.components.DexDiMEntry
|
import com.github.nacabaro.vbhelper.components.DexDiMEntry
|
||||||
import com.github.nacabaro.vbhelper.components.TopBanner
|
import com.github.nacabaro.vbhelper.components.TopBanner
|
||||||
import com.github.nacabaro.vbhelper.di.VBHelper
|
import com.github.nacabaro.vbhelper.di.VBHelper
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Card
|
|
||||||
import com.github.nacabaro.vbhelper.dtos.CardDtos
|
import com.github.nacabaro.vbhelper.dtos.CardDtos
|
||||||
import com.github.nacabaro.vbhelper.navigation.NavigationItems
|
import com.github.nacabaro.vbhelper.navigation.NavigationItems
|
||||||
import com.github.nacabaro.vbhelper.source.DexRepository
|
import com.github.nacabaro.vbhelper.source.DexRepository
|
||||||
|
|||||||
+3
-2
@@ -72,7 +72,7 @@ class AdventureScreenControllerImpl(
|
|||||||
private suspend fun generateItem(characterId: Long): ItemDtos.PurchasedItem {
|
private suspend fun generateItem(characterId: Long): ItemDtos.PurchasedItem {
|
||||||
val character = database
|
val character = database
|
||||||
.userCharacterDao()
|
.userCharacterDao()
|
||||||
.getCharacter(characterId)
|
.getCharacterInfo(characterId)
|
||||||
|
|
||||||
val randomItem = database
|
val randomItem = database
|
||||||
.itemDao()
|
.itemDao()
|
||||||
@@ -94,7 +94,8 @@ class AdventureScreenControllerImpl(
|
|||||||
itemName = randomItem.name,
|
itemName = randomItem.name,
|
||||||
itemIcon = randomItem.itemIcon,
|
itemIcon = randomItem.itemIcon,
|
||||||
itemLength = randomItem.itemLength,
|
itemLength = randomItem.itemLength,
|
||||||
itemDescription = randomItem.description
|
itemDescription = randomItem.description,
|
||||||
|
itemType = randomItem.itemType
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.screens.homeScreens
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.Spacer
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.material3.Button
|
||||||
|
import androidx.compose.material3.Card
|
||||||
|
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.window.Dialog
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun BetaWarning(
|
||||||
|
onDismissRequest: () -> Unit
|
||||||
|
) {
|
||||||
|
Dialog(
|
||||||
|
onDismissRequest = onDismissRequest
|
||||||
|
) {
|
||||||
|
Card {
|
||||||
|
Column (
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(16.dp)
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = "This application is currently in alpha and it is not complete. Do not use to store important characters for you, as any future updates might delete all your characters. Sorry for the inconvenience!"
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.padding(8.dp))
|
||||||
|
Text(
|
||||||
|
text = "Application should work now with the original VB and the VH."
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.padding(8.dp))
|
||||||
|
Text(
|
||||||
|
text = "Thank you for your understanding and patience. Sincerely, the dev team."
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.padding(8.dp))
|
||||||
|
Button(
|
||||||
|
onClick = onDismissRequest
|
||||||
|
) {
|
||||||
|
Text(text = "Dismiss")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.github.nacabaro.vbhelper.screens.homeScreens
|
package com.github.nacabaro.vbhelper.screens.homeScreens
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
@@ -27,9 +28,15 @@ import com.github.nacabaro.vbhelper.components.TopBanner
|
|||||||
import com.github.nacabaro.vbhelper.di.VBHelper
|
import com.github.nacabaro.vbhelper.di.VBHelper
|
||||||
import com.github.nacabaro.vbhelper.utils.DeviceType
|
import com.github.nacabaro.vbhelper.utils.DeviceType
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData
|
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.domain.device_data.VBCharacterData
|
||||||
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
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.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 com.github.nacabaro.vbhelper.source.StorageRepository
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
@@ -45,14 +52,21 @@ fun HomeScreen(
|
|||||||
val transformationHistory = remember { mutableStateOf<List<CharacterDtos.TransformationHistory>?>(null) }
|
val transformationHistory = remember { mutableStateOf<List<CharacterDtos.TransformationHistory>?>(null) }
|
||||||
val beData = remember { mutableStateOf<BECharacterData?>(null) }
|
val beData = remember { mutableStateOf<BECharacterData?>(null) }
|
||||||
val vbData = remember { mutableStateOf<VBCharacterData?>(null) }
|
val vbData = remember { mutableStateOf<VBCharacterData?>(null) }
|
||||||
|
val vbSpecialMissions = remember { mutableStateOf<List<SpecialMissions>>(emptyList()) }
|
||||||
var adventureMissionsFinished by rememberSaveable { mutableStateOf(false) }
|
var adventureMissionsFinished by rememberSaveable { mutableStateOf(false) }
|
||||||
|
var betaWarning by rememberSaveable { mutableStateOf(true) }
|
||||||
|
var collectedItem by remember { mutableStateOf<ItemDtos.PurchasedItem?>(null) }
|
||||||
|
|
||||||
LaunchedEffect(storageRepository, activeMon) {
|
LaunchedEffect(storageRepository, activeMon, collectedItem) {
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
activeMon.value = storageRepository.getActiveCharacter()
|
activeMon.value = storageRepository.getActiveCharacter()
|
||||||
if (activeMon.value != null) {
|
if (activeMon.value != null && activeMon.value!!.characterType == DeviceType.BEDevice) {
|
||||||
beData.value = storageRepository.getCharacterBeData(activeMon.value!!.id)
|
beData.value = storageRepository.getCharacterBeData(activeMon.value!!.id)
|
||||||
transformationHistory.value = storageRepository.getTransformationHistory(activeMon.value!!.id)
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -78,6 +92,7 @@ fun HomeScreen(
|
|||||||
}
|
}
|
||||||
) { contentPadding ->
|
) { contentPadding ->
|
||||||
if (activeMon.value == null || (beData.value == null && vbData.value == null) || transformationHistory.value == null) {
|
if (activeMon.value == null || (beData.value == null && vbData.value == null) || transformationHistory.value == null) {
|
||||||
|
Log.d("TetTet", "Something is null")
|
||||||
Column (
|
Column (
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
verticalArrangement = Arrangement.Center,
|
verticalArrangement = Arrangement.Center,
|
||||||
@@ -88,6 +103,7 @@ fun HomeScreen(
|
|||||||
Text(text = "Nothing to see here")
|
Text(text = "Nothing to see here")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Log.d("TetTet", "Something is not null")
|
||||||
if (activeMon.value!!.isBemCard) {
|
if (activeMon.value!!.isBemCard) {
|
||||||
BEBEmHomeScreen(
|
BEBEmHomeScreen(
|
||||||
activeMon = activeMon.value!!,
|
activeMon = activeMon.value!!,
|
||||||
@@ -107,12 +123,26 @@ fun HomeScreen(
|
|||||||
activeMon = activeMon.value!!,
|
activeMon = activeMon.value!!,
|
||||||
vbData = vbData.value!!,
|
vbData = vbData.value!!,
|
||||||
transformationHistory = transformationHistory.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) {
|
if (adventureMissionsFinished) {
|
||||||
Dialog(
|
Dialog(
|
||||||
onDismissRequest = { adventureMissionsFinished = false },
|
onDismissRequest = { adventureMissionsFinished = false },
|
||||||
@@ -140,6 +170,12 @@ fun HomeScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (betaWarning) {
|
||||||
|
BetaWarning {
|
||||||
|
betaWarning = false
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+3
@@ -1,5 +1,8 @@
|
|||||||
package com.github.nacabaro.vbhelper.screens.homeScreens
|
package com.github.nacabaro.vbhelper.screens.homeScreens
|
||||||
|
|
||||||
|
import com.github.nacabaro.vbhelper.dtos.ItemDtos
|
||||||
|
|
||||||
interface HomeScreenController {
|
interface HomeScreenController {
|
||||||
fun didAdventureMissionsFinish(onCompletion: (Boolean) -> Unit)
|
fun didAdventureMissionsFinish(onCompletion: (Boolean) -> Unit)
|
||||||
|
fun clearSpecialMission(missionId: Long, onCleared: (ItemDtos.PurchasedItem) -> Unit)
|
||||||
}
|
}
|
||||||
+37
@@ -3,8 +3,11 @@ package com.github.nacabaro.vbhelper.screens.homeScreens
|
|||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.github.nacabaro.vbhelper.di.VBHelper
|
import com.github.nacabaro.vbhelper.di.VBHelper
|
||||||
|
import com.github.nacabaro.vbhelper.dtos.ItemDtos
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
|
import kotlin.math.roundToInt
|
||||||
|
import kotlin.random.Random
|
||||||
|
|
||||||
class HomeScreenControllerImpl(
|
class HomeScreenControllerImpl(
|
||||||
private val componentActivity: ComponentActivity,
|
private val componentActivity: ComponentActivity,
|
||||||
@@ -26,4 +29,38 @@ class HomeScreenControllerImpl(
|
|||||||
onCompletion(finishedAdventureCharacters.isNotEmpty())
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
package com.github.nacabaro.vbhelper.screens.homeScreens
|
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.PaddingValues
|
|
||||||
import androidx.compose.runtime.Composable
|
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.VBCharacterData
|
|
||||||
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun VBDiMHomeScreen(
|
|
||||||
activeMon: CharacterDtos.CharacterWithSprites,
|
|
||||||
vbData: VBCharacterData,
|
|
||||||
transformationHistory: List<CharacterDtos.TransformationHistory>,
|
|
||||||
contentPadding: PaddingValues
|
|
||||||
) {
|
|
||||||
TODO("Not implemented yet")
|
|
||||||
}
|
|
||||||
+1
-1
@@ -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.Column
|
||||||
import androidx.compose.foundation.layout.PaddingValues
|
import androidx.compose.foundation.layout.PaddingValues
|
||||||
+1
-1
@@ -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.Column
|
||||||
import androidx.compose.foundation.layout.PaddingValues
|
import androidx.compose.foundation.layout.PaddingValues
|
||||||
+189
@@ -0,0 +1,189 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.screens.homeScreens.screens
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.PaddingValues
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.aspectRatio
|
||||||
|
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
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun VBDiMHomeScreen(
|
||||||
|
activeMon: CharacterDtos.CharacterWithSprites,
|
||||||
|
vbData: VBCharacterData,
|
||||||
|
specialMissions: List<SpecialMissions>,
|
||||||
|
homeScreenController: HomeScreenControllerImpl,
|
||||||
|
transformationHistory: List<CharacterDtos.TransformationHistory>,
|
||||||
|
contentPadding: PaddingValues,
|
||||||
|
onClickCollect: (ItemDtos.PurchasedItem) -> Unit
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(top = contentPadding.calculateTopPadding())
|
||||||
|
.verticalScroll(state = rememberScrollState())
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
) {
|
||||||
|
CharacterEntry(
|
||||||
|
icon = BitmapData(
|
||||||
|
bitmap = activeMon.spriteIdle,
|
||||||
|
width = activeMon.spriteWidth,
|
||||||
|
height = activeMon.spriteHeight
|
||||||
|
),
|
||||||
|
multiplier = 8,
|
||||||
|
shape = androidx.compose.material.MaterialTheme.shapes.small,
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.aspectRatio(1f)
|
||||||
|
)
|
||||||
|
Column(
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(0.5f)
|
||||||
|
.aspectRatio(0.5f)
|
||||||
|
) {
|
||||||
|
ItemDisplay(
|
||||||
|
icon = R.drawable.baseline_vitals_24,
|
||||||
|
textValue = activeMon.vitalPoints.toString(),
|
||||||
|
definition = "Vitals",
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(0.5f)
|
||||||
|
.aspectRatio(1f)
|
||||||
|
.padding(8.dp)
|
||||||
|
)
|
||||||
|
ItemDisplay(
|
||||||
|
icon = R.drawable.baseline_trophy_24,
|
||||||
|
textValue = activeMon.trophies.toString(),
|
||||||
|
definition = "Trophies",
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(0.5f)
|
||||||
|
.aspectRatio(1f)
|
||||||
|
.padding(8.dp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Row(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
) {
|
||||||
|
ItemDisplay(
|
||||||
|
icon = R.drawable.baseline_mood_24,
|
||||||
|
textValue = activeMon.mood.toString(),
|
||||||
|
definition = "Mood",
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.aspectRatio(1f)
|
||||||
|
.padding(8.dp)
|
||||||
|
)
|
||||||
|
val transformationCountdownInHours = activeMon.transformationCountdown / 60
|
||||||
|
ItemDisplay(
|
||||||
|
icon = R.drawable.baseline_next_24,
|
||||||
|
textValue = when (transformationCountdownInHours) {
|
||||||
|
0 -> "${activeMon.transformationCountdown} m"
|
||||||
|
else -> "$transformationCountdownInHours h"
|
||||||
|
},
|
||||||
|
definition = "Next timer",
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.aspectRatio(1f)
|
||||||
|
.padding(8.dp)
|
||||||
|
)
|
||||||
|
ItemDisplay(
|
||||||
|
icon = R.drawable.baseline_swords_24,
|
||||||
|
textValue = when {
|
||||||
|
activeMon.totalBattlesLost == 0 -> "0.00 %"
|
||||||
|
else -> {
|
||||||
|
val battleWinPercentage =
|
||||||
|
activeMon.totalBattlesWon.toFloat() / (activeMon.totalBattlesWon + activeMon.totalBattlesLost).toFloat()
|
||||||
|
String.format(
|
||||||
|
Locale.getDefault(),
|
||||||
|
"%.2f",
|
||||||
|
battleWinPercentage * 100
|
||||||
|
) + " %" // Specify locale
|
||||||
|
}
|
||||||
|
},
|
||||||
|
definition = "Total battle win %",
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.aspectRatio(1f)
|
||||||
|
.padding(8.dp)
|
||||||
|
)
|
||||||
|
ItemDisplay(
|
||||||
|
icon = R.drawable.baseline_swords_24,
|
||||||
|
textValue = when {
|
||||||
|
activeMon.totalBattlesLost == 0 -> "0.00 %"
|
||||||
|
else -> {
|
||||||
|
val battleWinPercentage =
|
||||||
|
activeMon.currentPhaseBattlesWon.toFloat() / (activeMon.currentPhaseBattlesWon + activeMon.currentPhaseBattlesLost).toFloat()
|
||||||
|
String.format(
|
||||||
|
Locale.getDefault(),
|
||||||
|
"%.2f",
|
||||||
|
battleWinPercentage * 100
|
||||||
|
) + " %" // Specify locale
|
||||||
|
}
|
||||||
|
},
|
||||||
|
definition = "Current phase win %",
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.aspectRatio(1f)
|
||||||
|
.padding(8.dp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Row(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
) {
|
||||||
|
TransformationHistoryCard(
|
||||||
|
transformationHistory = transformationHistory,
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+17
@@ -19,7 +19,9 @@ import androidx.navigation.NavController
|
|||||||
import com.github.nacabaro.vbhelper.components.CharacterEntry
|
import com.github.nacabaro.vbhelper.components.CharacterEntry
|
||||||
import com.github.nacabaro.vbhelper.components.TopBanner
|
import com.github.nacabaro.vbhelper.components.TopBanner
|
||||||
import com.github.nacabaro.vbhelper.di.VBHelper
|
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.CharacterDtos
|
||||||
|
import com.github.nacabaro.vbhelper.dtos.ItemDtos
|
||||||
import com.github.nacabaro.vbhelper.source.StorageRepository
|
import com.github.nacabaro.vbhelper.source.StorageRepository
|
||||||
import com.github.nacabaro.vbhelper.utils.BitmapData
|
import com.github.nacabaro.vbhelper.utils.BitmapData
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
@@ -39,12 +41,27 @@ fun ChooseCharacterScreen(
|
|||||||
}
|
}
|
||||||
|
|
||||||
var selectedCharacter by remember { mutableStateOf<Long?>(null) }
|
var selectedCharacter by remember { mutableStateOf<Long?>(null) }
|
||||||
|
var selectedItem by remember { mutableStateOf<ItemDtos.ItemsWithQuantities?>(null) }
|
||||||
|
|
||||||
LaunchedEffect(storageRepository) {
|
LaunchedEffect(storageRepository) {
|
||||||
coroutineScope.launch {
|
coroutineScope.launch {
|
||||||
|
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()
|
characterList.value = storageRepository.getAllCharacters()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LaunchedEffect (selectedCharacter) {
|
LaunchedEffect (selectedCharacter) {
|
||||||
if (selectedCharacter != null) {
|
if (selectedCharacter != null) {
|
||||||
|
|||||||
+93
-10
@@ -2,9 +2,12 @@ package com.github.nacabaro.vbhelper.screens.itemsScreen
|
|||||||
|
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.lifecycle.lifecycleScope
|
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.database.AppDatabase
|
||||||
import com.github.nacabaro.vbhelper.di.VBHelper
|
import com.github.nacabaro.vbhelper.di.VBHelper
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData
|
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.dtos.ItemDtos
|
||||||
import com.github.nacabaro.vbhelper.utils.DeviceType
|
import com.github.nacabaro.vbhelper.utils.DeviceType
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@@ -24,7 +27,15 @@ class ItemsScreenControllerImpl (
|
|||||||
AllTraining(5),
|
AllTraining(5),
|
||||||
EvoTimer(6),
|
EvoTimer(6),
|
||||||
LimitTimer(7),
|
LimitTimer(7),
|
||||||
Vitals(8)
|
Vitals(8),
|
||||||
|
Step8k(9),
|
||||||
|
Step4k(10),
|
||||||
|
Vitals1000(11),
|
||||||
|
Vitals250(12),
|
||||||
|
Battle20(13),
|
||||||
|
Battle5(14),
|
||||||
|
Win10(15),
|
||||||
|
Win4(16)
|
||||||
}
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
@@ -37,17 +48,20 @@ class ItemsScreenControllerImpl (
|
|||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
val item = getItem(itemId)
|
val item = getItem(itemId)
|
||||||
val characterData = database.userCharacterDao().getCharacter(characterId)
|
val characterData = database.userCharacterDao().getCharacter(characterId)
|
||||||
val beCharacterData: BECharacterData
|
var beCharacterData: BECharacterData? = null
|
||||||
//var vbCharacterData: VBCharacterData
|
var vbCharacterData: VBCharacterData? = null
|
||||||
|
|
||||||
if (characterData.characterType == DeviceType.BEDevice) {
|
if (characterData.characterType == DeviceType.BEDevice) {
|
||||||
beCharacterData = database.userCharacterDao().getBeData(characterId)
|
beCharacterData = database.userCharacterDao().getBeData(characterId)
|
||||||
} else {
|
} else if (characterData.characterType == DeviceType.VBDevice) {
|
||||||
TODO("Not implemented")
|
vbCharacterData = database.userCharacterDao().getVbData(characterId)
|
||||||
//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.itemType = item.itemIcon
|
||||||
beCharacterData.itemMultiplier = 3
|
beCharacterData.itemMultiplier = 3
|
||||||
beCharacterData.itemRemainingTime = item.itemLength
|
beCharacterData.itemRemainingTime = item.itemLength
|
||||||
@@ -72,7 +86,11 @@ class ItemsScreenControllerImpl (
|
|||||||
.userCharacterDao()
|
.userCharacterDao()
|
||||||
.updateCharacter(characterData)
|
.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
|
beCharacterData.remainingTrainingTimeInMinutes += item.itemLength
|
||||||
if (beCharacterData.remainingTrainingTimeInMinutes > 6000) {
|
if (beCharacterData.remainingTrainingTimeInMinutes > 6000) {
|
||||||
beCharacterData.remainingTrainingTimeInMinutes = 6000
|
beCharacterData.remainingTrainingTimeInMinutes = 6000
|
||||||
@@ -93,6 +111,12 @@ class ItemsScreenControllerImpl (
|
|||||||
database
|
database
|
||||||
.userCharacterDao()
|
.userCharacterDao()
|
||||||
.updateCharacter(characterData)
|
.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)
|
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
|
return database
|
||||||
.itemDao()
|
.itemDao()
|
||||||
.getItem(itemId)
|
.getItem(itemId)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun consumeItem(itemId: Long) {
|
private suspend fun consumeItem(itemId: Long) {
|
||||||
database
|
database
|
||||||
.itemDao()
|
.itemDao()
|
||||||
.useItem(itemId)
|
.useItem(itemId)
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ import com.github.nacabaro.vbhelper.navigation.NavigationItems
|
|||||||
import com.github.nacabaro.vbhelper.source.StorageRepository
|
import com.github.nacabaro.vbhelper.source.StorageRepository
|
||||||
import com.github.nacabaro.vbhelper.source.isMissingSecrets
|
import com.github.nacabaro.vbhelper.source.isMissingSecrets
|
||||||
import com.github.nacabaro.vbhelper.source.proto.Secrets
|
import com.github.nacabaro.vbhelper.source.proto.Secrets
|
||||||
import com.github.nacabaro.vbhelper.utils.characterToNfc
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
@@ -46,30 +45,41 @@ fun ScanScreen(
|
|||||||
navController: NavController,
|
navController: NavController,
|
||||||
characterId: Long?,
|
characterId: Long?,
|
||||||
scanScreenController: ScanScreenController,
|
scanScreenController: ScanScreenController,
|
||||||
|
launchedFromHomeScreen: Boolean
|
||||||
) {
|
) {
|
||||||
val secrets by scanScreenController.secretsFlow.collectAsState(null)
|
val secrets by scanScreenController.secretsFlow.collectAsState(null)
|
||||||
var readingScreen by remember { mutableStateOf(false) }
|
|
||||||
var writingScreen by remember { mutableStateOf(false) }
|
|
||||||
var isDoneReadingCharacter by remember { mutableStateOf(false) }
|
|
||||||
var isDoneSendingCard by remember { mutableStateOf(false) }
|
|
||||||
var isDoneWritingCharacter by remember { mutableStateOf(false) }
|
|
||||||
|
|
||||||
val application = LocalContext.current.applicationContext as VBHelper
|
val application = LocalContext.current.applicationContext as VBHelper
|
||||||
val storageRepository = StorageRepository(application.container.db)
|
val storageRepository = StorageRepository(application.container.db)
|
||||||
var nfcCharacter by remember { mutableStateOf<NfcCharacter?>(null) }
|
var nfcCharacter by remember { mutableStateOf<NfcCharacter?>(null) }
|
||||||
|
|
||||||
val context = LocalContext.current
|
val context = LocalContext.current
|
||||||
|
|
||||||
LaunchedEffect(storageRepository) {
|
LaunchedEffect(storageRepository) {
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
|
/*
|
||||||
|
First check if there is a character sent through the navigation system
|
||||||
|
If there is not, that means we got here through the home screen nfc button
|
||||||
|
If we got here through the home screen, it does not hurt to check if there is
|
||||||
|
an active character.
|
||||||
|
*/
|
||||||
if (characterId != null && nfcCharacter == null) {
|
if (characterId != null && nfcCharacter == null) {
|
||||||
nfcCharacter = characterToNfc(context, characterId)
|
nfcCharacter = scanScreenController.characterToNfc(characterId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DisposableEffect(readingScreen || writingScreen, isDoneSendingCard) {
|
var readingScreen by remember { mutableStateOf(false) }
|
||||||
|
var writingScreen by remember { mutableStateOf(false) }
|
||||||
|
var isDoneReadingCharacter by remember { mutableStateOf(false) }
|
||||||
|
var isDoneSendingCard by remember { mutableStateOf(false) }
|
||||||
|
var isDoneWritingCharacter by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
|
DisposableEffect(readingScreen) {
|
||||||
if(readingScreen) {
|
if(readingScreen) {
|
||||||
scanScreenController.registerActivityLifecycleListener(SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER, object: ActivityLifecycleListener {
|
scanScreenController.registerActivityLifecycleListener(
|
||||||
|
SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER,
|
||||||
|
object: ActivityLifecycleListener {
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
scanScreenController.cancelRead()
|
scanScreenController.cancelRead()
|
||||||
}
|
}
|
||||||
@@ -79,12 +89,24 @@ fun ScanScreen(
|
|||||||
isDoneReadingCharacter = true
|
isDoneReadingCharacter = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
})
|
)
|
||||||
scanScreenController.onClickRead(secrets!!) {
|
scanScreenController.onClickRead(secrets!!) {
|
||||||
isDoneReadingCharacter = true
|
isDoneReadingCharacter = true
|
||||||
}
|
}
|
||||||
} else if (writingScreen) {
|
}
|
||||||
|
onDispose {
|
||||||
|
if(readingScreen) {
|
||||||
|
scanScreenController.unregisterActivityLifecycleListener(
|
||||||
|
SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER
|
||||||
|
)
|
||||||
|
scanScreenController.cancelRead()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DisposableEffect(writingScreen, isDoneSendingCard) {
|
||||||
|
if (writingScreen) {
|
||||||
scanScreenController.registerActivityLifecycleListener(
|
scanScreenController.registerActivityLifecycleListener(
|
||||||
SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER,
|
SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER,
|
||||||
object : ActivityLifecycleListener {
|
object : ActivityLifecycleListener {
|
||||||
@@ -105,6 +127,9 @@ fun ScanScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (secrets != null && nfcCharacter != null) {
|
||||||
if (!isDoneSendingCard) {
|
if (!isDoneSendingCard) {
|
||||||
scanScreenController.onClickCheckCard(secrets!!, nfcCharacter!!) {
|
scanScreenController.onClickCheckCard(secrets!!, nfcCharacter!!) {
|
||||||
isDoneSendingCard = true
|
isDoneSendingCard = true
|
||||||
@@ -115,8 +140,9 @@ fun ScanScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onDispose {
|
onDispose {
|
||||||
if(readingScreen || writingScreen) {
|
if(writingScreen) {
|
||||||
scanScreenController.unregisterActivityLifecycleListener(SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER)
|
scanScreenController.unregisterActivityLifecycleListener(SCAN_SCREEN_ACTIVITY_LIFECYCLE_LISTENER)
|
||||||
scanScreenController.cancelRead()
|
scanScreenController.cancelRead()
|
||||||
}
|
}
|
||||||
@@ -158,7 +184,7 @@ fun ScanScreen(
|
|||||||
} else {
|
} else {
|
||||||
ChooseConnectOption(
|
ChooseConnectOption(
|
||||||
onClickRead = when {
|
onClickRead = when {
|
||||||
characterId != null -> null
|
!launchedFromHomeScreen -> null
|
||||||
else -> {
|
else -> {
|
||||||
{
|
{
|
||||||
if(secrets == null) {
|
if(secrets == null) {
|
||||||
@@ -184,7 +210,8 @@ fun ScanScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
navController = navController
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -193,9 +220,17 @@ fun ScanScreen(
|
|||||||
fun ChooseConnectOption(
|
fun ChooseConnectOption(
|
||||||
onClickRead: (() -> Unit)? = null,
|
onClickRead: (() -> Unit)? = null,
|
||||||
onClickWrite: (() -> Unit)? = null,
|
onClickWrite: (() -> Unit)? = null,
|
||||||
|
navController: NavController
|
||||||
) {
|
) {
|
||||||
Scaffold(
|
Scaffold(
|
||||||
topBar = { TopBanner(text = "Scan a Vital Bracelet") }
|
topBar = {
|
||||||
|
TopBanner(
|
||||||
|
text = "Scan a Vital Bracelet",
|
||||||
|
onBackClick = {
|
||||||
|
navController.popBackStack()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
) { contentPadding ->
|
) { contentPadding ->
|
||||||
Column(
|
Column(
|
||||||
verticalArrangement = Arrangement.Center,
|
verticalArrangement = Arrangement.Center,
|
||||||
@@ -259,7 +294,10 @@ fun ScanScreenPreview() {
|
|||||||
override fun onClickCheckCard(secrets: Secrets, nfcCharacter: NfcCharacter, onComplete: () -> Unit) {}
|
override fun onClickCheckCard(secrets: Secrets, nfcCharacter: NfcCharacter, onComplete: () -> Unit) {}
|
||||||
override fun onClickWrite(secrets: Secrets, nfcCharacter: NfcCharacter, onComplete: () -> Unit) {}
|
override fun onClickWrite(secrets: Secrets, nfcCharacter: NfcCharacter, onComplete: () -> Unit) {}
|
||||||
override fun cancelRead() {}
|
override fun cancelRead() {}
|
||||||
|
override fun characterFromNfc(nfcCharacter: NfcCharacter): String { return "" }
|
||||||
|
override suspend fun characterToNfc(characterId: Long): NfcCharacter? { return null }
|
||||||
},
|
},
|
||||||
characterId = null
|
characterId = null,
|
||||||
|
launchedFromHomeScreen = false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
+3
@@ -15,4 +15,7 @@ interface ScanScreenController {
|
|||||||
|
|
||||||
fun registerActivityLifecycleListener(key: String, activityLifecycleListener: ActivityLifecycleListener)
|
fun registerActivityLifecycleListener(key: String, activityLifecycleListener: ActivityLifecycleListener)
|
||||||
fun unregisterActivityLifecycleListener(key: String)
|
fun unregisterActivityLifecycleListener(key: String)
|
||||||
|
|
||||||
|
fun characterFromNfc(nfcCharacter: NfcCharacter): String
|
||||||
|
suspend fun characterToNfc(characterId: Long): NfcCharacter?
|
||||||
}
|
}
|
||||||
+24
-102
@@ -15,18 +15,15 @@ import com.github.cfogrady.vbnfc.be.BENfcCharacter
|
|||||||
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
||||||
import com.github.cfogrady.vbnfc.vb.VBNfcCharacter
|
import com.github.cfogrady.vbnfc.vb.VBNfcCharacter
|
||||||
import com.github.nacabaro.vbhelper.ActivityLifecycleListener
|
import com.github.nacabaro.vbhelper.ActivityLifecycleListener
|
||||||
import com.github.nacabaro.vbhelper.di.VBHelper
|
import com.github.nacabaro.vbhelper.screens.scanScreen.converters.FromNfcConverter
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData
|
import com.github.nacabaro.vbhelper.screens.scanScreen.converters.ToNfcConverter
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter
|
|
||||||
import com.github.nacabaro.vbhelper.source.getCryptographicTransformerMap
|
import com.github.nacabaro.vbhelper.source.getCryptographicTransformerMap
|
||||||
import com.github.nacabaro.vbhelper.source.isMissingSecrets
|
import com.github.nacabaro.vbhelper.source.isMissingSecrets
|
||||||
import com.github.nacabaro.vbhelper.source.proto.Secrets
|
import com.github.nacabaro.vbhelper.source.proto.Secrets
|
||||||
import com.github.nacabaro.vbhelper.utils.DeviceType
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.stateIn
|
import kotlinx.coroutines.flow.stateIn
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import java.util.GregorianCalendar
|
|
||||||
|
|
||||||
class ScanScreenControllerImpl(
|
class ScanScreenControllerImpl(
|
||||||
override val secretsFlow: Flow<Secrets>,
|
override val secretsFlow: Flow<Secrets>,
|
||||||
@@ -49,7 +46,7 @@ class ScanScreenControllerImpl(
|
|||||||
override fun onClickRead(secrets: Secrets, onComplete: ()->Unit) {
|
override fun onClickRead(secrets: Secrets, onComplete: ()->Unit) {
|
||||||
handleTag(secrets) { tagCommunicator ->
|
handleTag(secrets) { tagCommunicator ->
|
||||||
val character = tagCommunicator.receiveCharacter()
|
val character = tagCommunicator.receiveCharacter()
|
||||||
val resultMessage = addCharacterScannedIntoDatabase(character)
|
val resultMessage = characterFromNfc(character)
|
||||||
onComplete.invoke()
|
onComplete.invoke()
|
||||||
resultMessage
|
resultMessage
|
||||||
}
|
}
|
||||||
@@ -123,7 +120,15 @@ class ScanScreenControllerImpl(
|
|||||||
) {
|
) {
|
||||||
handleTag(secrets) { tagCommunicator ->
|
handleTag(secrets) { tagCommunicator ->
|
||||||
try {
|
try {
|
||||||
tagCommunicator.sendCharacter(nfcCharacter)
|
if (nfcCharacter is VBNfcCharacter) {
|
||||||
|
Log.d("SendCharacter", "VBNfcCharacter")
|
||||||
|
val castNfcCharacter: VBNfcCharacter = nfcCharacter
|
||||||
|
tagCommunicator.sendCharacter(castNfcCharacter)
|
||||||
|
} else if (nfcCharacter is BENfcCharacter) {
|
||||||
|
Log.d("SendCharacter", "BENfcCharacter")
|
||||||
|
val castNfcCharacter: BENfcCharacter = nfcCharacter
|
||||||
|
tagCommunicator.sendCharacter(castNfcCharacter)
|
||||||
|
}
|
||||||
onComplete.invoke()
|
onComplete.invoke()
|
||||||
"Sent character successfully!"
|
"Sent character successfully!"
|
||||||
} catch (e: Throwable) {
|
} catch (e: Throwable) {
|
||||||
@@ -151,103 +156,20 @@ class ScanScreenControllerImpl(
|
|||||||
componentActivity.startActivity(Intent(Settings.ACTION_WIRELESS_SETTINGS))
|
componentActivity.startActivity(Intent(Settings.ACTION_WIRELESS_SETTINGS))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addCharacterScannedIntoDatabase(nfcCharacter: NfcCharacter): String {
|
override fun characterFromNfc(nfcCharacter: NfcCharacter): String {
|
||||||
val application = componentActivity.applicationContext as VBHelper
|
val nfcConverter = FromNfcConverter(
|
||||||
val storageRepository = application.container.db
|
componentActivity = componentActivity
|
||||||
|
)
|
||||||
|
return nfcConverter.addCharacter(nfcCharacter)
|
||||||
|
}
|
||||||
|
|
||||||
val dimData = storageRepository
|
override suspend fun characterToNfc(characterId: Long): NfcCharacter {
|
||||||
.dimDao()
|
val nfcGenerator = ToNfcConverter(
|
||||||
.getDimById(nfcCharacter.dimId.toInt())
|
componentActivity = componentActivity
|
||||||
|
|
||||||
if (dimData == null) return "Card not found"
|
|
||||||
|
|
||||||
val cardCharData = storageRepository
|
|
||||||
.characterDao()
|
|
||||||
.getCharacterByMonIndex(nfcCharacter.charIndex.toInt(), dimData.id)
|
|
||||||
|
|
||||||
val characterData = UserCharacter(
|
|
||||||
charId = cardCharData.id,
|
|
||||||
stage = nfcCharacter.stage.toInt(),
|
|
||||||
attribute = nfcCharacter.attribute,
|
|
||||||
ageInDays = nfcCharacter.ageInDays.toInt(),
|
|
||||||
nextAdventureMissionStage = nfcCharacter.nextAdventureMissionStage.toInt(),
|
|
||||||
mood = nfcCharacter.mood.toInt(),
|
|
||||||
vitalPoints = nfcCharacter.vitalPoints.toInt(),
|
|
||||||
transformationCountdown = nfcCharacter.transformationCountdownInMinutes.toInt(),
|
|
||||||
injuryStatus = nfcCharacter.injuryStatus,
|
|
||||||
trophies = nfcCharacter.trophies.toInt(),
|
|
||||||
currentPhaseBattlesWon = nfcCharacter.currentPhaseBattlesWon.toInt(),
|
|
||||||
currentPhaseBattlesLost = nfcCharacter.currentPhaseBattlesLost.toInt(),
|
|
||||||
totalBattlesWon = nfcCharacter.totalBattlesWon.toInt(),
|
|
||||||
totalBattlesLost = nfcCharacter.totalBattlesLost.toInt(),
|
|
||||||
activityLevel = nfcCharacter.activityLevel.toInt(),
|
|
||||||
heartRateCurrent = nfcCharacter.heartRateCurrent.toInt(),
|
|
||||||
characterType = when (nfcCharacter) {
|
|
||||||
is BENfcCharacter -> DeviceType.BEDevice
|
|
||||||
else -> DeviceType.VBDevice
|
|
||||||
},
|
|
||||||
isActive = true
|
|
||||||
)
|
)
|
||||||
|
|
||||||
storageRepository
|
val character = nfcGenerator.characterToNfc(characterId)
|
||||||
.userCharacterDao()
|
Log.d("CharacterType", character.toString())
|
||||||
.clearActiveCharacter()
|
return character
|
||||||
|
|
||||||
val characterId: Long = storageRepository
|
|
||||||
.userCharacterDao()
|
|
||||||
.insertCharacterData(characterData)
|
|
||||||
|
|
||||||
if (nfcCharacter is BENfcCharacter) {
|
|
||||||
val extraCharacterData = BECharacterData(
|
|
||||||
id = characterId,
|
|
||||||
trainingHp = nfcCharacter.trainingHp.toInt(),
|
|
||||||
trainingAp = nfcCharacter.trainingAp.toInt(),
|
|
||||||
trainingBp = nfcCharacter.trainingBp.toInt(),
|
|
||||||
remainingTrainingTimeInMinutes = nfcCharacter.remainingTrainingTimeInMinutes.toInt(),
|
|
||||||
itemEffectActivityLevelValue = nfcCharacter.itemEffectActivityLevelValue.toInt(),
|
|
||||||
itemEffectMentalStateValue = nfcCharacter.itemEffectMentalStateValue.toInt(),
|
|
||||||
itemEffectMentalStateMinutesRemaining = nfcCharacter.itemEffectMentalStateMinutesRemaining.toInt(),
|
|
||||||
itemEffectActivityLevelMinutesRemaining = nfcCharacter.itemEffectActivityLevelMinutesRemaining.toInt(),
|
|
||||||
itemEffectVitalPointsChangeValue = nfcCharacter.itemEffectVitalPointsChangeValue.toInt(),
|
|
||||||
itemEffectVitalPointsChangeMinutesRemaining = nfcCharacter.itemEffectVitalPointsChangeMinutesRemaining.toInt(),
|
|
||||||
abilityRarity = nfcCharacter.abilityRarity,
|
|
||||||
abilityType = nfcCharacter.abilityType.toInt(),
|
|
||||||
abilityBranch = nfcCharacter.abilityBranch.toInt(),
|
|
||||||
abilityReset = nfcCharacter.abilityReset.toInt(),
|
|
||||||
rank = nfcCharacter.abilityReset.toInt(),
|
|
||||||
itemType = nfcCharacter.itemType.toInt(),
|
|
||||||
itemMultiplier = nfcCharacter.itemMultiplier.toInt(),
|
|
||||||
itemRemainingTime = nfcCharacter.itemRemainingTime.toInt(),
|
|
||||||
otp0 = "", //nfcCharacter.value!!.otp0.toString(),
|
|
||||||
otp1 = "", //nfcCharacter.value!!.otp1.toString(),
|
|
||||||
minorVersion = nfcCharacter.characterCreationFirmwareVersion.minorVersion.toInt(),
|
|
||||||
majorVersion = nfcCharacter.characterCreationFirmwareVersion.majorVersion.toInt(),
|
|
||||||
)
|
|
||||||
|
|
||||||
storageRepository
|
|
||||||
.userCharacterDao()
|
|
||||||
.insertBECharacterData(extraCharacterData)
|
|
||||||
|
|
||||||
val transformationHistoryWatch = nfcCharacter.transformationHistory
|
|
||||||
transformationHistoryWatch.map { item ->
|
|
||||||
if (item.toCharIndex.toInt() != 255) {
|
|
||||||
val date = GregorianCalendar(item.year.toInt(), item.month.toInt(), item.day.toInt())
|
|
||||||
.time
|
|
||||||
.time
|
|
||||||
|
|
||||||
storageRepository
|
|
||||||
.characterDao()
|
|
||||||
.insertTransformation(characterId, item.toCharIndex.toInt(), dimData.id, date)
|
|
||||||
|
|
||||||
storageRepository
|
|
||||||
.dexDao()
|
|
||||||
.insertCharacter(item.toCharIndex.toInt(), dimData.id, date)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (nfcCharacter is VBNfcCharacter) {
|
|
||||||
return "Not implemented yet"
|
|
||||||
}
|
|
||||||
|
|
||||||
return "Done reading character!"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+253
@@ -0,0 +1,253 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.screens.scanScreen.converters
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.activity.ComponentActivity
|
||||||
|
import com.github.cfogrady.vbnfc.be.BENfcCharacter
|
||||||
|
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
||||||
|
import com.github.cfogrady.vbnfc.vb.VBNfcCharacter
|
||||||
|
import com.github.nacabaro.vbhelper.di.VBHelper
|
||||||
|
import com.github.nacabaro.vbhelper.domain.card.Card
|
||||||
|
import com.github.nacabaro.vbhelper.domain.card.CardProgress
|
||||||
|
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.UserCharacter
|
||||||
|
import com.github.nacabaro.vbhelper.domain.device_data.VBCharacterData
|
||||||
|
import com.github.nacabaro.vbhelper.domain.device_data.VitalsHistory
|
||||||
|
import com.github.nacabaro.vbhelper.utils.DeviceType
|
||||||
|
import java.util.GregorianCalendar
|
||||||
|
|
||||||
|
class FromNfcConverter (
|
||||||
|
componentActivity: ComponentActivity
|
||||||
|
) {
|
||||||
|
private val application = componentActivity.applicationContext as VBHelper
|
||||||
|
private val database = application.container.db
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
fun addCharacter(nfcCharacter: NfcCharacter): String {
|
||||||
|
val cardData = database
|
||||||
|
.cardDao()
|
||||||
|
.getDimById(nfcCharacter.dimId.toInt())
|
||||||
|
|
||||||
|
if (cardData == null)
|
||||||
|
return "Card not found"
|
||||||
|
|
||||||
|
val cardCharData = database
|
||||||
|
.characterDao()
|
||||||
|
.getCharacterByMonIndex(nfcCharacter.charIndex.toInt(), cardData.id)
|
||||||
|
|
||||||
|
updateCardProgress(nfcCharacter, cardData)
|
||||||
|
|
||||||
|
val characterData = UserCharacter(
|
||||||
|
charId = cardCharData.id,
|
||||||
|
ageInDays = nfcCharacter.ageInDays.toInt(),
|
||||||
|
mood = nfcCharacter.mood.toInt(),
|
||||||
|
vitalPoints = nfcCharacter.vitalPoints.toInt(),
|
||||||
|
transformationCountdown = nfcCharacter.transformationCountdownInMinutes.toInt(),
|
||||||
|
injuryStatus = nfcCharacter.injuryStatus,
|
||||||
|
trophies = nfcCharacter.trophies.toInt(),
|
||||||
|
currentPhaseBattlesWon = nfcCharacter.currentPhaseBattlesWon.toInt(),
|
||||||
|
currentPhaseBattlesLost = nfcCharacter.currentPhaseBattlesLost.toInt(),
|
||||||
|
totalBattlesWon = nfcCharacter.totalBattlesWon.toInt(),
|
||||||
|
totalBattlesLost = nfcCharacter.totalBattlesLost.toInt(),
|
||||||
|
activityLevel = nfcCharacter.activityLevel.toInt(),
|
||||||
|
heartRateCurrent = nfcCharacter.heartRateCurrent.toInt(),
|
||||||
|
characterType = when (nfcCharacter) {
|
||||||
|
is BENfcCharacter -> DeviceType.BEDevice
|
||||||
|
else -> DeviceType.VBDevice
|
||||||
|
},
|
||||||
|
isActive = true
|
||||||
|
)
|
||||||
|
|
||||||
|
database
|
||||||
|
.userCharacterDao()
|
||||||
|
.clearActiveCharacter()
|
||||||
|
|
||||||
|
val characterId: Long = database
|
||||||
|
.userCharacterDao()
|
||||||
|
.insertCharacterData(characterData)
|
||||||
|
|
||||||
|
if (nfcCharacter is BENfcCharacter) {
|
||||||
|
addBeCharacterToDatabase(
|
||||||
|
characterId = characterId,
|
||||||
|
nfcCharacter = nfcCharacter
|
||||||
|
)
|
||||||
|
} else if (nfcCharacter is VBNfcCharacter) {
|
||||||
|
addVbCharacterToDatabase(
|
||||||
|
characterId = characterId,
|
||||||
|
nfcCharacter = nfcCharacter
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
addTransformationHistoryToDatabase(
|
||||||
|
characterId = characterId,
|
||||||
|
nfcCharacter = nfcCharacter,
|
||||||
|
dimData = cardData
|
||||||
|
)
|
||||||
|
|
||||||
|
addVitalsHistoryToDatabase(
|
||||||
|
characterId = characterId,
|
||||||
|
nfcCharacter = nfcCharacter
|
||||||
|
)
|
||||||
|
|
||||||
|
return "Done reading character!"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private fun updateCardProgress(
|
||||||
|
nfcCharacter: NfcCharacter,
|
||||||
|
cardData: Card
|
||||||
|
) {
|
||||||
|
val currentCardProgress = CardProgress(
|
||||||
|
cardId = cardData.id,
|
||||||
|
currentStage = nfcCharacter.nextAdventureMissionStage.toInt(),
|
||||||
|
unlocked = nfcCharacter.nextAdventureMissionStage.toInt() > cardData.stageCount
|
||||||
|
)
|
||||||
|
|
||||||
|
database
|
||||||
|
.cardProgressDao()
|
||||||
|
.updateDimProgress(currentCardProgress)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private fun addVbCharacterToDatabase(
|
||||||
|
characterId: Long,
|
||||||
|
nfcCharacter: VBNfcCharacter
|
||||||
|
) {
|
||||||
|
val extraCharacterData = VBCharacterData(
|
||||||
|
id = characterId,
|
||||||
|
generation = nfcCharacter.generation.toInt(),
|
||||||
|
totalTrophies = nfcCharacter.totalTrophies.toInt()
|
||||||
|
)
|
||||||
|
|
||||||
|
database
|
||||||
|
.userCharacterDao()
|
||||||
|
.insertVBCharacterData(extraCharacterData)
|
||||||
|
|
||||||
|
addSpecialMissionsToDatabase(nfcCharacter, characterId)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private fun addSpecialMissionsToDatabase(
|
||||||
|
nfcCharacter: VBNfcCharacter,
|
||||||
|
characterId: Long
|
||||||
|
) {
|
||||||
|
val specialMissionsWatch = nfcCharacter.specialMissions
|
||||||
|
val specialMissionsDb = specialMissionsWatch.map { item ->
|
||||||
|
SpecialMissions(
|
||||||
|
characterId = characterId,
|
||||||
|
goal = item.goal.toInt(),
|
||||||
|
watchId = item.id.toInt(),
|
||||||
|
progress = item.progress.toInt(),
|
||||||
|
status = item.status,
|
||||||
|
timeElapsedInMinutes = item.timeElapsedInMinutes.toInt(),
|
||||||
|
timeLimitInMinutes = item.timeLimitInMinutes.toInt(),
|
||||||
|
missionType = item.type,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
database
|
||||||
|
.userCharacterDao()
|
||||||
|
.insertSpecialMissions(*specialMissionsDb.toTypedArray())
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private fun addBeCharacterToDatabase(
|
||||||
|
characterId: Long,
|
||||||
|
nfcCharacter: BENfcCharacter
|
||||||
|
) {
|
||||||
|
val extraCharacterData = BECharacterData(
|
||||||
|
id = characterId,
|
||||||
|
trainingHp = nfcCharacter.trainingHp.toInt(),
|
||||||
|
trainingAp = nfcCharacter.trainingAp.toInt(),
|
||||||
|
trainingBp = nfcCharacter.trainingBp.toInt(),
|
||||||
|
remainingTrainingTimeInMinutes = nfcCharacter.remainingTrainingTimeInMinutes.toInt(),
|
||||||
|
itemEffectActivityLevelValue = nfcCharacter.itemEffectActivityLevelValue.toInt(),
|
||||||
|
itemEffectMentalStateValue = nfcCharacter.itemEffectMentalStateValue.toInt(),
|
||||||
|
itemEffectMentalStateMinutesRemaining = nfcCharacter.itemEffectMentalStateMinutesRemaining.toInt(),
|
||||||
|
itemEffectActivityLevelMinutesRemaining = nfcCharacter.itemEffectActivityLevelMinutesRemaining.toInt(),
|
||||||
|
itemEffectVitalPointsChangeValue = nfcCharacter.itemEffectVitalPointsChangeValue.toInt(),
|
||||||
|
itemEffectVitalPointsChangeMinutesRemaining = nfcCharacter.itemEffectVitalPointsChangeMinutesRemaining.toInt(),
|
||||||
|
abilityRarity = nfcCharacter.abilityRarity,
|
||||||
|
abilityType = nfcCharacter.abilityType.toInt(),
|
||||||
|
abilityBranch = nfcCharacter.abilityBranch.toInt(),
|
||||||
|
abilityReset = nfcCharacter.abilityReset.toInt(),
|
||||||
|
rank = nfcCharacter.abilityReset.toInt(),
|
||||||
|
itemType = nfcCharacter.itemType.toInt(),
|
||||||
|
itemMultiplier = nfcCharacter.itemMultiplier.toInt(),
|
||||||
|
itemRemainingTime = nfcCharacter.itemRemainingTime.toInt(),
|
||||||
|
otp0 = "", //nfcCharacter.value!!.otp0.toString(),
|
||||||
|
otp1 = "", //nfcCharacter.value!!.otp1.toString(),
|
||||||
|
minorVersion = nfcCharacter.characterCreationFirmwareVersion.minorVersion.toInt(),
|
||||||
|
majorVersion = nfcCharacter.characterCreationFirmwareVersion.majorVersion.toInt(),
|
||||||
|
)
|
||||||
|
|
||||||
|
database
|
||||||
|
.userCharacterDao()
|
||||||
|
.insertBECharacterData(extraCharacterData)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private fun addVitalsHistoryToDatabase(
|
||||||
|
characterId: Long,
|
||||||
|
nfcCharacter: NfcCharacter
|
||||||
|
) {
|
||||||
|
val vitalsHistoryWatch = nfcCharacter.vitalHistory
|
||||||
|
val vitalsHistory = vitalsHistoryWatch.map { historyElement ->
|
||||||
|
Log.d("VitalsHistory", "${historyElement.year.toInt()} ${historyElement.month.toInt()} ${historyElement.day.toInt()}")
|
||||||
|
VitalsHistory(
|
||||||
|
charId = characterId,
|
||||||
|
year = historyElement.year.toInt(),
|
||||||
|
month = historyElement.month.toInt(),
|
||||||
|
day = historyElement.day.toInt(),
|
||||||
|
vitalPoints = historyElement.vitalsGained.toInt()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
database
|
||||||
|
.userCharacterDao()
|
||||||
|
.insertVitals(*vitalsHistory.toTypedArray())
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun addTransformationHistoryToDatabase(
|
||||||
|
characterId: Long,
|
||||||
|
nfcCharacter: NfcCharacter,
|
||||||
|
dimData: Card
|
||||||
|
) {
|
||||||
|
val transformationHistoryWatch = nfcCharacter.transformationHistory
|
||||||
|
transformationHistoryWatch.map { item ->
|
||||||
|
if (item.toCharIndex.toInt() != 255) {
|
||||||
|
val date = GregorianCalendar(
|
||||||
|
item.year.toInt(),
|
||||||
|
item.month.toInt(),
|
||||||
|
item.day.toInt()
|
||||||
|
)
|
||||||
|
.time
|
||||||
|
.time
|
||||||
|
|
||||||
|
database
|
||||||
|
.userCharacterDao()
|
||||||
|
.insertTransformation(
|
||||||
|
characterId,
|
||||||
|
item.toCharIndex.toInt(),
|
||||||
|
dimData.id,
|
||||||
|
date
|
||||||
|
)
|
||||||
|
|
||||||
|
database
|
||||||
|
.dexDao()
|
||||||
|
.insertCharacter(
|
||||||
|
item.toCharIndex.toInt(),
|
||||||
|
dimData.id,
|
||||||
|
date
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+273
@@ -0,0 +1,273 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.screens.scanScreen.converters
|
||||||
|
|
||||||
|
import android.icu.util.Calendar
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.activity.ComponentActivity
|
||||||
|
import com.github.cfogrady.vbnfc.be.BENfcCharacter
|
||||||
|
import com.github.cfogrady.vbnfc.be.FirmwareVersion
|
||||||
|
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
||||||
|
import com.github.cfogrady.vbnfc.vb.SpecialMission
|
||||||
|
import com.github.cfogrady.vbnfc.vb.VBNfcCharacter
|
||||||
|
import com.github.nacabaro.vbhelper.database.AppDatabase
|
||||||
|
import com.github.nacabaro.vbhelper.di.VBHelper
|
||||||
|
import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter
|
||||||
|
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
||||||
|
import com.github.nacabaro.vbhelper.utils.DeviceType
|
||||||
|
import java.util.Date
|
||||||
|
|
||||||
|
class ToNfcConverter(
|
||||||
|
private val componentActivity: ComponentActivity
|
||||||
|
) {
|
||||||
|
private val application: VBHelper = componentActivity.applicationContext as VBHelper
|
||||||
|
private val database: AppDatabase = application.container.db
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
suspend fun characterToNfc(
|
||||||
|
characterId: Long
|
||||||
|
): NfcCharacter {
|
||||||
|
val app = componentActivity.applicationContext as VBHelper
|
||||||
|
val database = app.container.db
|
||||||
|
|
||||||
|
val userCharacter = database
|
||||||
|
.userCharacterDao()
|
||||||
|
.getCharacter(characterId)
|
||||||
|
|
||||||
|
val characterInfo = database
|
||||||
|
.characterDao()
|
||||||
|
.getCharacterInfo(userCharacter.charId)
|
||||||
|
|
||||||
|
val currentCardStage = database
|
||||||
|
.cardProgressDao()
|
||||||
|
.getCardProgress(characterInfo.cardId)
|
||||||
|
|
||||||
|
return if (userCharacter.characterType == DeviceType.BEDevice)
|
||||||
|
nfcToBENfc(characterId, characterInfo, currentCardStage, userCharacter)
|
||||||
|
else
|
||||||
|
nfcToVBNfc(characterId, characterInfo, currentCardStage, userCharacter)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private suspend fun nfcToVBNfc(
|
||||||
|
characterId: Long,
|
||||||
|
characterInfo: CharacterDtos.CardCharacterInfo,
|
||||||
|
currentCardStage: Int,
|
||||||
|
userCharacter: UserCharacter
|
||||||
|
): VBNfcCharacter {
|
||||||
|
val vbData = database
|
||||||
|
.userCharacterDao()
|
||||||
|
.getVbData(characterId)
|
||||||
|
|
||||||
|
val paddedTransformationArray = generateTransformationHistory(characterId, 9)
|
||||||
|
|
||||||
|
val watchSpecialMissions = generateSpecialMissionsArray(characterId)
|
||||||
|
|
||||||
|
val nfcData = VBNfcCharacter(
|
||||||
|
dimId = characterInfo.cardId.toUShort(),
|
||||||
|
charIndex = characterInfo.charId.toUShort(),
|
||||||
|
stage = characterInfo.stage.toByte(),
|
||||||
|
attribute = characterInfo.attribute,
|
||||||
|
ageInDays = userCharacter.ageInDays.toByte(),
|
||||||
|
nextAdventureMissionStage = currentCardStage.toByte(),
|
||||||
|
mood = userCharacter.mood.toByte(),
|
||||||
|
vitalPoints = userCharacter.vitalPoints.toUShort(),
|
||||||
|
transformationCountdownInMinutes = userCharacter.transformationCountdown.toUShort(),
|
||||||
|
injuryStatus = userCharacter.injuryStatus,
|
||||||
|
trophies = userCharacter.trophies.toUShort(),
|
||||||
|
currentPhaseBattlesWon = userCharacter.currentPhaseBattlesWon.toUShort(),
|
||||||
|
currentPhaseBattlesLost = userCharacter.currentPhaseBattlesLost.toUShort(),
|
||||||
|
totalBattlesWon = userCharacter.totalBattlesWon.toUShort(),
|
||||||
|
totalBattlesLost = userCharacter.totalBattlesLost.toUShort(),
|
||||||
|
activityLevel = userCharacter.activityLevel.toByte(),
|
||||||
|
heartRateCurrent = userCharacter.heartRateCurrent.toUByte(),
|
||||||
|
transformationHistory = paddedTransformationArray,
|
||||||
|
vitalHistory = generateVitalsHistoryArray(characterId),
|
||||||
|
appReserved1 = ByteArray(12) {0},
|
||||||
|
appReserved2 = Array(3) {0u},
|
||||||
|
generation = vbData.generation.toUShort(),
|
||||||
|
totalTrophies = vbData.totalTrophies.toUShort(),
|
||||||
|
specialMissions = watchSpecialMissions.toTypedArray()
|
||||||
|
)
|
||||||
|
|
||||||
|
return nfcData
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private suspend fun generateSpecialMissionsArray(
|
||||||
|
characterId: Long
|
||||||
|
): List<SpecialMission> {
|
||||||
|
val specialMissions = database
|
||||||
|
.userCharacterDao()
|
||||||
|
.getSpecialMissions(characterId)
|
||||||
|
|
||||||
|
val watchSpecialMissions = specialMissions.map {
|
||||||
|
SpecialMission(
|
||||||
|
goal = it.goal.toUShort(),
|
||||||
|
id = it.watchId.toUShort(),
|
||||||
|
progress = it.progress.toUShort(),
|
||||||
|
status = it.status,
|
||||||
|
timeElapsedInMinutes = it.timeElapsedInMinutes.toUShort(),
|
||||||
|
timeLimitInMinutes = it.timeLimitInMinutes.toUShort(),
|
||||||
|
type = it.missionType
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return watchSpecialMissions
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private suspend fun generateVitalsHistoryArray(
|
||||||
|
characterId: Long
|
||||||
|
): Array<NfcCharacter.DailyVitals> {
|
||||||
|
val vitalsHistory = database
|
||||||
|
.userCharacterDao()
|
||||||
|
.getVitalsHistory(characterId)
|
||||||
|
|
||||||
|
val nfcVitalsHistory = Array(7) {
|
||||||
|
NfcCharacter.DailyVitals(0u, 0u, 0u, 0u)
|
||||||
|
}
|
||||||
|
|
||||||
|
vitalsHistory.mapIndexed { index, historyElement ->
|
||||||
|
var actualYear = 0
|
||||||
|
if (historyElement.year != 2000) {
|
||||||
|
actualYear = historyElement.year
|
||||||
|
}
|
||||||
|
nfcVitalsHistory[index] = NfcCharacter.DailyVitals(
|
||||||
|
day = historyElement.day.toUByte(),
|
||||||
|
month = historyElement.month.toUByte(),
|
||||||
|
year = actualYear.toUShort(),
|
||||||
|
vitalsGained = vitalsHistory[index].vitalPoints.toUShort()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
nfcVitalsHistory.map {
|
||||||
|
Log.d("NFC", it.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
return nfcVitalsHistory
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private suspend fun nfcToBENfc(
|
||||||
|
characterId: Long,
|
||||||
|
characterInfo: CharacterDtos.CardCharacterInfo,
|
||||||
|
currentCardStage: Int,
|
||||||
|
userCharacter: UserCharacter
|
||||||
|
): BENfcCharacter {
|
||||||
|
val beData = database
|
||||||
|
.userCharacterDao()
|
||||||
|
.getBeData(characterId)
|
||||||
|
|
||||||
|
val paddedTransformationArray = generateTransformationHistory(characterId)
|
||||||
|
|
||||||
|
val nfcData = BENfcCharacter(
|
||||||
|
dimId = characterInfo.cardId.toUShort(),
|
||||||
|
charIndex = characterInfo.charId.toUShort(),
|
||||||
|
stage = characterInfo.stage.toByte(),
|
||||||
|
attribute = characterInfo.attribute,
|
||||||
|
ageInDays = userCharacter.ageInDays.toByte(),
|
||||||
|
nextAdventureMissionStage = currentCardStage.toByte(),
|
||||||
|
mood = userCharacter.mood.toByte(),
|
||||||
|
vitalPoints = userCharacter.vitalPoints.toUShort(),
|
||||||
|
itemEffectMentalStateValue = beData.itemEffectMentalStateValue.toByte(),
|
||||||
|
itemEffectMentalStateMinutesRemaining = beData.itemEffectMentalStateMinutesRemaining.toByte(),
|
||||||
|
itemEffectActivityLevelValue = beData.itemEffectActivityLevelValue.toByte(),
|
||||||
|
itemEffectActivityLevelMinutesRemaining = beData.itemEffectActivityLevelMinutesRemaining.toByte(),
|
||||||
|
itemEffectVitalPointsChangeValue = beData.itemEffectVitalPointsChangeValue.toByte(),
|
||||||
|
itemEffectVitalPointsChangeMinutesRemaining = beData.itemEffectVitalPointsChangeMinutesRemaining.toByte(),
|
||||||
|
transformationCountdownInMinutes = userCharacter.transformationCountdown.toUShort(),
|
||||||
|
injuryStatus = userCharacter.injuryStatus,
|
||||||
|
trainingPp = userCharacter.trophies.toUShort(),
|
||||||
|
currentPhaseBattlesWon = userCharacter.currentPhaseBattlesWon.toUShort(),
|
||||||
|
currentPhaseBattlesLost = userCharacter.currentPhaseBattlesLost.toUShort(),
|
||||||
|
totalBattlesWon = userCharacter.totalBattlesWon.toUShort(),
|
||||||
|
totalBattlesLost = userCharacter.totalBattlesLost.toUShort(),
|
||||||
|
activityLevel = userCharacter.activityLevel.toByte(),
|
||||||
|
heartRateCurrent = userCharacter.heartRateCurrent.toUByte(),
|
||||||
|
transformationHistory = paddedTransformationArray,
|
||||||
|
vitalHistory = generateVitalsHistoryArray(characterId),
|
||||||
|
appReserved1 = ByteArray(12) {0},
|
||||||
|
appReserved2 = Array(3) {0u},
|
||||||
|
trainingHp = beData.trainingHp.toUShort(),
|
||||||
|
trainingAp = beData.trainingAp.toUShort(),
|
||||||
|
trainingBp = beData.trainingBp.toUShort(),
|
||||||
|
remainingTrainingTimeInMinutes = beData.remainingTrainingTimeInMinutes.toUShort(),
|
||||||
|
abilityRarity = beData.abilityRarity,
|
||||||
|
abilityType = beData.abilityType.toUShort(),
|
||||||
|
abilityBranch = beData.abilityBranch.toUShort(),
|
||||||
|
abilityReset = beData.abilityReset.toByte(),
|
||||||
|
rank = beData.rank.toByte(),
|
||||||
|
itemType = beData.itemType.toByte(),
|
||||||
|
itemMultiplier = beData.itemMultiplier.toByte(),
|
||||||
|
itemRemainingTime = beData.itemRemainingTime.toByte(),
|
||||||
|
otp0 = byteArrayOf(8),
|
||||||
|
otp1 = byteArrayOf(8),
|
||||||
|
characterCreationFirmwareVersion = FirmwareVersion(
|
||||||
|
minorVersion = beData.minorVersion.toByte(),
|
||||||
|
majorVersion = beData.majorVersion.toByte()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return nfcData
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private suspend fun generateTransformationHistory(
|
||||||
|
characterId: Long,
|
||||||
|
length: Int = 8
|
||||||
|
): Array<NfcCharacter.Transformation> {
|
||||||
|
val transformationHistory = database
|
||||||
|
.userCharacterDao()
|
||||||
|
.getTransformationHistory(characterId)!!
|
||||||
|
.map {
|
||||||
|
val date = Date(it.transformationDate)
|
||||||
|
val calendar = android.icu.util.GregorianCalendar()
|
||||||
|
calendar.time = date
|
||||||
|
|
||||||
|
NfcCharacter.Transformation(
|
||||||
|
toCharIndex = it.monIndex.toUByte(),
|
||||||
|
year = calendar
|
||||||
|
.get(Calendar.YEAR)
|
||||||
|
.toUShort(),
|
||||||
|
month = calendar
|
||||||
|
.get(Calendar.MONTH)
|
||||||
|
.toUByte(),
|
||||||
|
day = calendar
|
||||||
|
.get(Calendar.DAY_OF_MONTH)
|
||||||
|
.toUByte()
|
||||||
|
)
|
||||||
|
}.toTypedArray()
|
||||||
|
|
||||||
|
val paddedTransformationArray = padTransformationArray(transformationHistory, length)
|
||||||
|
|
||||||
|
return paddedTransformationArray
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private fun padTransformationArray(
|
||||||
|
transformationArray: Array<NfcCharacter.Transformation>,
|
||||||
|
length: Int
|
||||||
|
): Array<NfcCharacter.Transformation> {
|
||||||
|
if (transformationArray.size >= 8) {
|
||||||
|
return transformationArray
|
||||||
|
}
|
||||||
|
|
||||||
|
val paddedArray = Array(length) {
|
||||||
|
NfcCharacter.Transformation(
|
||||||
|
toCharIndex = 255u,
|
||||||
|
year = 65535u,
|
||||||
|
month = 255u,
|
||||||
|
day = 255u
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
System.arraycopy(transformationArray, 0, paddedArray, 0, transformationArray.size)
|
||||||
|
return paddedArray
|
||||||
|
}
|
||||||
|
}
|
||||||
+40
@@ -0,0 +1,40 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.screens.settingsScreen
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.material3.Scaffold
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.navigation.NavController
|
||||||
|
import com.github.nacabaro.vbhelper.components.TopBanner
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun CreditsScreen(
|
||||||
|
navController: NavController
|
||||||
|
) {
|
||||||
|
Scaffold (
|
||||||
|
topBar = {
|
||||||
|
TopBanner(
|
||||||
|
text = "Credits",
|
||||||
|
onBackClick = {
|
||||||
|
navController.popBackStack()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxSize()
|
||||||
|
) { contentPadding ->
|
||||||
|
Column (
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(top = contentPadding.calculateTopPadding())
|
||||||
|
) {
|
||||||
|
SettingsSection("Reverse engineering")
|
||||||
|
SettingsEntry(title = "cyanic", description = "Reversed the firmware and helped us during development.") { }
|
||||||
|
SettingsSection("Application development")
|
||||||
|
SettingsEntry(title = "cfogrady", description = "Developed vb-lib-nfc and part of this application.") { }
|
||||||
|
SettingsEntry(title = "nacabaro", description = "Developed this application.") { }
|
||||||
|
SettingsEntry(title = "lightheel", description = "Developing the battling part for this application, including server. Still in the works.") { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+4
-1
@@ -18,6 +18,7 @@ import androidx.compose.ui.unit.dp
|
|||||||
import androidx.compose.ui.unit.sp
|
import androidx.compose.ui.unit.sp
|
||||||
import androidx.navigation.NavController
|
import androidx.navigation.NavController
|
||||||
import com.github.nacabaro.vbhelper.components.TopBanner
|
import com.github.nacabaro.vbhelper.components.TopBanner
|
||||||
|
import com.github.nacabaro.vbhelper.navigation.NavigationItems
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun SettingsScreen(
|
fun SettingsScreen(
|
||||||
@@ -52,7 +53,9 @@ fun SettingsScreen(
|
|||||||
}
|
}
|
||||||
SettingsEntry(title = "Rename DiM/BEm", description = "Set card name") { }
|
SettingsEntry(title = "Rename DiM/BEm", description = "Set card name") { }
|
||||||
SettingsSection("About and credits")
|
SettingsSection("About and credits")
|
||||||
SettingsEntry(title = "Credits", description = "Credits") { }
|
SettingsEntry(title = "Credits", description = "Credits") {
|
||||||
|
navController.navigate(NavigationItems.Credits.route)
|
||||||
|
}
|
||||||
SettingsEntry(title = "About", description = "About") { }
|
SettingsEntry(title = "About", description = "About") { }
|
||||||
SettingsSection("Data management")
|
SettingsSection("Data management")
|
||||||
SettingsEntry(title = "Export data", description = "Export application database") {
|
SettingsEntry(title = "Export data", description = "Export application database") {
|
||||||
|
|||||||
+68
-25
@@ -10,11 +10,14 @@ import androidx.activity.ComponentActivity
|
|||||||
import androidx.activity.result.ActivityResultLauncher
|
import androidx.activity.result.ActivityResultLauncher
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import com.github.cfogrady.vb.dim.card.BemCard
|
import com.github.cfogrady.vb.dim.card.BemCard
|
||||||
|
import com.github.cfogrady.vb.dim.card.DimCard
|
||||||
import com.github.cfogrady.vb.dim.card.DimReader
|
import com.github.cfogrady.vb.dim.card.DimReader
|
||||||
|
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
||||||
import com.github.nacabaro.vbhelper.database.AppDatabase
|
import com.github.nacabaro.vbhelper.database.AppDatabase
|
||||||
import com.github.nacabaro.vbhelper.di.VBHelper
|
import com.github.nacabaro.vbhelper.di.VBHelper
|
||||||
import com.github.nacabaro.vbhelper.domain.Sprites
|
import com.github.nacabaro.vbhelper.domain.characters.Sprite
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Card
|
import com.github.nacabaro.vbhelper.domain.card.Card
|
||||||
|
import com.github.nacabaro.vbhelper.domain.card.CardProgress
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Character
|
import com.github.nacabaro.vbhelper.domain.characters.Character
|
||||||
import com.github.nacabaro.vbhelper.source.ApkSecretsImporter
|
import com.github.nacabaro.vbhelper.source.ApkSecretsImporter
|
||||||
import com.github.nacabaro.vbhelper.source.SecretsImporter
|
import com.github.nacabaro.vbhelper.source.SecretsImporter
|
||||||
@@ -115,9 +118,9 @@ class SettingsScreenControllerImpl(
|
|||||||
val card = dimReader.readCard(fileReader, false)
|
val card = dimReader.readCard(fileReader, false)
|
||||||
|
|
||||||
val cardModel = Card(
|
val cardModel = Card(
|
||||||
dimId = card.header.dimId,
|
cardId = card.header.dimId,
|
||||||
logo = card.spriteData.sprites[0].pixelData,
|
logo = card.spriteData.sprites[0].pixelData,
|
||||||
name = card.spriteData.text, // TODO Make user write card name// TODO Make user write card name
|
name = card.spriteData.text, // TODO Make user write card name
|
||||||
stageCount = card.adventureLevels.levels.size,
|
stageCount = card.adventureLevels.levels.size,
|
||||||
logoHeight = card.spriteData.sprites[0].height,
|
logoHeight = card.spriteData.sprites[0].height,
|
||||||
logoWidth = card.spriteData.sprites[0].width,
|
logoWidth = card.spriteData.sprites[0].width,
|
||||||
@@ -125,10 +128,22 @@ class SettingsScreenControllerImpl(
|
|||||||
)
|
)
|
||||||
|
|
||||||
val dimId = database
|
val dimId = database
|
||||||
.dimDao()
|
.cardDao()
|
||||||
.insertNewDim(cardModel)
|
.insertNewDim(cardModel)
|
||||||
|
|
||||||
val characters = card.characterStats.characterEntries
|
val cardProgress = CardProgress(
|
||||||
|
cardId = dimId,
|
||||||
|
currentStage = 0,
|
||||||
|
unlocked = false
|
||||||
|
)
|
||||||
|
|
||||||
|
database
|
||||||
|
.cardProgressDao()
|
||||||
|
.updateDimProgress(cardProgress)
|
||||||
|
|
||||||
|
val characters = card
|
||||||
|
.characterStats
|
||||||
|
.characterEntries
|
||||||
|
|
||||||
var spriteCounter = when (card is BemCard) {
|
var spriteCounter = when (card is BemCard) {
|
||||||
true -> 54
|
true -> 54
|
||||||
@@ -138,22 +153,62 @@ class SettingsScreenControllerImpl(
|
|||||||
val domainCharacters = mutableListOf<Character>()
|
val domainCharacters = mutableListOf<Character>()
|
||||||
|
|
||||||
for (index in 0 until characters.size) {
|
for (index in 0 until characters.size) {
|
||||||
|
var domainSprite: Sprite?
|
||||||
|
|
||||||
|
if (index < 2 && card is DimCard) {
|
||||||
|
domainSprite = Sprite(
|
||||||
|
width = card.spriteData.sprites[spriteCounter + 1].spriteDimensions.width,
|
||||||
|
height = card.spriteData.sprites[spriteCounter + 1].spriteDimensions.height,
|
||||||
|
spriteIdle1 = card.spriteData.sprites[spriteCounter + 1].pixelData,
|
||||||
|
spriteIdle2 = card.spriteData.sprites[spriteCounter + 2].pixelData,
|
||||||
|
spriteWalk1 = card.spriteData.sprites[spriteCounter + 1].pixelData,
|
||||||
|
spriteWalk2 = card.spriteData.sprites[spriteCounter + 3].pixelData,
|
||||||
|
spriteRun1 = card.spriteData.sprites[spriteCounter + 1].pixelData,
|
||||||
|
spriteRun2 = card.spriteData.sprites[spriteCounter + 3].pixelData,
|
||||||
|
spriteTrain1 = card.spriteData.sprites[spriteCounter + 1].pixelData,
|
||||||
|
spriteTrain2 = card.spriteData.sprites[spriteCounter + 3].pixelData,
|
||||||
|
spriteHappy = card.spriteData.sprites[spriteCounter + 4].pixelData,
|
||||||
|
spriteSleep = card.spriteData.sprites[spriteCounter + 5].pixelData,
|
||||||
|
spriteAttack = card.spriteData.sprites[spriteCounter + 2].pixelData,
|
||||||
|
spriteDodge = card.spriteData.sprites[spriteCounter + 3].pixelData
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
domainSprite = Sprite(
|
||||||
|
width = card.spriteData.sprites[spriteCounter + 1].spriteDimensions.width,
|
||||||
|
height = card.spriteData.sprites[spriteCounter + 1].spriteDimensions.height,
|
||||||
|
spriteIdle1 = card.spriteData.sprites[spriteCounter + 1].pixelData,
|
||||||
|
spriteIdle2 = card.spriteData.sprites[spriteCounter + 2].pixelData,
|
||||||
|
spriteWalk1 = card.spriteData.sprites[spriteCounter + 3].pixelData,
|
||||||
|
spriteWalk2 = card.spriteData.sprites[spriteCounter + 4].pixelData,
|
||||||
|
spriteRun1 = card.spriteData.sprites[spriteCounter + 5].pixelData,
|
||||||
|
spriteRun2 = card.spriteData.sprites[spriteCounter + 6].pixelData,
|
||||||
|
spriteTrain1 = card.spriteData.sprites[spriteCounter + 7].pixelData,
|
||||||
|
spriteTrain2 = card.spriteData.sprites[spriteCounter + 8].pixelData,
|
||||||
|
spriteHappy = card.spriteData.sprites[spriteCounter + 9].pixelData,
|
||||||
|
spriteSleep = card.spriteData.sprites[spriteCounter + 10].pixelData,
|
||||||
|
spriteAttack = card.spriteData.sprites[spriteCounter + 11].pixelData,
|
||||||
|
spriteDodge = card.spriteData.sprites[spriteCounter + 12].pixelData
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val spriteId = database
|
||||||
|
.spriteDao()
|
||||||
|
.insertSprite(domainSprite)
|
||||||
|
|
||||||
domainCharacters.add(
|
domainCharacters.add(
|
||||||
Character(
|
Character(
|
||||||
dimId = dimId,
|
dimId = dimId,
|
||||||
|
spriteId = spriteId,
|
||||||
monIndex = index,
|
monIndex = index,
|
||||||
name = card.spriteData.sprites[spriteCounter].pixelData,
|
name = card.spriteData.sprites[spriteCounter].pixelData,
|
||||||
stage = characters[index].stage,
|
stage = characters[index].stage,
|
||||||
attribute = characters[index].attribute,
|
attribute = NfcCharacter.Attribute.entries[characters[index].attribute],
|
||||||
baseHp = characters[index].hp,
|
baseHp = characters[index].hp,
|
||||||
baseBp = characters[index].dp,
|
baseBp = characters[index].dp,
|
||||||
baseAp = characters[index].ap,
|
baseAp = characters[index].ap,
|
||||||
sprite1 = card.spriteData.sprites[spriteCounter + 1].pixelData,
|
nameWidth = card.spriteData.sprites[spriteCounter].spriteDimensions.width,
|
||||||
sprite2 = card.spriteData.sprites[spriteCounter + 2].pixelData,
|
nameHeight = card.spriteData.sprites[spriteCounter].spriteDimensions.height,
|
||||||
nameWidth = card.spriteData.sprites[spriteCounter].width,
|
|
||||||
nameHeight = card.spriteData.sprites[spriteCounter].height,
|
|
||||||
spritesWidth = card.spriteData.sprites[spriteCounter + 1].width,
|
|
||||||
spritesHeight = card.spriteData.sprites[spriteCounter + 1].height
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -171,18 +226,6 @@ class SettingsScreenControllerImpl(
|
|||||||
database
|
database
|
||||||
.characterDao()
|
.characterDao()
|
||||||
.insertCharacter(*domainCharacters.toTypedArray())
|
.insertCharacter(*domainCharacters.toTypedArray())
|
||||||
|
|
||||||
val sprites = card.spriteData.sprites.map { sprite ->
|
|
||||||
Sprites(
|
|
||||||
id = 0,
|
|
||||||
sprite = sprite.pixelData,
|
|
||||||
width = sprite.width,
|
|
||||||
height = sprite.height
|
|
||||||
)
|
|
||||||
}
|
|
||||||
database
|
|
||||||
.characterDao()
|
|
||||||
.insertSprite(*sprites.toTypedArray())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inputStream?.close()
|
inputStream?.close()
|
||||||
|
|||||||
+9
-32
@@ -1,55 +1,38 @@
|
|||||||
package com.github.nacabaro.vbhelper.screens
|
package com.github.nacabaro.vbhelper.screens.spriteViewer
|
||||||
|
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.compose.foundation.Image
|
import androidx.compose.foundation.Image
|
||||||
import androidx.compose.foundation.layout.Column
|
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
|
||||||
import androidx.compose.foundation.layout.height
|
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.layout.size
|
import androidx.compose.foundation.layout.size
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
import androidx.compose.foundation.lazy.items
|
import androidx.compose.foundation.lazy.items
|
||||||
import androidx.compose.foundation.rememberScrollState
|
|
||||||
import androidx.compose.foundation.verticalScroll
|
|
||||||
import androidx.compose.material3.Scaffold
|
import androidx.compose.material3.Scaffold
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
import androidx.compose.runtime.mutableStateListOf
|
import androidx.compose.runtime.mutableStateListOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.asImageBitmap
|
import androidx.compose.ui.graphics.asImageBitmap
|
||||||
import androidx.compose.ui.platform.LocalContext
|
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.navigation.NavController
|
import androidx.navigation.NavController
|
||||||
import com.github.nacabaro.vbhelper.components.TopBanner
|
import com.github.nacabaro.vbhelper.components.TopBanner
|
||||||
import com.github.nacabaro.vbhelper.di.VBHelper
|
|
||||||
import com.github.nacabaro.vbhelper.domain.Sprites
|
|
||||||
import com.github.nacabaro.vbhelper.source.SpriteRepo
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import java.nio.ByteBuffer
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun SpriteViewer(
|
fun SpriteViewer(
|
||||||
navController: NavController
|
navController: NavController,
|
||||||
|
spriteViewerController: SpriteViewerController
|
||||||
) {
|
) {
|
||||||
val coroutineScope = rememberCoroutineScope()
|
val spriteList = remember { mutableStateListOf<Bitmap>() }
|
||||||
val application = LocalContext.current.applicationContext as VBHelper
|
|
||||||
val db = application.container.db
|
|
||||||
val spriteRepo = SpriteRepo(db)
|
|
||||||
|
|
||||||
val spriteList = remember { mutableStateListOf<Sprites>() }
|
|
||||||
|
|
||||||
Log.d("SpriteViewer", "spriteList: $spriteList")
|
Log.d("SpriteViewer", "spriteList: $spriteList")
|
||||||
|
|
||||||
LaunchedEffect(spriteRepo) {
|
LaunchedEffect(spriteViewerController) {
|
||||||
coroutineScope.launch {
|
val sprites = spriteViewerController.getAllSprites()
|
||||||
spriteList.clear()
|
val bitmapData = spriteViewerController.convertToBitmap(sprites)
|
||||||
spriteList.addAll(spriteRepo.getAllSprites())
|
spriteList.addAll(bitmapData)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Scaffold (
|
Scaffold (
|
||||||
@@ -69,13 +52,7 @@ fun SpriteViewer(
|
|||||||
.padding(top = contentPadding.calculateTopPadding())
|
.padding(top = contentPadding.calculateTopPadding())
|
||||||
) {
|
) {
|
||||||
items(spriteList) { sprite ->
|
items(spriteList) { sprite ->
|
||||||
val bitmap = remember (sprite.sprite) {
|
val imageBitmap = remember(sprite) { sprite.asImageBitmap() }
|
||||||
Log.d("SpriteViewer", "sprite: $sprite")
|
|
||||||
Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply {
|
|
||||||
copyPixelsFromBuffer(ByteBuffer.wrap(sprite.sprite))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val imageBitmap = remember(bitmap) { bitmap.asImageBitmap() }
|
|
||||||
Image(
|
Image(
|
||||||
bitmap = imageBitmap,
|
bitmap = imageBitmap,
|
||||||
contentDescription = "Sprite",
|
contentDescription = "Sprite",
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.screens.spriteViewer
|
||||||
|
|
||||||
|
import android.graphics.Bitmap
|
||||||
|
import com.github.nacabaro.vbhelper.domain.characters.Sprite
|
||||||
|
|
||||||
|
interface SpriteViewerController {
|
||||||
|
suspend fun getAllSprites(): List<Sprite>
|
||||||
|
fun convertToBitmap(sprites: List<Sprite>): List<Bitmap>
|
||||||
|
}
|
||||||
+68
@@ -0,0 +1,68 @@
|
|||||||
|
package com.github.nacabaro.vbhelper.screens.spriteViewer
|
||||||
|
|
||||||
|
import android.graphics.Bitmap
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.activity.ComponentActivity
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.ui.graphics.asImageBitmap
|
||||||
|
import com.github.nacabaro.vbhelper.di.VBHelper
|
||||||
|
import com.github.nacabaro.vbhelper.domain.characters.Sprite
|
||||||
|
import java.nio.ByteBuffer
|
||||||
|
|
||||||
|
class SpriteViewerControllerImpl(
|
||||||
|
private val context: ComponentActivity
|
||||||
|
) : SpriteViewerController {
|
||||||
|
override suspend fun getAllSprites(): List<Sprite> {
|
||||||
|
val applicationContext = context.applicationContext as VBHelper
|
||||||
|
val db = applicationContext.container.db
|
||||||
|
val sprites = db.spriteDao().getAllSprites()
|
||||||
|
return sprites
|
||||||
|
}
|
||||||
|
|
||||||
|
// I don't like this, chief
|
||||||
|
override fun convertToBitmap(sprites: List<Sprite>): List<Bitmap> {
|
||||||
|
val bitmapList = mutableListOf<Bitmap>()
|
||||||
|
|
||||||
|
for (sprite in sprites) {
|
||||||
|
Log.d("SpriteViewer", "sprite: $sprite")
|
||||||
|
bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply {
|
||||||
|
copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteIdle1))
|
||||||
|
})
|
||||||
|
bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply {
|
||||||
|
copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteIdle2))
|
||||||
|
})
|
||||||
|
bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply {
|
||||||
|
copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteWalk1))
|
||||||
|
})
|
||||||
|
bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply {
|
||||||
|
copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteWalk2))
|
||||||
|
})
|
||||||
|
bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply {
|
||||||
|
copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteRun1))
|
||||||
|
})
|
||||||
|
bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply {
|
||||||
|
copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteRun2))
|
||||||
|
})
|
||||||
|
bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply {
|
||||||
|
copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteTrain1))
|
||||||
|
})
|
||||||
|
bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply {
|
||||||
|
copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteTrain2))
|
||||||
|
})
|
||||||
|
bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply {
|
||||||
|
copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteHappy))
|
||||||
|
})
|
||||||
|
bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply {
|
||||||
|
copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteSleep))
|
||||||
|
})
|
||||||
|
bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply {
|
||||||
|
copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteAttack))
|
||||||
|
})
|
||||||
|
bitmapList.add(Bitmap.createBitmap(sprite.width, sprite.height, Bitmap.Config.RGB_565).apply {
|
||||||
|
copyPixelsFromBuffer(ByteBuffer.wrap(sprite.spriteDodge))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return bitmapList
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package com.github.nacabaro.vbhelper.source
|
package com.github.nacabaro.vbhelper.source
|
||||||
|
|
||||||
import com.github.nacabaro.vbhelper.database.AppDatabase
|
import com.github.nacabaro.vbhelper.database.AppDatabase
|
||||||
import com.github.nacabaro.vbhelper.domain.characters.Card
|
|
||||||
import com.github.nacabaro.vbhelper.dtos.CardDtos
|
import com.github.nacabaro.vbhelper.dtos.CardDtos
|
||||||
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
import com.github.nacabaro.vbhelper.dtos.CharacterDtos
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
package com.github.nacabaro.vbhelper.source
|
|
||||||
|
|
||||||
import com.github.nacabaro.vbhelper.database.AppDatabase
|
|
||||||
import com.github.nacabaro.vbhelper.domain.Sprites
|
|
||||||
|
|
||||||
class SpriteRepo (
|
|
||||||
private val db: AppDatabase
|
|
||||||
) {
|
|
||||||
suspend fun getAllSprites(): List<Sprites> {
|
|
||||||
return db.characterDao().getAllSprites()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,10 @@ package com.github.nacabaro.vbhelper.source
|
|||||||
|
|
||||||
import com.github.nacabaro.vbhelper.database.AppDatabase
|
import com.github.nacabaro.vbhelper.database.AppDatabase
|
||||||
import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData
|
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.CharacterDtos
|
||||||
|
import com.github.nacabaro.vbhelper.dtos.ItemDtos
|
||||||
|
|
||||||
class StorageRepository (
|
class StorageRepository (
|
||||||
private val db: AppDatabase
|
private val db: AppDatabase
|
||||||
@@ -19,12 +22,20 @@ class StorageRepository (
|
|||||||
return db.userCharacterDao().getBeData(id)
|
return db.userCharacterDao().getBeData(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getTransformationHistory(characterId: Long): List<CharacterDtos.TransformationHistory>? {
|
suspend fun getTransformationHistory(characterId: Long): List<CharacterDtos.TransformationHistory>? {
|
||||||
return db.userCharacterDao().getTransformationHistory(characterId)
|
return db.userCharacterDao().getTransformationHistory(characterId)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun getCharacterData(id: Long): CharacterDtos.DiMInfo {
|
suspend fun getCharacterVbData(id: Long): VBCharacterData {
|
||||||
return db.characterDao().getCharacterInfo(id)
|
return db.userCharacterDao().getVbData(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun getSpecialMissions(id: Long): List<SpecialMissions> {
|
||||||
|
return db.userCharacterDao().getSpecialMissions(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun getItem(id: Long): ItemDtos.ItemsWithQuantities {
|
||||||
|
return db.itemDao().getItem(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun getActiveCharacter(): CharacterDtos.CharacterWithSprites? {
|
suspend fun getActiveCharacter(): CharacterDtos.CharacterWithSprites? {
|
||||||
@@ -38,4 +49,12 @@ class StorageRepository (
|
|||||||
suspend fun getAdventureCharacters(): List<CharacterDtos.AdventureCharacterWithSprites> {
|
suspend fun getAdventureCharacters(): List<CharacterDtos.AdventureCharacterWithSprites> {
|
||||||
return db.adventureDao().getAdventureCharacters()
|
return db.adventureDao().getAdventureCharacters()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun getBEBEmCharacters(): List<CharacterDtos.CharacterWithSprites> {
|
||||||
|
return db.userCharacterDao().getBEBemCharacters()
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun getVBCharacters(): List<CharacterDtos.CharacterWithSprites> {
|
||||||
|
return db.userCharacterDao().getVBDimCharacters()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
package com.github.nacabaro.vbhelper.utils
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.icu.util.Calendar
|
|
||||||
import android.icu.util.GregorianCalendar
|
|
||||||
import com.github.cfogrady.vbnfc.be.BENfcCharacter
|
|
||||||
import com.github.cfogrady.vbnfc.be.FirmwareVersion
|
|
||||||
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
|
||||||
import com.github.nacabaro.vbhelper.di.VBHelper
|
|
||||||
import com.github.nacabaro.vbhelper.source.StorageRepository
|
|
||||||
import java.util.Date
|
|
||||||
|
|
||||||
suspend fun characterToNfc(context: Context, characterId: Long): NfcCharacter? {
|
|
||||||
val app = context.applicationContext as VBHelper
|
|
||||||
val database = app.container.db
|
|
||||||
val storageRepository = StorageRepository(database)
|
|
||||||
val userCharacter = storageRepository.getSingleCharacter(characterId)
|
|
||||||
val characterInfo = storageRepository.getCharacterData(characterId)
|
|
||||||
|
|
||||||
if (userCharacter.characterType == DeviceType.BEDevice) {
|
|
||||||
val beData = storageRepository.getCharacterBeData(characterId)
|
|
||||||
val transformationHistory = storageRepository
|
|
||||||
.getTransformationHistory(characterId)!!
|
|
||||||
.map {
|
|
||||||
val date = Date(it.transformationDate)
|
|
||||||
val calendar = GregorianCalendar()
|
|
||||||
calendar.time = date
|
|
||||||
|
|
||||||
NfcCharacter.Transformation(
|
|
||||||
toCharIndex = it.monIndex.toUByte(),
|
|
||||||
year = calendar
|
|
||||||
.get(Calendar.YEAR)
|
|
||||||
.toUShort(),
|
|
||||||
month = calendar
|
|
||||||
.get(Calendar.MONTH)
|
|
||||||
.toUByte(),
|
|
||||||
day = calendar
|
|
||||||
.get(Calendar.DAY_OF_MONTH)
|
|
||||||
.toUByte()
|
|
||||||
)
|
|
||||||
}.toTypedArray()
|
|
||||||
|
|
||||||
val paddedTransformationArray = padTransformationArray(transformationHistory)
|
|
||||||
|
|
||||||
val nfcData = BENfcCharacter(
|
|
||||||
dimId = characterInfo.cardId.toUShort(),
|
|
||||||
charIndex = characterInfo.charId.toUShort(),
|
|
||||||
stage = userCharacter.stage.toByte(),
|
|
||||||
attribute = userCharacter.attribute,
|
|
||||||
ageInDays = userCharacter.ageInDays.toByte(),
|
|
||||||
nextAdventureMissionStage = userCharacter.nextAdventureMissionStage.toByte(),
|
|
||||||
mood = userCharacter.mood.toByte(),
|
|
||||||
vitalPoints = userCharacter.vitalPoints.toUShort(),
|
|
||||||
itemEffectMentalStateValue = beData.itemEffectMentalStateValue.toByte(),
|
|
||||||
itemEffectMentalStateMinutesRemaining = beData.itemEffectMentalStateMinutesRemaining.toByte(),
|
|
||||||
itemEffectActivityLevelValue = beData.itemEffectActivityLevelValue.toByte(),
|
|
||||||
itemEffectActivityLevelMinutesRemaining = beData.itemEffectActivityLevelMinutesRemaining.toByte(),
|
|
||||||
itemEffectVitalPointsChangeValue = beData.itemEffectVitalPointsChangeValue.toByte(),
|
|
||||||
itemEffectVitalPointsChangeMinutesRemaining = beData.itemEffectVitalPointsChangeMinutesRemaining.toByte(),
|
|
||||||
transformationCountdownInMinutes = userCharacter.transformationCountdown.toUShort(),
|
|
||||||
injuryStatus = userCharacter.injuryStatus,
|
|
||||||
trainingPp = userCharacter.trophies.toUShort(),
|
|
||||||
currentPhaseBattlesWon = userCharacter.currentPhaseBattlesWon.toUShort(),
|
|
||||||
currentPhaseBattlesLost = userCharacter.currentPhaseBattlesLost.toUShort(),
|
|
||||||
totalBattlesWon = userCharacter.totalBattlesWon.toUShort(),
|
|
||||||
totalBattlesLost = userCharacter.totalBattlesLost.toUShort(),
|
|
||||||
activityLevel = userCharacter.activityLevel.toByte(),
|
|
||||||
heartRateCurrent = userCharacter.heartRateCurrent.toUByte(),
|
|
||||||
transformationHistory = paddedTransformationArray,
|
|
||||||
vitalHistory = Array(7) {
|
|
||||||
NfcCharacter.DailyVitals(0u, 0u, 0u, 0u)
|
|
||||||
},
|
|
||||||
appReserved1 = ByteArray(12) {0},
|
|
||||||
appReserved2 = Array(3) {0u},
|
|
||||||
trainingHp = beData.trainingHp.toUShort(),
|
|
||||||
trainingAp = beData.trainingAp.toUShort(),
|
|
||||||
trainingBp = beData.trainingBp.toUShort(),
|
|
||||||
remainingTrainingTimeInMinutes = beData.remainingTrainingTimeInMinutes.toUShort(),
|
|
||||||
abilityRarity = beData.abilityRarity,
|
|
||||||
abilityType = beData.abilityType.toUShort(),
|
|
||||||
abilityBranch = beData.abilityBranch.toUShort(),
|
|
||||||
abilityReset = beData.abilityReset.toByte(),
|
|
||||||
rank = beData.rank.toByte(),
|
|
||||||
itemType = beData.itemType.toByte(),
|
|
||||||
itemMultiplier = beData.itemMultiplier.toByte(),
|
|
||||||
itemRemainingTime = beData.itemRemainingTime.toByte(),
|
|
||||||
otp0 = byteArrayOf(8),
|
|
||||||
otp1 = byteArrayOf(8),
|
|
||||||
characterCreationFirmwareVersion = FirmwareVersion(
|
|
||||||
minorVersion = beData.minorVersion.toByte(),
|
|
||||||
majorVersion = beData.majorVersion.toByte()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
return nfcData
|
|
||||||
}
|
|
||||||
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
package com.github.nacabaro.vbhelper.utils
|
|
||||||
|
|
||||||
import com.github.cfogrady.vbnfc.data.NfcCharacter
|
|
||||||
|
|
||||||
fun padTransformationArray(
|
|
||||||
transformationArray: Array<NfcCharacter.Transformation>
|
|
||||||
): Array<NfcCharacter.Transformation> {
|
|
||||||
if (transformationArray.size >= 8) {
|
|
||||||
return transformationArray
|
|
||||||
}
|
|
||||||
|
|
||||||
val paddedArray = Array(8) {
|
|
||||||
NfcCharacter.Transformation(
|
|
||||||
toCharIndex = 255u,
|
|
||||||
year = 65535u,
|
|
||||||
month = 255u,
|
|
||||||
day = 255u
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
System.arraycopy(transformationArray, 0, paddedArray, 0, transformationArray.size)
|
|
||||||
return paddedArray
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user