diff --git a/Habitica/res/drawable-mdpi/feed_base.png b/Habitica/res/drawable-mdpi/feed_base.png
new file mode 100644
index 000000000..da6110c19
Binary files /dev/null and b/Habitica/res/drawable-mdpi/feed_base.png differ
diff --git a/Habitica/res/drawable-mdpi/feed_blue.png b/Habitica/res/drawable-mdpi/feed_blue.png
new file mode 100644
index 000000000..59450f890
Binary files /dev/null and b/Habitica/res/drawable-mdpi/feed_blue.png differ
diff --git a/Habitica/res/drawable-mdpi/feed_desert.png b/Habitica/res/drawable-mdpi/feed_desert.png
new file mode 100644
index 000000000..218fcfd4f
Binary files /dev/null and b/Habitica/res/drawable-mdpi/feed_desert.png differ
diff --git a/Habitica/res/drawable-mdpi/feed_golden.png b/Habitica/res/drawable-mdpi/feed_golden.png
new file mode 100644
index 000000000..b3d7856be
Binary files /dev/null and b/Habitica/res/drawable-mdpi/feed_golden.png differ
diff --git a/Habitica/res/drawable-mdpi/feed_pink.png b/Habitica/res/drawable-mdpi/feed_pink.png
new file mode 100644
index 000000000..03ed882ce
Binary files /dev/null and b/Habitica/res/drawable-mdpi/feed_pink.png differ
diff --git a/Habitica/res/drawable-mdpi/feed_red.png b/Habitica/res/drawable-mdpi/feed_red.png
new file mode 100644
index 000000000..322ca2a3f
Binary files /dev/null and b/Habitica/res/drawable-mdpi/feed_red.png differ
diff --git a/Habitica/res/drawable-mdpi/feed_saddle.png b/Habitica/res/drawable-mdpi/feed_saddle.png
new file mode 100644
index 000000000..687142fb1
Binary files /dev/null and b/Habitica/res/drawable-mdpi/feed_saddle.png differ
diff --git a/Habitica/res/drawable-mdpi/feed_shade.png b/Habitica/res/drawable-mdpi/feed_shade.png
new file mode 100644
index 000000000..c73a90c51
Binary files /dev/null and b/Habitica/res/drawable-mdpi/feed_shade.png differ
diff --git a/Habitica/res/drawable-mdpi/feed_skeleton.png b/Habitica/res/drawable-mdpi/feed_skeleton.png
new file mode 100644
index 000000000..2906d3b38
Binary files /dev/null and b/Habitica/res/drawable-mdpi/feed_skeleton.png differ
diff --git a/Habitica/res/drawable-mdpi/feed_white.png b/Habitica/res/drawable-mdpi/feed_white.png
new file mode 100644
index 000000000..0465dab6d
Binary files /dev/null and b/Habitica/res/drawable-mdpi/feed_white.png differ
diff --git a/Habitica/res/drawable-mdpi/feed_zombie.png b/Habitica/res/drawable-mdpi/feed_zombie.png
new file mode 100644
index 000000000..0f21364fb
Binary files /dev/null and b/Habitica/res/drawable-mdpi/feed_zombie.png differ
diff --git a/Habitica/res/drawable-mdpi/stable_tile_april.png b/Habitica/res/drawable-mdpi/stable_tile_april.png
new file mode 100644
index 000000000..d5cd1e021
Binary files /dev/null and b/Habitica/res/drawable-mdpi/stable_tile_april.png differ
diff --git a/Habitica/res/drawable-mdpi/stable_tile_august.png b/Habitica/res/drawable-mdpi/stable_tile_august.png
new file mode 100644
index 000000000..29afec140
Binary files /dev/null and b/Habitica/res/drawable-mdpi/stable_tile_august.png differ
diff --git a/Habitica/res/drawable-mdpi/stable_tile_december.png b/Habitica/res/drawable-mdpi/stable_tile_december.png
new file mode 100644
index 000000000..cf8678da0
Binary files /dev/null and b/Habitica/res/drawable-mdpi/stable_tile_december.png differ
diff --git a/Habitica/res/drawable-mdpi/stable_tile_february.png b/Habitica/res/drawable-mdpi/stable_tile_february.png
new file mode 100644
index 000000000..bfaf85ede
Binary files /dev/null and b/Habitica/res/drawable-mdpi/stable_tile_february.png differ
diff --git a/Habitica/res/drawable-mdpi/stable_tile_janurary.png b/Habitica/res/drawable-mdpi/stable_tile_janurary.png
new file mode 100644
index 000000000..6a84632c6
Binary files /dev/null and b/Habitica/res/drawable-mdpi/stable_tile_janurary.png differ
diff --git a/Habitica/res/drawable-mdpi/stable_tile_july.png b/Habitica/res/drawable-mdpi/stable_tile_july.png
new file mode 100644
index 000000000..371d7e5e4
Binary files /dev/null and b/Habitica/res/drawable-mdpi/stable_tile_july.png differ
diff --git a/Habitica/res/drawable-mdpi/stable_tile_june.png b/Habitica/res/drawable-mdpi/stable_tile_june.png
new file mode 100644
index 000000000..aaea748e0
Binary files /dev/null and b/Habitica/res/drawable-mdpi/stable_tile_june.png differ
diff --git a/Habitica/res/drawable-mdpi/stable_tile_march.png b/Habitica/res/drawable-mdpi/stable_tile_march.png
new file mode 100644
index 000000000..393d6a665
Binary files /dev/null and b/Habitica/res/drawable-mdpi/stable_tile_march.png differ
diff --git a/Habitica/res/drawable-mdpi/stable_tile_may.png b/Habitica/res/drawable-mdpi/stable_tile_may.png
new file mode 100644
index 000000000..bb017c40b
Binary files /dev/null and b/Habitica/res/drawable-mdpi/stable_tile_may.png differ
diff --git a/Habitica/res/drawable-mdpi/stable_tile_november.png b/Habitica/res/drawable-mdpi/stable_tile_november.png
new file mode 100644
index 000000000..565958f4e
Binary files /dev/null and b/Habitica/res/drawable-mdpi/stable_tile_november.png differ
diff --git a/Habitica/res/drawable-mdpi/stable_tile_october.png b/Habitica/res/drawable-mdpi/stable_tile_october.png
new file mode 100644
index 000000000..7841588a5
Binary files /dev/null and b/Habitica/res/drawable-mdpi/stable_tile_october.png differ
diff --git a/Habitica/res/drawable-mdpi/stable_tile_september.png b/Habitica/res/drawable-mdpi/stable_tile_september.png
new file mode 100644
index 000000000..e6faa878b
Binary files /dev/null and b/Habitica/res/drawable-mdpi/stable_tile_september.png differ
diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml
index dd5ecdd7a..9e3714de5 100644
--- a/Habitica/res/values/strings.xml
+++ b/Habitica/res/values/strings.xml
@@ -1071,7 +1071,7 @@
Hatch Pet again
Magic Potions
Magic Potion
- Use Saddle
+ Give Saddle
Hatch your Pet
Hatch
Delete Challenge Task?
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt
index f5ece205b..4d65fd468 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/InventoryRepositoryImpl.kt
@@ -218,8 +218,8 @@ class InventoryRepositoryImpl(
}
override suspend fun feedPet(pet: Pet, food: Food): FeedResponse? {
- val feedResponse = apiClient.feedPet(pet.key ?: "", food.key) ?: return null
- localRepository.feedPet(food.key, pet.key ?: "", feedResponse.value ?: 0, currentUserID)
+ val feedResponse = apiClient.feedPet(pet.key, food.key) ?: return null
+ localRepository.feedPet(food.key, pet.key, feedResponse.value ?: 0, currentUserID)
return feedResponse
}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Animal.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Animal.kt
index 11de86c15..1dc31f5b6 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Animal.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Animal.kt
@@ -1,7 +1,7 @@
package com.habitrpg.android.habitica.models.inventory
interface Animal {
- var key: String?
+ var key: String
var text: String?
var type: String?
var animal: String
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Mount.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Mount.kt
index 178362698..d0a7247a7 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Mount.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Mount.kt
@@ -6,21 +6,17 @@ import io.realm.annotations.PrimaryKey
open class Mount : RealmObject(), Animal {
@PrimaryKey
- override var key: String? = null
+ override var key: String = ""
override var animal: String = ""
get() {
- return if (field.isBlank()) {
- key?.split("-")?.toTypedArray()?.get(0) ?: ""
- } else {
- field
+ return field.ifBlank {
+ key.split("-").toTypedArray()[0]
}
}
override var color: String = ""
get() {
- return if (field.isBlank()) {
- key?.split("-")?.toTypedArray()?.get(1) ?: ""
- } else {
- field
+ return field.ifBlank {
+ key.split("-").toTypedArray()[1]
}
}
override var text: String? = null
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Pet.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Pet.kt
index ef90863c4..275c01075 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Pet.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/models/inventory/Pet.kt
@@ -6,21 +6,17 @@ import io.realm.annotations.PrimaryKey
open class Pet : RealmObject(), Animal {
@PrimaryKey
- override var key: String? = null
+ override var key: String = ""
override var animal: String = ""
get() {
- return if (field.isBlank()) {
- key?.split("-")?.toTypedArray()?.get(0) ?: ""
- } else {
- field
+ return field.ifBlank {
+ key.split("-").toTypedArray()[0]
}
}
override var color: String = ""
get() {
- return if (field.isBlank()) {
- key?.split("-")?.toTypedArray()?.get(1) ?: ""
- } else {
- field
+ return field.ifBlank {
+ key.split("-").toTypedArray()[1]
}
}
override var text: String? = null
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/PetDetailRecyclerAdapter.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/PetDetailRecyclerAdapter.kt
index f4329bc8b..681971cfb 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/PetDetailRecyclerAdapter.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/adapter/inventory/PetDetailRecyclerAdapter.kt
@@ -114,7 +114,7 @@ class PetDetailRecyclerAdapter : androidx.recyclerview.widget.RecyclerView.Adapt
} else {
val pet = itemList[position] as Pet
if ((
- ownedPets?.get(pet.key ?: "")?.trained
+ ownedPets?.get(pet.key)?.trained
?: 0
) <= 0 && eggCount(pet) > 0 && potionCount(pet) > 0
) {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt
index 347683ae6..92304dc48 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/viewHolders/PetViewHolder.kt
@@ -1,5 +1,6 @@
package com.habitrpg.android.habitica.ui.viewHolders
+import android.app.Activity
import android.graphics.PorterDuff
import android.graphics.drawable.BitmapDrawable
import android.view.View
@@ -16,7 +17,10 @@ import com.habitrpg.android.habitica.models.inventory.Pet
import com.habitrpg.android.habitica.ui.menu.BottomSheetMenu
import com.habitrpg.android.habitica.ui.menu.BottomSheetMenuItem
import com.habitrpg.android.habitica.ui.views.dialogs.PetSuggestHatchDialog
+import com.habitrpg.android.habitica.ui.views.showAsBottomSheet
+import com.habitrpg.android.habitica.ui.views.stable.PetBottomSheet
import com.habitrpg.common.habitica.extensions.DataBindingUtils
+import dagger.hilt.android.internal.managers.ViewComponentManager
class PetViewHolder(
parent: ViewGroup,
@@ -110,39 +114,23 @@ class PetViewHolder(
return
}
val context = itemView.context
- val menu = BottomSheetMenu(context)
- menu.setTitle(animal?.text)
- menu.setImage("stable_Pet-${animal?.animal}-${animal?.color}")
-
- val hasCurrentPet = currentPet.equals(animal?.key)
- val labelId = if (hasCurrentPet) R.string.unequip else R.string.equip
- menu.addMenuItem(BottomSheetMenuItem(itemView.resources.getString(labelId)))
-
- if (canRaiseToMount) {
- menu.addMenuItem(BottomSheetMenuItem(itemView.resources.getString(R.string.feed)))
- if (ownsSaddles) {
- menu.addMenuItem(BottomSheetMenuItem(itemView.resources.getString(R.string.use_saddle)))
+ animal?.let { pet ->
+ (if (context is ViewComponentManager.FragmentContextWrapper) {
+ context.baseContext
+ } else {
+ context
+ }as Activity).showAsBottomSheet {
+ PetBottomSheet(
+ pet,
+ currentPet.equals(animal?.key),
+ canRaiseToMount,
+ ownsSaddles,
+ onEquip,
+ onFeed,
+ it
+ )
}
}
- menu.setSelectionRunnable { index ->
- val pet = animal ?: return@setSelectionRunnable
- when (index) {
- 0 -> {
- animal?.let {
- onEquip?.invoke(it.key ?: "")
- }
- }
- 1 -> {
- onFeed?.invoke(pet, null)
- }
- 2 -> {
- val saddle = Food()
- saddle.key = "Saddle"
- onFeed?.invoke(pet, saddle)
- }
- }
- }
- menu.show()
}
private fun showRequirementsDialog() {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaButton.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaButton.kt
index ff9d5b67b..affa2b626 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaButton.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/HabiticaButton.kt
@@ -31,8 +31,8 @@ fun HabiticaButton(
Box(
contentAlignment = Alignment.Center,
modifier = modifier
- .background(background, HabiticaTheme.shapes.medium)
.clickable { onClick() }
+ .background(background, HabiticaTheme.shapes.medium)
.fillMaxWidth()
.padding(contentPadding)
) {
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/PixelArtView.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/PixelArtView.kt
index b06d69e3f..bd4a2e8c6 100644
--- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/PixelArtView.kt
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/PixelArtView.kt
@@ -1,7 +1,10 @@
package com.habitrpg.android.habitica.ui.views
+import android.graphics.Bitmap
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.ImageBitmap
+import androidx.compose.ui.graphics.asAndroidBitmap
import androidx.compose.ui.viewinterop.AndroidView
import com.habitrpg.common.habitica.extensions.loadImage
import com.habitrpg.common.habitica.views.PixelArtView
@@ -26,3 +29,19 @@ fun PixelArtView(
}
)
}
+
+@Composable
+fun PixelArtView(
+ bitmap: ImageBitmap,
+ modifier: Modifier = Modifier,
+) {
+ AndroidView(
+ modifier = modifier, // Occupy the max size in the Compose UI tree
+ factory = { context ->
+ PixelArtView(context)
+ },
+ update = { view ->
+ view.bitmap = bitmap.asAndroidBitmap()
+ }
+ )
+}
diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/stable/PetBottomSheet.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/stable/PetBottomSheet.kt
new file mode 100644
index 000000000..62b165344
--- /dev/null
+++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/views/stable/PetBottomSheet.kt
@@ -0,0 +1,242 @@
+package com.habitrpg.android.habitica.ui.views.stable
+
+import android.graphics.Bitmap
+import androidx.compose.animation.core.FastOutSlowInEasing
+import androidx.compose.animation.core.LinearOutSlowInEasing
+import androidx.compose.animation.core.RepeatMode
+import androidx.compose.animation.core.StartOffset
+import androidx.compose.animation.core.animateFloat
+import androidx.compose.animation.core.infiniteRepeatable
+import androidx.compose.animation.core.keyframes
+import androidx.compose.animation.core.rememberInfiniteTransition
+import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.heightIn
+import androidx.compose.foundation.layout.offset
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.ImageBitmap
+import androidx.compose.ui.graphics.ImageShader
+import androidx.compose.ui.graphics.Paint
+import androidx.compose.ui.graphics.TileMode
+import androidx.compose.ui.graphics.asAndroidBitmap
+import androidx.compose.ui.graphics.asImageBitmap
+import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
+import androidx.compose.ui.graphics.nativeCanvas
+import androidx.compose.ui.res.imageResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.compose.ui.zIndex
+import com.habitrpg.android.habitica.R
+import com.habitrpg.android.habitica.models.inventory.Food
+import com.habitrpg.android.habitica.models.inventory.Pet
+import com.habitrpg.android.habitica.ui.theme.HabiticaTheme
+import com.habitrpg.android.habitica.ui.views.HabiticaButton
+import com.habitrpg.android.habitica.ui.views.PixelArtView
+import com.habitrpg.common.habitica.helpers.MainNavigationController
+import java.util.Calendar
+
+@Composable
+private fun getBackgroundPainter(): ImageBitmap {
+ val calendar = Calendar.getInstance()
+ val month = calendar.get(Calendar.MONTH)
+ return ImageBitmap.imageResource(
+ when (month) {
+ Calendar.JANUARY -> R.drawable.stable_tile_janurary
+ Calendar.FEBRUARY -> R.drawable.stable_tile_february
+ Calendar.MARCH -> R.drawable.stable_tile_march
+ Calendar.APRIL -> R.drawable.stable_tile_april
+ Calendar.MAY -> R.drawable.stable_tile_may
+ Calendar.JUNE -> R.drawable.stable_tile_june
+ Calendar.JULY -> R.drawable.stable_tile_july
+ Calendar.AUGUST -> R.drawable.stable_tile_august
+ Calendar.SEPTEMBER -> R.drawable.stable_tile_september
+ Calendar.OCTOBER -> R.drawable.stable_tile_october
+ Calendar.NOVEMBER -> R.drawable.stable_tile_november
+ Calendar.DECEMBER -> R.drawable.stable_tile_december
+ else -> R.drawable.stable_tile_may
+ }
+ )
+}
+
+@Composable
+private fun getFoodPainter(petColor: String): ImageBitmap {
+ return ImageBitmap.imageResource(
+ when (petColor) {
+ "Base" -> R.drawable.feed_base
+ "CottonCandyBlue" -> R.drawable.feed_blue
+ "Desert" -> R.drawable.feed_desert
+ "Golden" -> R.drawable.feed_golden
+ "CottonCandyPink" -> R.drawable.feed_pink
+ "Red" -> R.drawable.feed_red
+ "Shade" -> R.drawable.feed_shade
+ "Skeleton" -> R.drawable.feed_skeleton
+ "White" -> R.drawable.feed_white
+ "Zombie" -> R.drawable.feed_zombie
+ else -> R.drawable.feed_base
+ }
+ )
+}
+
+@Composable
+fun PetBottomSheet(
+ pet: Pet,
+ isCurrentPet: Boolean,
+ canRaiseToMount: Boolean,
+ ownsSaddles: Boolean,
+ onEquip: ((String) -> Unit)?,
+ onFeed: ((Pet, Food?) -> Unit)?,
+ onDismiss: () -> Unit,
+ modifier: Modifier = Modifier
+) {
+ val infiniteTransition = rememberInfiniteTransition()
+ Column(
+ horizontalAlignment = Alignment.CenterHorizontally,
+ modifier = modifier.padding(horizontal = 22.dp)
+ ) {
+ Text(
+ pet.text ?: "",
+ fontSize = 16.sp,
+ fontWeight = FontWeight.Medium,
+ color = HabiticaTheme.colors.textTertiary
+ )
+ val image = getBackgroundPainter()
+ Box(
+ modifier = Modifier
+ .padding(top = 9.dp, bottom = 16.dp)
+ .fillMaxWidth()
+ .height(124.dp)
+ .clip(HabiticaTheme.shapes.medium)
+ ) {
+ Canvas(
+ modifier = Modifier
+ .height(124.dp)
+ .fillMaxWidth()
+ .zIndex(1f), onDraw = {
+ val bitmap = Bitmap.createScaledBitmap(
+ image.asAndroidBitmap(),
+ image.width.dp.roundToPx(),
+ 124.dp.roundToPx(),
+ false
+ )
+ val paint = Paint().asFrameworkPaint().apply {
+ isAntiAlias = true
+ shader = ImageShader(
+ bitmap.asImageBitmap(),
+ TileMode.Repeated,
+ TileMode.Repeated
+ )
+ }
+ drawIntoCanvas {
+ it.nativeCanvas.drawPaint(paint)
+ }
+ paint.reset()
+ })
+ val regularPosition = 33f
+ val highJump = 22f
+ val lowJump = 30f
+ val position by infiniteTransition.animateFloat(
+ initialValue = regularPosition,
+ targetValue = highJump,
+ animationSpec = infiniteRepeatable(animation = keyframes {
+ durationMillis = 6000
+ regularPosition at 0 with LinearOutSlowInEasing
+ highJump at 200 with LinearOutSlowInEasing
+ regularPosition at 400 with FastOutSlowInEasing
+ regularPosition at 1800 with FastOutSlowInEasing
+ lowJump at 1850 with LinearOutSlowInEasing
+ regularPosition at 1900 with LinearOutSlowInEasing
+ regularPosition at 2100 with FastOutSlowInEasing
+ lowJump at 2200 with LinearOutSlowInEasing
+ regularPosition at 2350 with LinearOutSlowInEasing
+ regularPosition at 6000
+ }, RepeatMode.Restart, StartOffset(1500))
+ )
+ PixelArtView(
+ imageName = "stable_Pet-${pet.animal}-${pet.color}", modifier = Modifier
+ .offset(0.dp, position.dp)
+ .size(68.dp)
+ .align(Alignment.TopCenter)
+ .zIndex(2f)
+ )
+ }
+ if (canRaiseToMount) {
+ Row(
+ horizontalArrangement = Arrangement.spacedBy(16.dp),
+ modifier = Modifier.padding(bottom = 16.dp)
+ ) {
+ HabiticaButton(
+ HabiticaTheme.colors.windowBackground,
+ HabiticaTheme.colors.textPrimary,
+ onClick = {
+ if (ownsSaddles) {
+ val saddle = Food()
+ saddle.key = "Saddle"
+ onFeed?.invoke(pet, saddle)
+ } else {
+ MainNavigationController.navigate(R.id.marketFragment)
+ }
+ onDismiss()
+ }, modifier = Modifier
+ .weight(1.0f)
+ .heightIn(min = 101.dp)
+ ) {
+ Column(horizontalAlignment = Alignment.CenterHorizontally) {
+ PixelArtView(
+ ImageBitmap.imageResource(R.drawable.feed_saddle),
+ modifier = Modifier.size(64.dp, 50.dp)
+ )
+ Text(stringResource(id = R.string.use_saddle))
+ }
+ }
+ HabiticaButton(
+ HabiticaTheme.colors.windowBackground,
+ HabiticaTheme.colors.textPrimary,
+ onClick = {
+ onFeed?.invoke(pet, null)
+ onDismiss()
+ }, modifier = Modifier
+ .weight(1.0f)
+ .heightIn(min = 101.dp)
+ ) {
+ Column(horizontalAlignment = Alignment.CenterHorizontally) {
+ PixelArtView(
+ getFoodPainter(pet.color),
+ modifier = Modifier.size(64.dp, 50.dp)
+ )
+ Text(stringResource(id = R.string.feed))
+ }
+ }
+ }
+ }
+ HabiticaButton(
+ background = HabiticaTheme.colors.tintedUiSub,
+ color = Color.White,
+ contentPadding = PaddingValues(12.dp),
+ onClick = {
+ onEquip?.invoke(pet.key)
+ onDismiss()
+ }) {
+ if (isCurrentPet) {
+ Text(stringResource(id = R.string.unequip))
+ } else {
+ Text(stringResource(id = R.string.equip))
+ }
+ }
+ }
+}