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 e2519ae..5197e7d 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 @@ -18,7 +18,8 @@ interface AdventureDao { """) fun getAdventureCount(): Int - @Query(""" + @Query( + """ SELECT uc.*, c.stage, @@ -30,11 +31,12 @@ interface AdventureDao { a.finishesAdventure AS finishesAdventure, a.originalDuration AS originalTimeInMinutes FROM UserCharacter uc - JOIN Character c ON uc.charId = c.id + JOIN CharacterData 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.cardId = d.id JOIN Adventure a ON uc.id = a.characterId - """) + """ + ) suspend fun getAdventureCharacters(): List @Query(""" diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/daos/CardDao.kt b/app/src/main/java/com/github/nacabaro/vbhelper/daos/CardDao.kt index 6fa7aec..a55ad14 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/daos/CardDao.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/daos/CardDao.kt @@ -17,13 +17,15 @@ interface CardDao { @Query("SELECT * FROM Card WHERE id = :id") fun getCardById(id: Long): Card? - @Query(""" + @Query( + """ SELECT ca.* FROM Card ca - JOIN Character ch ON ca.id = ch.dimId + JOIN CharacterData ch ON ca.id = ch.cardId JOIN UserCharacter uc ON ch.id = uc.charId WHERE uc.id = :id - """) + """ + ) suspend fun getCardByCharacterId(id: Long): Card @Query("UPDATE Card SET name = :newName WHERE id = :id") 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 172f303..a7683f1 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 @@ -3,17 +3,17 @@ package com.github.nacabaro.vbhelper.daos 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.card.CharacterData import com.github.nacabaro.vbhelper.domain.characters.Sprite import com.github.nacabaro.vbhelper.dtos.CharacterDtos @Dao interface CharacterDao { @Insert - suspend fun insertCharacter(vararg characterData: Character) + suspend fun insertCharacter(vararg characterData: CharacterData) - @Query("SELECT * FROM Character WHERE monIndex = :monIndex AND dimId = :dimId LIMIT 1") - fun getCharacterByMonIndex(monIndex: Int, dimId: Long): Character + @Query("SELECT * FROM CharacterData WHERE charaIndex = :monIndex AND cardId = :dimId LIMIT 1") + fun getCharacterByMonIndex(monIndex: Int, dimId: Long): CharacterData @Insert suspend fun insertSprite(vararg sprite: Sprite) @@ -22,14 +22,66 @@ interface CharacterDao { """ SELECT d.cardId as cardId, - c.monIndex as charId, + c.charaIndex as charId, c.stage as stage, c.attribute as attribute - FROM Character c + FROM CharacterData c JOIN UserCharacter uc ON c.id = uc.charId - JOIN Card d ON c.dimId = d.id + JOIN Card d ON c.cardId = d.id WHERE c.id = :charId """ ) suspend fun getCharacterInfo(charId: Long): CharacterDtos.CardCharacterInfo + + @Query( + """ + INSERT INTO PossibleTransformations (charaId, requiredVitals, requiredTrophies, requiredBattles, requiredWinRate, changeTimerHours, requiredAdventureLevelCompleted, toCharaId) + SELECT + (SELECT id FROM CharacterData WHERE charaIndex = :fromChraraIndex AND cardId = :cardId), + :requiredVitals, + :requiredTrophies, + :requiredBattles, + :requiredWinRate, + :changeTimerHours, + :requiredAdventureLevelCompleted, + (SELECT id FROM CharacterData WHERE charaIndex = :toChraraIndex AND cardId = :cardId) + """ + ) + suspend fun insertPossibleTransformation( + fromChraraIndex: Int, + toChraraIndex: Int, + cardId: Long, + requiredVitals: Int, + requiredTrophies: Int, + requiredBattles: Int, + changeTimerHours: Int, + requiredWinRate: Int, + requiredAdventureLevelCompleted: Int + ) + + @Query( + """ + SELECT + pt.charaId as fromCharaId, + pt.toCharaId as charaId, + s.spriteIdle1 as spriteIdle, + s.width as spriteWidth, + s.height as spriteHeight, + d.discoveredOn as discoveredOn, + pt.requiredTrophies as requiredTrophies, + pt.requiredVitals as requiredVitals, + pt.requiredBattles as requiredBattles, + pt.requiredWinRate as requiredWinRate, + pt.changeTimerHours as changeTimerHours, + pt.requiredAdventureLevelCompleted as requiredAdventureLevelCompleted + FROM + PossibleTransformations pt + JOIN CharacterData c on pt.toCharaId = c.id + JOIN Sprite s ON s.id = c.spriteId + LEFT JOIN Dex d ON d.id = pt.toCharaId + WHERE + c.cardId = :cardId + """ + ) + suspend fun getEvolutionRequirementsForCard(cardId: Long): List } \ No newline at end of file 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 bd6655f..ecba234 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 @@ -7,39 +7,53 @@ import com.github.nacabaro.vbhelper.dtos.CharacterDtos @Dao interface DexDao { - @Query(""" + @Query( + """ INSERT OR IGNORE INTO Dex(id, discoveredOn) VALUES ( - (SELECT id FROM Character WHERE monIndex = :charIndex AND dimId = :cardId), + (SELECT id FROM CharacterData WHERE charaIndex = :charIndex AND cardId = :cardId), :discoveredOn ) - """) + """ + ) fun insertCharacter(charIndex: Int, cardId: Long, discoveredOn: Long) - @Query(""" + @Query( + """ SELECT c.id AS id, s.spriteIdle1 AS spriteIdle, s.width AS spriteWidth, s.height AS spriteHeight, - d.discoveredOn AS discoveredOn - FROM Character c + c.nameSprite AS nameSprite, + c.nameWidth AS nameSpriteWidth, + c.nameHeight AS nameSpriteHeight, + d.discoveredOn AS discoveredOn, + c.baseHp as baseHp, + c.baseBp as baseBp, + c.baseAp as baseAp, + c.stage as stage, + c.attribute as attribute + FROM CharacterData c JOIN Sprite s ON c.spriteId = s.id LEFT JOIN dex d ON c.id = d.id - WHERE c.dimId = :cardId - """) - suspend fun getSingleCardProgress(cardId: Long): List + WHERE c.cardId = :cardId + """ + ) + suspend fun getSingleCardProgress(cardId: Long): List - @Query(""" + @Query( + """ SELECT c.id as cardId, c.name as cardName, c.logo as cardLogo, c.logoWidth as logoWidth, c.logoHeight as logoHeight, - (SELECT COUNT(*) FROM Character cc WHERE cc.dimId = c.id) AS totalCharacters, - (SELECT COUNT(*) FROM Dex d JOIN Character cc ON d.id = cc.id WHERE cc.dimId = c.id AND d.discoveredOn IS NOT NULL) AS obtainedCharacters + (SELECT COUNT(*) FROM CharacterData cc WHERE cc.cardId = c.id) AS totalCharacters, + (SELECT COUNT(*) FROM Dex d JOIN CharacterData cc ON d.id = cc.id WHERE cc.cardId = c.id AND d.discoveredOn IS NOT NULL) AS obtainedCharacters FROM Card c - """) + """ + ) suspend fun getCardsWithProgress(): 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 3b08448..00cc1df 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,7 +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.card.CharacterData 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 @@ -37,19 +37,21 @@ interface UserCharacterDao { @Upsert fun insertSpecialMissions(vararg specialMissions: SpecialMissions) - @Query(""" + @Query( + """ SELECT c.id AS id, s.spriteIdle1 AS spriteIdle, s.width AS spriteWidth, s.height AS spriteHeight, - c.monIndex AS monIndex, + c.charaIndex AS monIndex, t.transformationDate AS transformationDate FROM TransformationHistory t - JOIN Character c ON c.id = t.stageId + JOIN CharacterData c ON c.id = t.stageId JOIN Sprite s ON s.id = c.spriteId WHERE monId = :monId - """) + """ + ) suspend fun getTransformationHistory(monId: Long): List? @Query( @@ -62,14 +64,14 @@ interface UserCharacterDao { s.spriteIdle2 AS spriteIdle2, s.width AS spriteWidth, s.height AS spriteHeight, - c.name as nameSprite, + c.nameSprite 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 CharacterData c ON uc.charId = c.id + JOIN Card d ON d.id = c.cardId JOIN Sprite s ON s.id = c.spriteId LEFT JOIN Adventure a ON a.characterId = uc.id """ @@ -86,18 +88,19 @@ interface UserCharacterDao { s.spriteIdle2 AS spriteIdle2, s.width AS spriteWidth, s.height AS spriteHeight, - c.name as nameSprite, + c.nameSprite 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 c.dimId = d.id + JOIN CharacterData c ON uc.charId = c.id + JOIN Card d ON c.cardId = d.id JOIN Sprite s ON s.id = c.spriteId LEFT JOIN Adventure a ON a.characterId = uc.id WHERE uc.id = :id - """) + """ + ) suspend fun getCharacterWithSprites(id: Long): CharacterDtos.CharacterWithSprites @Query("SELECT * FROM UserCharacter WHERE id = :id") @@ -122,19 +125,20 @@ interface UserCharacterDao { s.spriteIdle2 AS spriteIdle2, s.width AS spriteWidth, s.height AS spriteHeight, - c.name as nameSprite, + c.nameSprite as nameSprite, c.nameWidth as nameSpriteWidth, c.nameHeight as nameSpriteHeight, d.isBEm as isBemCard, a.characterId as isInAdventure FROM UserCharacter uc - JOIN Character c ON uc.charId = c.id - JOIN Card d ON c.dimId = d.id + JOIN CharacterData c ON uc.charId = c.id + JOIN Card d ON c.cardId = 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 - """) + """ + ) suspend fun getActiveCharacter(): CharacterDtos.CharacterWithSprites? @Query("DELETE FROM UserCharacter WHERE id = :id") @@ -149,22 +153,24 @@ interface UserCharacterDao { @Query( """ SELECT c.* - FROM Character c + FROM CharacterData c join UserCharacter uc on c.id = uc.charId where uc.id = :charId LIMIT 1 """ ) - suspend fun getCharacterInfo(charId: Long): Character + suspend fun getCharacterInfo(charId: Long): CharacterData - @Query(""" + @Query( + """ INSERT INTO TransformationHistory(monId, stageId, transformationDate) VALUES (:monId, - (SELECT id FROM Character WHERE monIndex = :stage AND dimId = :dimId), + (SELECT id FROM CharacterData WHERE charaIndex = :stage AND cardId = :dimId), :transformationDate) - """) + """ + ) fun insertTransformation(monId: Long, stage: Int, dimId: Long, transformationDate: Long) @Upsert @@ -183,14 +189,14 @@ interface UserCharacterDao { s.spriteIdle2 AS spriteIdle2, s.width AS spriteWidth, s.height AS spriteHeight, - c.name as nameSprite, + c.nameSprite 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 CharacterData c ON uc.charId = c.id + JOIN Card d ON d.id = c.cardId JOIN Sprite s ON s.id = c.spriteId LEFT JOIN Adventure a ON a.characterId = uc.id WHERE uc.characterType = "BEDevice" @@ -208,14 +214,14 @@ interface UserCharacterDao { s.spriteIdle2 AS spriteIdle2, s.width AS spriteWidth, s.height AS spriteHeight, - c.name as nameSprite, + c.nameSprite 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 CharacterData c ON uc.charId = c.id + JOIN Card d ON d.id = c.cardId JOIN Sprite s ON s.id = c.spriteId LEFT JOIN Adventure a ON a.characterId = uc.id WHERE uc.characterType = "VBDevice" 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 0f963ce..bec8d12 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 @@ -11,9 +11,11 @@ import com.github.nacabaro.vbhelper.daos.ItemDao import com.github.nacabaro.vbhelper.daos.SpecialMissionDao import com.github.nacabaro.vbhelper.daos.SpriteDao import com.github.nacabaro.vbhelper.daos.UserCharacterDao -import com.github.nacabaro.vbhelper.domain.characters.Character +import com.github.nacabaro.vbhelper.domain.card.Background +import com.github.nacabaro.vbhelper.domain.card.CharacterData import com.github.nacabaro.vbhelper.domain.card.Card import com.github.nacabaro.vbhelper.domain.card.CardProgress +import com.github.nacabaro.vbhelper.domain.card.PossibleTransformations import com.github.nacabaro.vbhelper.domain.characters.Sprite import com.github.nacabaro.vbhelper.domain.characters.Adventure import com.github.nacabaro.vbhelper.domain.characters.Dex @@ -30,7 +32,7 @@ import com.github.nacabaro.vbhelper.domain.items.Items entities = [ Card::class, CardProgress::class, - Character::class, + CharacterData::class, Sprite::class, UserCharacter::class, BECharacterData::class, @@ -40,7 +42,9 @@ import com.github.nacabaro.vbhelper.domain.items.Items VitalsHistory::class, Dex::class, Items::class, - Adventure::class + Adventure::class, + Background::class, + PossibleTransformations::class ] ) abstract class AppDatabase : RoomDatabase() { diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/Evolutions.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/Evolutions.kt index dc4f94f..ba4583e 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/Evolutions.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/Evolutions.kt @@ -3,7 +3,6 @@ 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.Character @Entity( foreignKeys = [ diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/UserMonsters.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/UserMonsters.kt index abf4c76..df1aee5 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/UserMonsters.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/UserMonsters.kt @@ -3,7 +3,6 @@ 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.Character @Entity( foreignKeys = [ diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/card/Background.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/card/Background.kt new file mode 100644 index 0000000..23766d4 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/card/Background.kt @@ -0,0 +1,23 @@ +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 Background ( + @PrimaryKey(autoGenerate = true) val id: Long, + val cardId: Long, + val background: ByteArray, + val backgroundWidth: Int, + val backgroundHeight: Int +) \ No newline at end of file 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/card/CharacterData.kt similarity index 79% rename from app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt rename to app/src/main/java/com/github/nacabaro/vbhelper/domain/card/CharacterData.kt index a514660..0c3f99d 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Character.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/card/CharacterData.kt @@ -1,17 +1,17 @@ -package com.github.nacabaro.vbhelper.domain.characters +package com.github.nacabaro.vbhelper.domain.card import androidx.room.Entity -import androidx.room.PrimaryKey import androidx.room.ForeignKey +import androidx.room.PrimaryKey import com.github.cfogrady.vbnfc.data.NfcCharacter -import com.github.nacabaro.vbhelper.domain.card.Card +import com.github.nacabaro.vbhelper.domain.characters.Sprite @Entity( foreignKeys = [ ForeignKey( entity = Card::class, parentColumns = ["id"], - childColumns = ["dimId"], + childColumns = ["cardId"], onDelete = ForeignKey.CASCADE ), ForeignKey( @@ -28,17 +28,17 @@ import com.github.nacabaro.vbhelper.domain.card.Card * and monIndex. * TODO: Customs will mean this should be unique per cardName and monIndex */ -data class Character ( +data class CharacterData ( @PrimaryKey(autoGenerate = true) val id: Long = 0, - val dimId: Long, + val cardId: Long, val spriteId: Long, - val monIndex: Int, - val name: ByteArray, + val charaIndex: Int, val stage: Int, // These should be replaced with enums val attribute: NfcCharacter.Attribute, // This one too val baseHp: Int, val baseBp: Int, val baseAp: Int, + val nameSprite: ByteArray, val nameWidth: Int, val nameHeight: Int -) +) \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/card/PossibleTransformations.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/card/PossibleTransformations.kt new file mode 100644 index 0000000..1aabaed --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/card/PossibleTransformations.kt @@ -0,0 +1,33 @@ +package com.github.nacabaro.vbhelper.domain.card + +import androidx.room.Entity +import androidx.room.ForeignKey +import androidx.room.PrimaryKey + +@Entity( + foreignKeys = [ + ForeignKey( + entity = CharacterData::class, + parentColumns = ["id"], + childColumns = ["charaId"], + onDelete = ForeignKey.CASCADE + ), + ForeignKey( + entity = CharacterData::class, + parentColumns = ["id"], + childColumns = ["toCharaId"], + onDelete = ForeignKey.CASCADE + ) + ] +) +data class PossibleTransformations ( + @PrimaryKey(autoGenerate = true) val id: Long = 0, + var charaId: Long, + val requiredVitals: Int, + val requiredTrophies: Int, + val requiredBattles: Int, + val requiredWinRate: Int, + val changeTimerHours: Int, + val requiredAdventureLevelCompleted: Int, + val toCharaId: Long? +) \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Dex.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Dex.kt index d038cbb..a2f0430 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Dex.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/characters/Dex.kt @@ -3,11 +3,12 @@ package com.github.nacabaro.vbhelper.domain.characters import androidx.room.Entity import androidx.room.ForeignKey import androidx.room.PrimaryKey +import com.github.nacabaro.vbhelper.domain.card.CharacterData @Entity( foreignKeys = [ ForeignKey( - entity = Character::class, + entity = CharacterData::class, parentColumns = ["id"], childColumns = ["id"], onDelete = ForeignKey.CASCADE diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/TransformationHistory.kt b/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/TransformationHistory.kt index 70a321e..10912e0 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/TransformationHistory.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/domain/device_data/TransformationHistory.kt @@ -3,7 +3,7 @@ package com.github.nacabaro.vbhelper.domain.device_data import androidx.room.Entity import androidx.room.ForeignKey import androidx.room.PrimaryKey -import com.github.nacabaro.vbhelper.domain.characters.Character +import com.github.nacabaro.vbhelper.domain.card.CharacterData @Entity( foreignKeys = [ @@ -14,7 +14,7 @@ import com.github.nacabaro.vbhelper.domain.characters.Character onDelete = ForeignKey.CASCADE ), ForeignKey( - entity = Character::class, + entity = CharacterData::class, parentColumns = ["id"], childColumns = ["stageId"], onDelete = ForeignKey.CASCADE 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 8f13f3d..66eedf2 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 @@ -5,12 +5,12 @@ import androidx.room.ForeignKey import androidx.room.PrimaryKey import com.github.cfogrady.vbnfc.data.NfcCharacter import com.github.nacabaro.vbhelper.utils.DeviceType -import com.github.nacabaro.vbhelper.domain.characters.Character +import com.github.nacabaro.vbhelper.domain.card.CharacterData @Entity( foreignKeys = [ ForeignKey( - entity = Character::class, + entity = CharacterData::class, parentColumns = ["id"], childColumns = ["charId"], onDelete = ForeignKey.CASCADE 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 b89fab0..463d923 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 @@ -50,12 +50,27 @@ object CharacterDtos { val transformationDate: Long ) + data class CardCharaProgress( + val id: Long, + val spriteIdle: ByteArray, + val spriteWidth: Int, + val spriteHeight: Int, + val nameSprite: ByteArray, + val nameSpriteWidth: Int, + val nameSpriteHeight: Int, + val discoveredOn: Long?, + val baseHp: Int, + val baseBp: Int, + val baseAp: Int, + val stage: Int, + val attribute: NfcCharacter.Attribute, + ) + data class CardProgress( val id: Long, val spriteIdle: ByteArray, val spriteWidth: Int, val spriteHeight: Int, - val discoveredOn: Long? ) data class AdventureCharacterWithSprites( @@ -83,4 +98,19 @@ object CharacterDtos { val finishesAdventure: Long, val originalTimeInMinutes: Long ) + + data class EvolutionRequirementsWithSpritesAndObtained( + val charaId: Long, + val fromCharaId: Long, + val spriteIdle: ByteArray, + val spriteWidth: Int, + val spriteHeight: Int, + val discoveredOn: Long?, + val requiredTrophies: Int, + val requiredVitals: Int, + val requiredBattles: Int, + val requiredWinRate: Int, + val changeTimerHours: Int, + val requiredAdventureLevelCompleted: Int + ) } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/cardScreen/CardViewScreen.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/cardScreen/CardViewScreen.kt index d042eae..330293b 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/screens/cardScreen/CardViewScreen.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/cardScreen/CardViewScreen.kt @@ -16,6 +16,7 @@ import com.github.nacabaro.vbhelper.components.CharacterEntry import com.github.nacabaro.vbhelper.components.TopBanner import com.github.nacabaro.vbhelper.di.VBHelper import com.github.nacabaro.vbhelper.dtos.CharacterDtos +import com.github.nacabaro.vbhelper.screens.cardScreen.dialogs.DexCharaDetailsDialog import com.github.nacabaro.vbhelper.source.DexRepository import kotlinx.coroutines.launch @@ -28,12 +29,18 @@ fun CardViewScreen( val application = LocalContext.current.applicationContext as VBHelper val dexRepository = DexRepository(application.container.db) - val characterList = remember { mutableStateOf>(emptyList()) } + val characterList = remember { mutableStateOf>(emptyList()) } + val cardPossibleTransformations = remember { mutableStateOf>(emptyList()) } + + val selectedCharacter = remember { mutableStateOf(null) } LaunchedEffect(dexRepository) { coroutineScope.launch { - val newCharacterList = dexRepository.getCharactersByDimId(dimId) + val newCharacterList = dexRepository.getCharactersByCardId(dimId) characterList.value = newCharacterList + + val newCardPossibleTransformations = dexRepository.getCardPossibleTransformations(dimId) + cardPossibleTransformations.value = newCardPossibleTransformations } } @@ -53,7 +60,9 @@ fun CardViewScreen( ) { items(characterList.value) { character -> CharacterEntry( - onClick = { }, + onClick = { + selectedCharacter.value = character + }, obscure = character.discoveredOn == null, icon = BitmapData( bitmap = character.spriteIdle, @@ -63,5 +72,16 @@ fun CardViewScreen( ) } } + + if (selectedCharacter.value != null) { + DexCharaDetailsDialog( + currentChara = selectedCharacter.value!!, + possibleTransformations = cardPossibleTransformations.value, + obscure = selectedCharacter.value!!.discoveredOn == null, + onClickClose = { + selectedCharacter.value = null + } + ) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/screens/cardScreen/dialogs/DexCharaDetailsDialog.kt b/app/src/main/java/com/github/nacabaro/vbhelper/screens/cardScreen/dialogs/DexCharaDetailsDialog.kt new file mode 100644 index 0000000..92beb74 --- /dev/null +++ b/app/src/main/java/com/github/nacabaro/vbhelper/screens/cardScreen/dialogs/DexCharaDetailsDialog.kt @@ -0,0 +1,215 @@ +package com.github.nacabaro.vbhelper.screens.cardScreen.dialogs + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +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.layout.width +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.CardColors +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.contentColorFor +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.FilterQuality +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import com.github.nacabaro.vbhelper.dtos.CharacterDtos +import com.github.nacabaro.vbhelper.utils.BitmapData +import com.github.nacabaro.vbhelper.utils.getImageBitmap + + +@Composable +fun DexCharaDetailsDialog( + currentChara: CharacterDtos.CardCharaProgress, + possibleTransformations: List, + obscure: Boolean, + onClickClose: () -> Unit +) { + val nameMultiplier = 3 + val charaMultiplier = 4 + + val currentCharaPossibleTransformations = possibleTransformations.filter { it.fromCharaId == currentChara.id } + + val romanNumeralsStage = when (currentChara.stage) { + 1 -> "II" + 2 -> "III" + 3 -> "IV" + 4 -> "V" + 5 -> "VI" + 6 -> "VII" + else -> "I" + } + + val charaBitmapData = BitmapData( + bitmap = currentChara.spriteIdle, + width = currentChara.spriteWidth, + height = currentChara.spriteHeight + ) + val charaImageBitmapData = charaBitmapData.getImageBitmap( + context = LocalContext.current, + multiplier = charaMultiplier, + obscure = obscure + ) + + val nameBitmapData = BitmapData( + bitmap = currentChara.nameSprite, + width = currentChara.nameSpriteWidth, + height = currentChara.nameSpriteHeight + ) + val nameImageBitmapData = nameBitmapData.getImageBitmap( + context = LocalContext.current, + multiplier = nameMultiplier, + obscure = obscure + ) + + Dialog( + onDismissRequest = onClickClose + ) { + Card ( + modifier = Modifier + .fillMaxWidth() + ) { + Column ( + modifier = Modifier + .padding(16.dp) + ) { + Row ( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + ) { + Card ( + colors = CardColors( + containerColor = MaterialTheme.colorScheme.surfaceVariant, + contentColor = MaterialTheme.colorScheme.contentColorFor( + backgroundColor = MaterialTheme.colorScheme.surfaceVariant, + ), + disabledContainerColor = MaterialTheme.colorScheme.surfaceVariant, + disabledContentColor = MaterialTheme.colorScheme.contentColorFor( + backgroundColor = MaterialTheme.colorScheme.surfaceVariant, + ) + ) + ) { + Image( + bitmap = charaImageBitmapData.imageBitmap, + contentDescription = "Icon", + modifier = Modifier + .size(charaImageBitmapData.dpWidth) + .padding(8.dp), + colorFilter = when (obscure) { + true -> ColorFilter.tint(color = MaterialTheme.colorScheme.secondary) + false -> null + }, + filterQuality = FilterQuality.None + ) + } + Spacer( + modifier = Modifier + .padding(16.dp) + ) + if (!obscure) { + Column { + Image( + bitmap = nameImageBitmapData.imageBitmap, + contentDescription = "Icon", + modifier = Modifier + .width(nameImageBitmapData.dpWidth) + .height(nameImageBitmapData.dpHeight), + filterQuality = FilterQuality.None + ) + Spacer(modifier = Modifier.padding(4.dp)) + if (currentChara.baseHp != 65535) { + Text( + text = "HP: ${currentChara.baseHp}, BP: ${currentChara.baseBp}, AP: ${currentChara.baseAp}" + ) + Text(text = "Stg: ${romanNumeralsStage}, Atr: ${currentChara.attribute.toString().substring(0, 2)}") + } + } + } else { + Column { + Text(text = "????????????????") + Spacer(modifier = Modifier.padding(4.dp)) + Text(text = "Stg: -, Atr: -") + Text(text = "HP: -, BP: -, AP: -") + } + } + } + Spacer(modifier = Modifier.padding(16.dp)) + Column { + currentCharaPossibleTransformations.map { + val selectedCharaBitmap = BitmapData( + bitmap = it.spriteIdle, + width = it.spriteWidth, + height = it.spriteHeight + ) + val selectedCharaImageBitmap = selectedCharaBitmap.getImageBitmap( + context = LocalContext.current, + multiplier = 4, + obscure = it.discoveredOn == null + ) + + Card ( + modifier = Modifier + .padding(vertical = 8.dp) + ) { + Row ( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + ) { + Card ( + colors = CardColors( + containerColor = MaterialTheme.colorScheme.surfaceVariant, + contentColor = MaterialTheme.colorScheme.contentColorFor( + backgroundColor = MaterialTheme.colorScheme.surfaceVariant, + ), + disabledContainerColor = MaterialTheme.colorScheme.surfaceVariant, + disabledContentColor = MaterialTheme.colorScheme.contentColorFor( + backgroundColor = MaterialTheme.colorScheme.surfaceVariant, + ) + ) + ) { + Image( + bitmap = selectedCharaImageBitmap.imageBitmap, + contentDescription = "Icon", + modifier = Modifier + .size(selectedCharaImageBitmap.dpWidth) + .padding(8.dp), + colorFilter = when (it.discoveredOn == null) { + true -> ColorFilter.tint(color = MaterialTheme.colorScheme.secondary) + false -> null + }, + filterQuality = FilterQuality.None + ) + } + Spacer( + modifier = Modifier + .padding(16.dp) + ) + Column { + Text("Tr: ${it.requiredTrophies}; Bt: ${it.requiredBattles}; Vr: ${it.requiredVitals}; Wr: ${it.requiredWinRate}%; Ct: ${it.changeTimerHours}h") + Text("AdvLvl ${it.requiredAdventureLevelCompleted + 1}") + } + } + } + } + } + + Button( + onClick = onClickClose + ) { + Text("Close") + } + } + } + } +} \ No newline at end of file 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 632716d..95b2437 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 @@ -18,7 +18,7 @@ import com.github.nacabaro.vbhelper.di.VBHelper import com.github.nacabaro.vbhelper.domain.characters.Sprite 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.card.CharacterData import com.github.nacabaro.vbhelper.source.ApkSecretsImporter import com.github.nacabaro.vbhelper.source.SecretsImporter import com.github.nacabaro.vbhelper.source.SecretsRepository @@ -109,10 +109,189 @@ class SettingsScreenControllerImpl( filePickerCard.launch(arrayOf("*/*")) } + private suspend fun importEvoData( + cardId: Long, + card: com.github.cfogrady.vb.dim.card.Card<*, *, *, *, *, *> + ) { + for (index in 0 until card.transformationRequirements.transformationEntries.size) { + val evo = card.transformationRequirements.transformationEntries[index] + + var transformationTimerHours: Int + var unlockAdventureLevel: Int + + if (card is BemCard) { + transformationTimerHours = card + .transformationRequirements + .transformationEntries[index] + .minutesUntilTransformation / 60 + unlockAdventureLevel = if ( + card + .transformationRequirements + .transformationEntries[index] + .requiredCompletedAdventureLevel == 65535 + ) { + 0 + } else { + card + .transformationRequirements + .transformationEntries[index] + .requiredCompletedAdventureLevel + } + } else { + transformationTimerHours = (card as DimCard) + .transformationRequirements + .transformationEntries[index] + .hoursUntilEvolution + unlockAdventureLevel = if ( + card + .adventureLevels + .levels + .last() + .bossCharacterIndex == card.transformationRequirements.transformationEntries[index].toCharacterIndex + ) { + 14 + /* + Magic number incoming!! + + In the case of DiMCards, stage 15 is the one that unlocks the locked character. + We know it is a locked character if the last adventure level's boss character index + is the current index. If it is, we add stage 15 complete as a requirement for transformation. + */ + } else { + 0 + /* + Another magic number... + + The rest of the characters are not locked. + */ + } + } + + database + .characterDao() + .insertPossibleTransformation( + cardId = cardId, + fromChraraIndex = evo.fromCharacterIndex, + toChraraIndex = evo.toCharacterIndex, + requiredVitals = evo.requiredVitalValues, + requiredTrophies = evo.requiredTrophies, + requiredBattles = evo.requiredBattles, + requiredWinRate = evo.requiredWinRatio, + requiredAdventureLevelCompleted = unlockAdventureLevel, + changeTimerHours = transformationTimerHours + ) + } + } + + private suspend fun importCharacterData( + cardId: Long, + card: com.github.cfogrady.vb.dim.card.Card<*, *, *, *, *, *> + ) { + var spriteCounter = when (card is BemCard) { + true -> 54 + false -> 10 + } + + val domainCharacters = mutableListOf() + + val characters = card + .characterStats + .characterEntries + + 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( + CharacterData( + cardId = cardId, + spriteId = spriteId, + charaIndex = index, + nameSprite = card.spriteData.sprites[spriteCounter].pixelData, + stage = characters[index].stage, + attribute = NfcCharacter.Attribute.entries[characters[index].attribute], + baseHp = characters[index].hp, + baseBp = characters[index].dp, + baseAp = characters[index].ap, + nameWidth = card.spriteData.sprites[spriteCounter].spriteDimensions.width, + nameHeight = card.spriteData.sprites[spriteCounter].spriteDimensions.height + ) + ) + + spriteCounter += if (card is BemCard) { + 14 + } else { + when (index) { + 0 -> 6 + 1 -> 7 + else -> 14 + } + } + } + + database + .characterDao() + .insertCharacter(*domainCharacters.toTypedArray()) + } + + private fun updateCardProgress( + cardId: Long, + ) { + val cardProgress = CardProgress( + cardId = cardId, + currentStage = 0, + unlocked = false + ) + + database + .cardProgressDao() + .updateDimProgress(cardProgress) + } + private fun importCard(uri: Uri) { context.lifecycleScope.launch(Dispatchers.IO) { val contentResolver = context.contentResolver val inputStream = contentResolver.openInputStream(uri) + inputStream.use { fileReader -> val dimReader = DimReader() val card = dimReader.readCard(fileReader, false) @@ -120,112 +299,22 @@ class SettingsScreenControllerImpl( val cardModel = Card( cardId = card.header.dimId, logo = card.spriteData.sprites[0].pixelData, - name = card.spriteData.text, // TODO Make user write card name + name = card.spriteData.text, stageCount = card.adventureLevels.levels.size, logoHeight = card.spriteData.sprites[0].height, logoWidth = card.spriteData.sprites[0].width, isBEm = card is BemCard ) - val dimId = database + val cardId = database .cardDao() .insertNewCard(cardModel) - val cardProgress = CardProgress( - cardId = dimId, - currentStage = 0, - unlocked = false - ) + updateCardProgress(cardId = cardId) - database - .cardProgressDao() - .updateDimProgress(cardProgress) + importCharacterData(cardId, card) - val characters = card - .characterStats - .characterEntries - - var spriteCounter = when (card is BemCard) { - true -> 54 - false -> 10 - } - - val domainCharacters = mutableListOf() - - 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( - Character( - dimId = dimId, - spriteId = spriteId, - monIndex = index, - name = card.spriteData.sprites[spriteCounter].pixelData, - stage = characters[index].stage, - attribute = NfcCharacter.Attribute.entries[characters[index].attribute], - baseHp = characters[index].hp, - baseBp = characters[index].dp, - baseAp = characters[index].ap, - nameWidth = card.spriteData.sprites[spriteCounter].spriteDimensions.width, - nameHeight = card.spriteData.sprites[spriteCounter].spriteDimensions.height, - ) - ) - - spriteCounter += if (card is BemCard) { - 14 - } else { - when (index) { - 0 -> 6 - 1 -> 7 - else -> 14 - } - } - } - - database - .characterDao() - .insertCharacter(*domainCharacters.toTypedArray()) + importEvoData(cardId, card) } inputStream?.close() diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/source/DexRepository.kt b/app/src/main/java/com/github/nacabaro/vbhelper/source/DexRepository.kt index e2df631..dcec614 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/source/DexRepository.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/source/DexRepository.kt @@ -11,7 +11,11 @@ class DexRepository ( return db.dexDao().getCardsWithProgress() } - suspend fun getCharactersByDimId(cardId: Long): List { + suspend fun getCharactersByCardId(cardId: Long): List { return db.dexDao().getSingleCardProgress(cardId) } + + suspend fun getCardPossibleTransformations(cardId: Long): List { + return db.characterDao().getEvolutionRequirementsForCard(cardId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/nacabaro/vbhelper/utils/BitmapData.kt b/app/src/main/java/com/github/nacabaro/vbhelper/utils/BitmapData.kt index 3e1d607..eae66e2 100644 --- a/app/src/main/java/com/github/nacabaro/vbhelper/utils/BitmapData.kt +++ b/app/src/main/java/com/github/nacabaro/vbhelper/utils/BitmapData.kt @@ -1,6 +1,11 @@ package com.github.nacabaro.vbhelper.utils +import android.content.Context import android.graphics.Bitmap +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp import com.github.cfogrady.vb.dim.sprite.SpriteData // simple, but smooth @@ -10,6 +15,32 @@ data class BitmapData ( val height: Int ) +data class ImageBitmapData( + val imageBitmap: ImageBitmap, + val dpWidth: Dp, + val dpHeight: Dp +) + +fun BitmapData.getImageBitmap( + context: Context, + multiplier: Int, + obscure: Boolean +): ImageBitmapData { + val density: Float = context.resources.displayMetrics.density + + val imageBitmap: ImageBitmap = if (obscure) { + this.getObscuredBitmap().asImageBitmap() + } else { + this.getBitmap().asImageBitmap() + } + + return ImageBitmapData( + imageBitmap = imageBitmap, + dpWidth = (this.width * multiplier / density).dp, + dpHeight = (this.height * multiplier / density).dp + ) +} + fun BitmapData.getBitmap(): Bitmap { return Bitmap.createBitmap(createARGBIntArray(), this.width, this.height, Bitmap.Config.HARDWARE) }