diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 784ff18..9e700f0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -15,7 +15,7 @@ android { minSdk = 28 targetSdk = 35 versionCode = 1 - versionName = "1.0" + versionName = "Alpha 0.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt b/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt index e39db36..cc8eff4 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/MainActivity.kt @@ -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.settingsScreen.SettingsScreenControllerImpl 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.ui.theme.VBHelperTheme @@ -45,6 +46,7 @@ class MainActivity : ComponentActivity() { val adventureScreenController = AdventureScreenControllerImpl(this) val storageScreenController = StorageScreenControllerImpl(this) val homeScreenController = HomeScreenControllerImpl(this) + val spriteViewerController = SpriteViewerControllerImpl(this) super.onCreate(savedInstanceState) @@ -58,7 +60,8 @@ class MainActivity : ComponentActivity() { itemsScreenController = itemsScreenController, adventureScreenController = adventureScreenController, homeScreenController = homeScreenController, - storageScreenController = storageScreenController + storageScreenController = storageScreenController, + spriteViewerController = spriteViewerController ) } } @@ -90,7 +93,7 @@ class MainActivity : ComponentActivity() { adventureScreenController: AdventureScreenControllerImpl, storageScreenController: StorageScreenControllerImpl, homeScreenController: HomeScreenControllerImpl, - + spriteViewerController: SpriteViewerControllerImpl ) { AppNavigation( applicationNavigationHandlers = AppNavigationHandlers( @@ -99,7 +102,8 @@ class MainActivity : ComponentActivity() { itemsScreenController, adventureScreenController, storageScreenController, - homeScreenController + homeScreenController, + spriteViewerController ) ) } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/AdventureDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/AdventureDao.kt index ba2f907..e2519ae 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/daos/AdventureDao.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/AdventureDao.kt @@ -21,14 +21,17 @@ interface AdventureDao { @Query(""" SELECT uc.*, - c.sprite1 AS spriteIdle, - c.spritesWidth AS spriteWidth, - c.spritesHeight AS spriteHeight, + c.stage, + c.attribute, + s.spriteIdle1 AS spriteIdle, + s.width AS spriteWidth, + s.height AS spriteHeight, d.isBEm as isBemCard, a.finishesAdventure AS finishesAdventure, a.originalDuration AS originalTimeInMinutes FROM UserCharacter uc 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 Adventure a ON uc.id = a.characterId """) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/CharacterDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/CharacterDao.kt index 097f37a..7797078 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/daos/CharacterDao.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/CharacterDao.kt @@ -4,7 +4,7 @@ import androidx.room.Dao import androidx.room.Insert import androidx.room.Query 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 @Dao @@ -16,10 +16,10 @@ interface CharacterDao { fun getCharacterByMonIndex(monIndex: Int, dimId: Long): Character @Insert - suspend fun insertSprite(vararg sprite: Sprites) + suspend fun insertSprite(vararg sprite: Sprite) - @Query("SELECT * FROM Sprites") - suspend fun getAllSprites(): List + @Query("SELECT * FROM Sprite") + suspend fun getAllSprites(): List @Query( """ diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/DexDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/DexDao.kt index d20b76f..bd6655f 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/daos/DexDao.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/DexDao.kt @@ -19,11 +19,12 @@ interface DexDao { @Query(""" SELECT c.id AS id, - c.sprite1 AS spriteIdle, - c.spritesWidth AS spriteWidth, - c.spritesHeight AS spriteHeight, + s.spriteIdle1 AS spriteIdle, + s.width AS spriteWidth, + s.height AS spriteHeight, 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 WHERE c.dimId = :cardId """) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/SpriteDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/SpriteDao.kt new file mode 100644 index 0000000..4d8d6e6 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/SpriteDao.kt @@ -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 +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt index 8fbe7a3..af0e849 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/UserCharacterDao.kt @@ -5,6 +5,7 @@ import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query 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.BECharacterData import com.github.nacabaro.vbhelper.domain.device_data.SpecialMissions @@ -39,13 +40,14 @@ interface UserCharacterDao { @Query(""" SELECT c.id AS id, - c.sprite1 AS spriteIdle, - c.spritesWidth AS spriteWidth, - c.spritesHeight AS spriteHeight, + s.spriteIdle1 AS spriteIdle, + s.width AS spriteWidth, + s.height AS spriteHeight, c.monIndex AS monIndex, t.transformationDate AS transformationDate FROM TransformationHistory t JOIN Character c ON c.id = t.stageId + JOIN Sprite s ON s.id = c.spriteId WHERE monId = :monId """) suspend fun getTransformationHistory(monId: Long): List? @@ -54,9 +56,12 @@ interface UserCharacterDao { """ SELECT uc.*, - c.sprite1 AS spriteIdle, - c.spritesWidth AS spriteWidth, - c.spritesHeight AS spriteHeight, + 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, @@ -64,7 +69,8 @@ interface UserCharacterDao { a.characterId = uc.id as isInAdventure FROM UserCharacter uc 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 """ ) @@ -74,9 +80,12 @@ interface UserCharacterDao { """ SELECT uc.*, - c.sprite1 AS spriteIdle, - c.spritesWidth AS spriteWidth, - c.spritesHeight AS spriteHeight, + 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, @@ -85,6 +94,7 @@ interface UserCharacterDao { FROM UserCharacter uc JOIN Character c ON uc.charId = c.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 WHERE uc.id = :id """) @@ -106,9 +116,12 @@ interface UserCharacterDao { """ SELECT uc.*, - c.sprite1 AS spriteIdle, - c.spritesWidth AS spriteWidth, - c.spritesHeight AS spriteHeight, + 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, @@ -117,6 +130,7 @@ interface UserCharacterDao { FROM UserCharacter uc JOIN Character c ON uc.charId = c.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 WHERE uc.isActive = 1 LIMIT 1 @@ -131,4 +145,15 @@ interface UserCharacterDao { @Query("UPDATE UserCharacter SET isActive = 1 WHERE id = :id") 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 } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt b/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt index f248032..d9900cd 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/database/AppDatabase.kt @@ -7,10 +7,11 @@ import com.github.nacabaro.vbhelper.daos.CharacterDao import com.github.nacabaro.vbhelper.daos.DexDao import com.github.nacabaro.vbhelper.daos.DiMDao import com.github.nacabaro.vbhelper.daos.ItemDao +import com.github.nacabaro.vbhelper.daos.SpriteDao import com.github.nacabaro.vbhelper.daos.UserCharacterDao import com.github.nacabaro.vbhelper.domain.characters.Character import com.github.nacabaro.vbhelper.domain.characters.Card -import com.github.nacabaro.vbhelper.domain.Sprites +import com.github.nacabaro.vbhelper.domain.characters.Sprite import com.github.nacabaro.vbhelper.domain.characters.Adventure import com.github.nacabaro.vbhelper.domain.characters.Dex import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData @@ -25,7 +26,7 @@ import com.github.nacabaro.vbhelper.domain.items.Items entities = [ Card::class, Character::class, - Sprites::class, + Sprite::class, UserCharacter::class, BECharacterData::class, VBCharacterData::class, @@ -43,4 +44,5 @@ abstract class AppDatabase : RoomDatabase() { abstract fun dexDao(): DexDao abstract fun itemDao(): ItemDao abstract fun adventureDao(): AdventureDao + abstract fun spriteDao(): SpriteDao } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/Sprites.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/Sprites.kt deleted file mode 100644 index cf4de84..0000000 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/Sprites.kt +++ /dev/null @@ -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 -) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt index 3cb5b19..b521edf 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt @@ -3,6 +3,7 @@ package com.github.nacabaro.vbhelper.domain.characters import androidx.room.Entity import androidx.room.PrimaryKey import androidx.room.ForeignKey +import com.github.cfogrady.vbnfc.data.NfcCharacter @Entity( foreignKeys = [ @@ -11,23 +12,32 @@ import androidx.room.ForeignKey parentColumns = ["id"], childColumns = ["dimId"], onDelete = ForeignKey.CASCADE + ), + ForeignKey( + entity = Sprite::class, + parentColumns = ["id"], + childColumns = ["spriteId"], + onDelete = ForeignKey.CASCADE ) ] ) + +/* + * Character represents a character on a DIM 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 ( @PrimaryKey(autoGenerate = true) val id: Long = 0, val dimId: Long, + val spriteId: Long, val monIndex: Int, val name: ByteArray, 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 baseBp: Int, val baseAp: Int, - val sprite1: ByteArray, - val sprite2: ByteArray, val nameWidth: Int, - val nameHeight: Int, - val spritesWidth: Int, - val spritesHeight: Int + val nameHeight: Int ) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Sprite.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Sprite.kt new file mode 100644 index 0000000..1cb0d00 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Sprite.kt @@ -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 +) diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/UserCharacter.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/UserCharacter.kt index 018afcf..8f13f3d 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/UserCharacter.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/UserCharacter.kt @@ -17,11 +17,12 @@ 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 ( @PrimaryKey(autoGenerate = true) val id: Long = 0, var charId: Long, - var stage: Int, - var attribute: NfcCharacter.Attribute, var ageInDays: Int, var mood: Int, var vitalPoints: Int, diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/dtos/CharacterDtos.kt b/app/src/main/java/com/github/nacabaro/vbhelper/dtos/CharacterDtos.kt index 2e5865a..435bc61 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/dtos/CharacterDtos.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/dtos/CharacterDtos.kt @@ -25,6 +25,7 @@ object CharacterDtos { var heartRateCurrent: Int, var characterType: DeviceType, val spriteIdle: ByteArray, + val spriteIdle2: ByteArray, val spriteWidth: Int, val spriteHeight: Int, val nameSprite: ByteArray, diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt index 35b13d4..c2fd07c 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/AppNavigation.kt @@ -1,5 +1,8 @@ package com.github.nacabaro.vbhelper.navigation +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.material3.Scaffold import androidx.compose.runtime.Composable @@ -15,7 +18,7 @@ import com.github.nacabaro.vbhelper.screens.itemsScreen.ItemsScreen import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreen import com.github.nacabaro.vbhelper.screens.scanScreen.ScanScreenControllerImpl 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.storageScreen.StorageScreen import com.github.nacabaro.vbhelper.screens.itemsScreen.ChooseCharacterScreen @@ -23,6 +26,8 @@ import com.github.nacabaro.vbhelper.screens.itemsScreen.ItemsScreenControllerImp import com.github.nacabaro.vbhelper.screens.settingsScreen.SettingsScreenControllerImpl import com.github.nacabaro.vbhelper.screens.adventureScreen.AdventureScreen 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 data class AppNavigationHandlers( @@ -31,7 +36,8 @@ data class AppNavigationHandlers( val itemsScreenController: ItemsScreenControllerImpl, val adventureScreenController: AdventureScreenControllerImpl, val storageScreenController: StorageScreenControllerImpl, - val homeScreenController: HomeScreenControllerImpl + val homeScreenController: HomeScreenControllerImpl, + val spriteViewerController: SpriteViewerControllerImpl ) @Composable @@ -48,8 +54,19 @@ fun AppNavigation( NavHost( navController = navController, startDestination = NavigationItems.Home.route, + enterTransition = { + fadeIn( + animationSpec = tween(200) + ) + }, + exitTransition = { + fadeOut( + animationSpec = tween(200) + ) + }, modifier = Modifier .padding(contentPadding) + ) { composable(NavigationItems.Battles.route) { BattlesScreen() @@ -90,7 +107,8 @@ fun AppNavigation( } composable(NavigationItems.Viewer.route) { SpriteViewer( - navController = navController + navController = navController, + spriteViewerController = applicationNavigationHandlers.spriteViewerController ) } composable(NavigationItems.CardView.route) { @@ -125,6 +143,11 @@ fun AppNavigation( .adventureScreenController ) } + composable(NavigationItems.Credits.route) { + CreditsScreen( + navController = navController + ) + } } } } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavigationBar.kt b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavigationBar.kt index fa905ab..52560c1 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavigationBar.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/BottomNavigationBar.kt @@ -19,6 +19,7 @@ fun BottomNavigationBar(navController: NavController) { NavigationItems.Dex, NavigationItems.Storage, ) + NavigationBar { val currentBackStackEntry = navController.currentBackStackEntryAsState() val currentRoute = currentBackStackEntry.value?.destination?.route diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt index 59140f1..623ae8a 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/navigation/NavigationItems.kt @@ -20,4 +20,5 @@ sealed class NavigationItems ( object ItemsStore : NavigationItems("ItemsStore", R.drawable.baseline_data_24, "Items store") object ApplyItem : NavigationItems("ApplyItem/{itemId}", R.drawable.baseline_data_24, "Apply item") object Adventure : NavigationItems("Adventure", R.drawable.baseline_fort_24, "Adventure") + object Credits : NavigationItems("Credits", R.drawable.baseline_data_24, "Credits") } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/BattlesScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/BattlesScreen.kt index c9543c8..b50ef12 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/BattlesScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/BattlesScreen.kt @@ -1,9 +1,33 @@ 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.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import com.github.nacabaro.vbhelper.components.TopBanner @Composable 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") + } + } } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreenControllerImpl.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreenControllerImpl.kt index 7f01c9f..b775728 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreenControllerImpl.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/adventureScreen/AdventureScreenControllerImpl.kt @@ -72,7 +72,7 @@ class AdventureScreenControllerImpl( private suspend fun generateItem(characterId: Long): ItemDtos.PurchasedItem { val character = database .userCharacterDao() - .getCharacter(characterId) + .getCharacterInfo(characterId) val randomItem = database .itemDao() diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BetaWarning.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BetaWarning.kt new file mode 100644 index 0000000..ff62f8e --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/BetaWarning.kt @@ -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 = "Also, this application does not work yet with the original VB." + ) + 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") + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreen.kt index e038cbc..26931ad 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/homeScreens/HomeScreen.kt @@ -46,6 +46,7 @@ fun HomeScreen( val beData = remember { mutableStateOf(null) } val vbData = remember { mutableStateOf(null) } var adventureMissionsFinished by rememberSaveable { mutableStateOf(false) } + var betaWarning by rememberSaveable { mutableStateOf(true) } LaunchedEffect(storageRepository, activeMon) { withContext(Dispatchers.IO) { @@ -140,6 +141,12 @@ fun HomeScreen( } } } + + if (betaWarning) { + BetaWarning { + betaWarning = false + } + } } diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreen.kt index f406651..5dabac5 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreen.kt @@ -199,7 +199,8 @@ fun ScanScreen( } } } - } + }, + navController = navController ) } } @@ -208,9 +209,17 @@ fun ScanScreen( fun ChooseConnectOption( onClickRead: (() -> Unit)? = null, onClickWrite: (() -> Unit)? = null, + navController: NavController ) { Scaffold( - topBar = { TopBanner(text = "Scan a Vital Bracelet") } + topBar = { + TopBanner( + text = "Scan a Vital Bracelet", + onBackClick = { + navController.popBackStack() + } + ) + } ) { contentPadding -> Column( verticalArrangement = Arrangement.Center, diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreenControllerImpl.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreenControllerImpl.kt index be4941f..43638e9 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreenControllerImpl.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/scanScreen/ScanScreenControllerImpl.kt @@ -11,19 +11,22 @@ import android.widget.Toast import androidx.activity.ComponentActivity import androidx.lifecycle.lifecycleScope import com.github.cfogrady.vbnfc.TagCommunicator +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.ActivityLifecycleListener -import com.github.nacabaro.vbhelper.database.AppDatabase import com.github.nacabaro.vbhelper.di.VBHelper +import com.github.nacabaro.vbhelper.domain.device_data.BECharacterData +import com.github.nacabaro.vbhelper.domain.device_data.UserCharacter import com.github.nacabaro.vbhelper.source.getCryptographicTransformerMap import com.github.nacabaro.vbhelper.source.isMissingSecrets import com.github.nacabaro.vbhelper.source.proto.Secrets -import com.github.nacabaro.vbhelper.screens.scanScreen.converters.FromNfcConverter -import com.github.nacabaro.vbhelper.screens.scanScreen.converters.ToNfcConverter +import com.github.nacabaro.vbhelper.utils.DeviceType import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import java.util.GregorianCalendar class ScanScreenControllerImpl( override val secretsFlow: Flow, @@ -34,8 +37,6 @@ class ScanScreenControllerImpl( private val nfcAdapter: NfcAdapter - private val storageRepository: AppDatabase - init { val maybeNfcAdapter = NfcAdapter.getDefaultAdapter(componentActivity) if (maybeNfcAdapter == null) { @@ -43,8 +44,6 @@ class ScanScreenControllerImpl( } nfcAdapter = maybeNfcAdapter checkSecrets() - val application = componentActivity.applicationContext as VBHelper - storageRepository = application.container.db } override fun onClickRead(secrets: Secrets, onComplete: ()->Unit) { @@ -153,13 +152,100 @@ class ScanScreenControllerImpl( } private fun addCharacterScannedIntoDatabase(nfcCharacter: NfcCharacter): String { - val fromNfcConverter = FromNfcConverter(componentActivity) - return fromNfcConverter.addCharacter(nfcCharacter) - } + val application = componentActivity.applicationContext as VBHelper + val storageRepository = application.container.db + val dimData = storageRepository + .dimDao() + .getDimById(nfcCharacter.dimId.toInt()) - override suspend fun characterToNfc(characterId: Long): NfcCharacter { - val nfcCharacterConverter = ToNfcConverter(componentActivity) - return nfcCharacterConverter.characterToNfc(characterId) + if (dimData == null) return "Card not found" + + val cardCharData = storageRepository + .characterDao() + .getCharacterByMonIndex(nfcCharacter.charIndex.toInt(), dimData.id) + + val characterData = UserCharacter( + charId = cardCharData.id, + 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 + .userCharacterDao() + .clearActiveCharacter() + + 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!" } } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/CreditsScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/CreditsScreen.kt new file mode 100644 index 0000000..c57a0a1 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/CreditsScreen.kt @@ -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.") { } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreen.kt index 2265a4d..47ad33f 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreen.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController import com.github.nacabaro.vbhelper.components.TopBanner +import com.github.nacabaro.vbhelper.navigation.NavigationItems @Composable fun SettingsScreen( @@ -52,7 +53,9 @@ fun SettingsScreen( } SettingsEntry(title = "Rename DiM/BEm", description = "Set card name") { } SettingsSection("About and credits") - SettingsEntry(title = "Credits", description = "Credits") { } + SettingsEntry(title = "Credits", description = "Credits") { + navController.navigate(NavigationItems.Credits.route) + } SettingsEntry(title = "About", description = "About") { } SettingsSection("Data management") SettingsEntry(title = "Export data", description = "Export application database") { diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreenControllerImpl.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreenControllerImpl.kt index a45aeb8..a4ccde3 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreenControllerImpl.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/settingsScreen/SettingsScreenControllerImpl.kt @@ -10,10 +10,12 @@ import androidx.activity.ComponentActivity import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts 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.vbnfc.data.NfcCharacter import com.github.nacabaro.vbhelper.database.AppDatabase 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.characters.Character import com.github.nacabaro.vbhelper.source.ApkSecretsImporter @@ -139,22 +141,62 @@ class SettingsScreenControllerImpl( val domainCharacters = mutableListOf() for (index in 0 until characters.size) { + var domainSprite: Sprite? = null; + + 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( Character( dimId = dimId, + spriteId = spriteId, monIndex = index, name = card.spriteData.sprites[spriteCounter].pixelData, stage = characters[index].stage, - attribute = characters[index].attribute, + attribute = NfcCharacter.Attribute.entries[characters[index].attribute], baseHp = characters[index].hp, baseBp = characters[index].dp, baseAp = characters[index].ap, - sprite1 = card.spriteData.sprites[spriteCounter + 1].pixelData, - sprite2 = card.spriteData.sprites[spriteCounter + 2].pixelData, - 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 + nameWidth = card.spriteData.sprites[spriteCounter].spriteDimensions.width, + nameHeight = card.spriteData.sprites[spriteCounter].spriteDimensions.height, ) ) @@ -172,18 +214,6 @@ class SettingsScreenControllerImpl( database .characterDao() .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() diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/SpriteViewer.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewer.kt similarity index 53% rename from app/src/main/java/com/github/nacabaro/vbhelper/screens/SpriteViewer.kt rename to app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewer.kt index cfa6040..e111ad7 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/SpriteViewer.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewer.kt @@ -1,55 +1,38 @@ -package com.github.nacabaro.vbhelper.screens +package com.github.nacabaro.vbhelper.screens.spriteViewer import android.graphics.Bitmap import android.util.Log import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Column 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.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.asImageBitmap -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.navigation.NavController 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 fun SpriteViewer( - navController: NavController + navController: NavController, + spriteViewerController: SpriteViewerController ) { - val coroutineScope = rememberCoroutineScope() - val application = LocalContext.current.applicationContext as VBHelper - val db = application.container.db - val spriteRepo = SpriteRepo(db) - - val spriteList = remember { mutableStateListOf() } + val spriteList = remember { mutableStateListOf() } Log.d("SpriteViewer", "spriteList: $spriteList") - LaunchedEffect(spriteRepo) { - coroutineScope.launch { - spriteList.clear() - spriteList.addAll(spriteRepo.getAllSprites()) - } + LaunchedEffect(spriteViewerController) { + val sprites = spriteViewerController.getAllSprites() + val bitmapData = spriteViewerController.convertToBitmap(sprites) + spriteList.addAll(bitmapData) } Scaffold ( @@ -69,13 +52,7 @@ fun SpriteViewer( .padding(top = contentPadding.calculateTopPadding()) ) { items(spriteList) { sprite -> - val bitmap = remember (sprite.sprite) { - 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() } + val imageBitmap = remember(sprite) { sprite.asImageBitmap() } Image( bitmap = imageBitmap, contentDescription = "Sprite", diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewerController.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewerController.kt new file mode 100644 index 0000000..f53d800 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewerController.kt @@ -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 + fun convertToBitmap(sprites: List): List +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewerControllerImpl.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewerControllerImpl.kt new file mode 100644 index 0000000..1413f6b --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/spriteViewer/SpriteViewerControllerImpl.kt @@ -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 { + 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): List { + val bitmapList = mutableListOf() + + 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 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/source/SpriteRepo.kt b/app/src/main/java/com/github/nacabaro/vbhelper/source/SpriteRepo.kt deleted file mode 100644 index 84c0dbb..0000000 --- a/app/src/main/java/com/github/nacabaro/vbhelper/source/SpriteRepo.kt +++ /dev/null @@ -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 { - return db.characterDao().getAllSprites() - } -}