diff --git a/Habitica/res/values/strings.xml b/Habitica/res/values/strings.xml index e5c1880ef..78c648415 100644 --- a/Habitica/res/values/strings.xml +++ b/Habitica/res/values/strings.xml @@ -1459,6 +1459,7 @@ Subscribe to hold on with 1HP! Your subscription gives you an extra chance at the Armoire! You got a second chance with 1HP! + Your %s broke diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt index f2eb0e363..fdd982bb7 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/api/ApiService.kt @@ -182,7 +182,7 @@ interface ApiService { suspend fun sleep(): HabitResponse @POST("user/revive") - suspend fun revive(): HabitResponse + suspend fun revive(): HabitResponse @POST("user/class/cast/{skill}") suspend fun useSkill( diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt index 5711c047c..ba331ff5d 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/ApiClient.kt @@ -122,7 +122,7 @@ interface ApiClient { suspend fun loginApple(authToken: String): UserAuthResponse? suspend fun sleep(): Boolean? - suspend fun revive(): User? + suspend fun revive(): Items? suspend fun useSkill(skillName: String, targetType: String, targetId: String): SkillResponse? diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt index 4714ba5ce..85372fe6f 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/UserRepository.kt @@ -5,6 +5,7 @@ import com.habitrpg.android.habitica.models.QuestAchievement import com.habitrpg.android.habitica.models.Skill import com.habitrpg.android.habitica.models.TeamPlan import com.habitrpg.android.habitica.models.inventory.Customization +import com.habitrpg.android.habitica.models.inventory.Equipment import com.habitrpg.android.habitica.models.responses.SkillResponse import com.habitrpg.android.habitica.models.responses.UnlockResponse import com.habitrpg.android.habitica.models.social.Group @@ -26,7 +27,7 @@ interface UserRepository : BaseRepository { suspend fun retrieveUser(withTasks: Boolean = false, forced: Boolean = false, overrideExisting: Boolean = false): User? - suspend fun revive(): User? + suspend fun revive(): Equipment? suspend fun resetTutorial(): User? diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt index 2f8bee3d3..752999001 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/ApiClientImpl.kt @@ -502,7 +502,7 @@ class ApiClientImpl( override suspend fun sleep(): Boolean? = process { apiService.sleep() } - override suspend fun revive(): User? = process { apiService.revive() } + override suspend fun revive(): Items? = process { apiService.revive() } override suspend fun useSkill(skillName: String, targetType: String, targetId: String): SkillResponse? { return process { apiService.useSkill(skillName, targetType, targetId) } diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt index 51d1e379c..4d491066b 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/data/implementation/UserRepositoryImpl.kt @@ -9,11 +9,13 @@ import com.habitrpg.android.habitica.models.Achievement import com.habitrpg.android.habitica.models.QuestAchievement import com.habitrpg.android.habitica.models.TeamPlan import com.habitrpg.android.habitica.models.inventory.Customization +import com.habitrpg.android.habitica.models.inventory.Equipment import com.habitrpg.android.habitica.models.responses.SkillResponse import com.habitrpg.android.habitica.models.responses.UnlockResponse import com.habitrpg.android.habitica.models.social.Group import com.habitrpg.android.habitica.models.social.GroupMembership import com.habitrpg.android.habitica.models.tasks.Task +import com.habitrpg.android.habitica.models.user.OwnedItem import com.habitrpg.android.habitica.models.user.Stats import com.habitrpg.android.habitica.models.user.User import com.habitrpg.android.habitica.models.user.UserQuestStatus @@ -98,16 +100,17 @@ class UserRepositoryImpl( } } - override suspend fun revive(): User? { - val revivedUser = apiClient.revive() + override suspend fun revive(): Equipment? { + val items = apiClient.revive() val currentUser = localRepository.getLiveUser(currentUserID) - if (revivedUser != null && currentUser != null) { - val brokenItem = currentUser.items?.gear?.owned?.firstOrNull { equipment -> - revivedUser.items?.gear?.owned?.filter { it.key == equipment.key }?.size == 0 + var brokenItem: Equipment? = null + if (items != null && currentUser != null) { + brokenItem = items.gear?.owned?.filter { it.owned == false }?.firstOrNull { equipment -> + currentUser.items?.gear?.owned?.firstOrNull { it.key == equipment.key && it.owned == true } != null } - } - return retrieveUser(false, true) + retrieveUser(false, true) + return brokenItem } override suspend fun resetTutorial(): User? { diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/DeathActivity.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/DeathActivity.kt index 3f4e943ef..cb5bd1709 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/DeathActivity.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/activities/DeathActivity.kt @@ -31,6 +31,7 @@ import com.habitrpg.common.habitica.helpers.ExceptionHandler import com.habitrpg.common.habitica.helpers.launchCatching import com.plattysoft.leonids.ParticleSystem import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.MainScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.util.Calendar @@ -143,9 +144,13 @@ class DeathActivity : BaseActivity(), SnackbarActivity { } lifecycleScope.launch(ExceptionHandler.coroutine()) { userRepository.updateUser("stats.hp", 1) - HabiticaSnackbar.showSnackbar( - this@DeathActivity.snackbarContainer(), getString(R.string.subscriber_benefit_success_faint), HabiticaSnackbar.SnackbarDisplayType.SUCCESS, isSubscriberBenefit = true) - delay(2000) + MainScope().launchCatching { + delay(1000) + (HabiticaBaseApplication.getInstance(this@DeathActivity)?.currentActivity?.get() as? SnackbarActivity)?.let {activity -> + HabiticaSnackbar.showSnackbar( + activity.snackbarContainer(), getString(R.string.subscriber_benefit_success_faint), HabiticaSnackbar.SnackbarDisplayType.SUCCESS, isSubscriberBenefit = true) + } + } finish() } } @@ -153,13 +158,20 @@ class DeathActivity : BaseActivity(), SnackbarActivity { binding.restartButton.setOnClickListener { binding.restartButton.isEnabled = false lifecycleScope.launch(ExceptionHandler.coroutine()) { - userRepository.revive() - finish() - delay(1000) - (HabiticaBaseApplication.getInstance(this@DeathActivity)?.currentActivity as? SnackbarActivity)?.let {activity -> - HabiticaSnackbar.showSnackbar( - activity.snackbarContainer(), getString(R.string.subscriber_benefit_success_faint), HabiticaSnackbar.SnackbarDisplayType.SUCCESS, isSubscriberBenefit = true) + val brokenItem = userRepository.revive() + if (brokenItem != null) { + MainScope().launchCatching { + delay(500) + (HabiticaBaseApplication.getInstance(this@DeathActivity)?.currentActivity?.get() as? SnackbarActivity)?.let { activity -> + HabiticaSnackbar.showSnackbar( + activity.snackbarContainer(), + getString(R.string.revive_broken_equipment, brokenItem.text), + HabiticaSnackbar.SnackbarDisplayType.BLACK + ) + } + } } + finish() } } startAnimating()