diff --git a/app/src/main/java/com/daniil/shevtsov/idle/feature/action/domain/Action.kt b/app/src/main/java/com/daniil/shevtsov/idle/feature/action/domain/Action.kt index 75cb0882..47a6e8c6 100644 --- a/app/src/main/java/com/daniil/shevtsov/idle/feature/action/domain/Action.kt +++ b/app/src/main/java/com/daniil/shevtsov/idle/feature/action/domain/Action.kt @@ -5,11 +5,15 @@ import com.daniil.shevtsov.idle.feature.resource.domain.ResourceKey import com.daniil.shevtsov.idle.feature.tagsystem.domain.Tag import com.daniil.shevtsov.idle.feature.tagsystem.domain.TagRelation +typealias ResourceChanges = Map +typealias RatioChangeForTags = Map, Double> +typealias RatioChanges = Map + data class Action( val id: Long, val title: String, val subtitle: String, - val resourceChanges: Map, - val ratioChanges: Map, + val resourceChanges: ResourceChanges, + val ratioChanges: RatioChanges, val tags: Map>, ) diff --git a/app/src/main/java/com/daniil/shevtsov/idle/feature/action/domain/ActionStubs.kt b/app/src/main/java/com/daniil/shevtsov/idle/feature/action/domain/ActionStubs.kt index 398013ec..42540991 100644 --- a/app/src/main/java/com/daniil/shevtsov/idle/feature/action/domain/ActionStubs.kt +++ b/app/src/main/java/com/daniil/shevtsov/idle/feature/action/domain/ActionStubs.kt @@ -6,16 +6,26 @@ import com.daniil.shevtsov.idle.feature.action.presentation.ActionModel import com.daniil.shevtsov.idle.feature.action.presentation.RatioChangeModel import com.daniil.shevtsov.idle.feature.action.presentation.ResourceChangeModel import com.daniil.shevtsov.idle.feature.ratio.domain.RatioKey -import com.daniil.shevtsov.idle.feature.resource.domain.ResourceKey +import com.daniil.shevtsov.idle.feature.ratio.domain.ratioChange import com.daniil.shevtsov.idle.feature.tagsystem.domain.Tag import com.daniil.shevtsov.idle.feature.tagsystem.domain.TagRelation +fun ratioChanges( + vararg entries: Pair, +): RatioChanges = ratioChangesWithTags( + *entries.map { it.first to ratioChange(tags = emptyList(), change = it.second) }.toTypedArray() +) + +fun ratioChangesWithTags( + vararg entries: Pair, +): RatioChanges = entries.associate { it.first to it.second } + fun action( id: Long = 0L, title: String = "", subtitle: String = "", - resourceChanges: Map = mapOf(), - ratioChanges: Map = mapOf(), + resourceChanges: ResourceChanges = mapOf(), + ratioChanges: RatioChanges = mapOf(), tags: Map> = mapOf(), ) = Action( id = id, diff --git a/app/src/main/java/com/daniil/shevtsov/idle/feature/action/domain/Actions.kt b/app/src/main/java/com/daniil/shevtsov/idle/feature/action/domain/Actions.kt index 47ce43d7..b7673b19 100644 --- a/app/src/main/java/com/daniil/shevtsov/idle/feature/action/domain/Actions.kt +++ b/app/src/main/java/com/daniil/shevtsov/idle/feature/action/domain/Actions.kt @@ -44,7 +44,7 @@ fun createAllActions() = listOf( ResourceKey.Blood to -10.0, ResourceKey.Prisoner to 1.0, ), - ratioChanges = mapOf( + ratioChanges = ratioChanges( RatioKey.Suspicion to 0.2, ), tags = mapOf( @@ -62,7 +62,7 @@ fun createAllActions() = listOf( ResourceKey.Prisoner to -1.0, ResourceKey.Remains to 1.0, ), - ratioChanges = mapOf( + ratioChanges = ratioChanges( RatioKey.Suspicion to 0.05, ), tags = mapOf( @@ -92,7 +92,7 @@ fun createAllActions() = listOf( resourceChanges = mapOf( ResourceKey.Remains to -1.0, ), - ratioChanges = mapOf( + ratioChanges = ratioChanges( RatioKey.Suspicion to -0.05, ), tags = mapOf( @@ -108,7 +108,7 @@ fun createAllActions() = listOf( resourceChanges = mapOf( ResourceKey.Organs to 1.0, ), - ratioChanges = mapOf( + ratioChanges = ratioChanges( RatioKey.Suspicion to 0.1, ), tags = mapOf( @@ -125,7 +125,7 @@ fun createAllActions() = listOf( resourceChanges = mapOf( ResourceKey.Remains to -1.0, ), - ratioChanges = mapOf( + ratioChanges = ratioChanges( RatioKey.Suspicion to -0.1, ), tags = mapOf( @@ -172,7 +172,7 @@ fun createAllActions() = listOf( resourceChanges = mapOf( ResourceKey.Money to 15.0 ), - ratioChanges = mapOf( + ratioChanges = ratioChanges( RatioKey.Suspicion to 0.005, ), tags = mapOf( @@ -193,7 +193,7 @@ fun createAllActions() = listOf( resourceChanges = mapOf( ResourceKey.Money to 40.0 ), - ratioChanges = mapOf( + ratioChanges = ratioChanges( RatioKey.Suspicion to 0.015 ), tags = mapOf( @@ -242,8 +242,8 @@ fun createAllActions() = listOf( resourceChanges = mapOf( ResourceKey.HumanFood to 1.0, ), - ratioChanges = mapOf( - RatioKey.Suspicion to 0.005, + ratioChanges = ratioChanges( + RatioKey.Suspicion to 0.005, ), tags = mapOf( TagRelation.RequiredAll to listOf( @@ -295,7 +295,7 @@ fun createAllActions() = listOf( Tags.Body.IronJaws, ) ), - ratioChanges = mapOf( + ratioChanges = ratioChanges( RatioKey.Suspicion to -0.1, ) ), diff --git a/app/src/main/java/com/daniil/shevtsov/idle/feature/main/domain/MainFunctionalCore.kt b/app/src/main/java/com/daniil/shevtsov/idle/feature/main/domain/MainFunctionalCore.kt index 94777c85..e53235b1 100644 --- a/app/src/main/java/com/daniil/shevtsov/idle/feature/main/domain/MainFunctionalCore.kt +++ b/app/src/main/java/com/daniil/shevtsov/idle/feature/main/domain/MainFunctionalCore.kt @@ -1,6 +1,8 @@ package com.daniil.shevtsov.idle.feature.main.domain import com.daniil.shevtsov.idle.core.navigation.Screen +import com.daniil.shevtsov.idle.feature.action.domain.RatioChanges +import com.daniil.shevtsov.idle.feature.action.domain.ResourceChanges import com.daniil.shevtsov.idle.feature.coreshell.domain.GameState import com.daniil.shevtsov.idle.feature.drawer.presentation.DrawerViewAction import com.daniil.shevtsov.idle.feature.main.presentation.MainViewAction @@ -8,6 +10,7 @@ import com.daniil.shevtsov.idle.feature.ratio.domain.Ratio import com.daniil.shevtsov.idle.feature.ratio.domain.RatioKey import com.daniil.shevtsov.idle.feature.resource.domain.Resource import com.daniil.shevtsov.idle.feature.resource.domain.ResourceKey +import com.daniil.shevtsov.idle.feature.tagsystem.domain.Tag import com.daniil.shevtsov.idle.feature.tagsystem.domain.TagRelation import com.daniil.shevtsov.idle.feature.upgrade.domain.UpgradeStatus @@ -34,7 +37,6 @@ fun mainFunctionalCore( ) is MainViewAction.LocationSelectionExpandChange -> handleLocationSelectionExpandChange( state = state, - viewAction = viewAction, ) MainViewAction.Init -> state } @@ -42,8 +44,7 @@ fun mainFunctionalCore( } fun handleLocationSelectionExpandChange( - state: GameState, - viewAction: MainViewAction.LocationSelectionExpandChange + state: GameState ): GameState { return state.copy( locationSelectionState = state.locationSelectionState.copy( @@ -119,11 +120,13 @@ fun handleActionClicked( val updatedRatios = applyRatioChanges( currentRatios = state.ratios, - ratioChanges = selectedAction.ratioChanges + ratioChanges = selectedAction.ratioChanges, + tags = state.player.tags, ) val newTags = state.player.generalTags + selectedAction.tags[TagRelation.Provides].orEmpty() - selectedAction.tags[TagRelation.Removes].orEmpty() + .toSet() return if (!hasInvalidChanges) { state.copy( @@ -133,7 +136,8 @@ fun handleActionClicked( generalTags = newTags ), currentScreen = when { - updatedRatios.find { it.key == RatioKey.Suspicion }?.value ?: 0.0 >= 1.0 -> Screen.FinishedGame + (updatedRatios.find { it.key == RatioKey.Suspicion }?.value + ?: 0.0) >= 1.0 -> Screen.FinishedGame else -> state.currentScreen } ) @@ -144,9 +148,14 @@ fun handleActionClicked( private fun applyRatioChanges( currentRatios: List, - ratioChanges: Map, + ratioChanges: RatioChanges, + tags: List, ): List = currentRatios.map { ratio -> - when (val ratioChange = ratioChanges[ratio.key]) { + val ratioChange = ratioChanges[ratio.key] + ?.minByOrNull { (matchedTags, _) -> + (tags - matchedTags.toSet()).size + }?.value + when (ratioChange) { null -> ratio else -> ratio.copy(value = ratio.value + ratioChange) } @@ -154,7 +163,7 @@ private fun applyRatioChanges( private fun applyResourceChanges( currentResources: List, - resourceChanges: Map, + resourceChanges: ResourceChanges, ) = currentResources.map { resource -> when (val resourceChange = resourceChanges[resource.key]) { null -> resource @@ -164,7 +173,7 @@ private fun applyResourceChanges( private fun hasInvalidChanges( currentResources: List, - resourceChanges: Map, + resourceChanges: ResourceChanges, ): Boolean = resourceChanges.any { (resourceKey, resourceChange) -> val currentResourceValue = currentResources .find { resource -> resource.key == resourceKey }!!.value @@ -210,6 +219,7 @@ fun handleUpgradeSelected( val updatedRatios = applyRatioChanges( currentRatios = state.ratios, ratioChanges = boughtUpgrade.ratioChanges, + tags = state.player.tags, ) return state.copy( diff --git a/app/src/main/java/com/daniil/shevtsov/idle/feature/main/presentation/MainPresentationFunctionalCore.kt b/app/src/main/java/com/daniil/shevtsov/idle/feature/main/presentation/MainPresentationFunctionalCore.kt index f88c7003..53bedff7 100644 --- a/app/src/main/java/com/daniil/shevtsov/idle/feature/main/presentation/MainPresentationFunctionalCore.kt +++ b/app/src/main/java/com/daniil/shevtsov/idle/feature/main/presentation/MainPresentationFunctionalCore.kt @@ -4,6 +4,8 @@ import com.daniil.shevtsov.idle.core.presentation.formatting.formatEnumName import com.daniil.shevtsov.idle.core.presentation.formatting.formatRound import com.daniil.shevtsov.idle.core.ui.Icons import com.daniil.shevtsov.idle.feature.action.domain.Action +import com.daniil.shevtsov.idle.feature.action.domain.RatioChanges +import com.daniil.shevtsov.idle.feature.action.domain.ResourceChanges import com.daniil.shevtsov.idle.feature.action.presentation.* import com.daniil.shevtsov.idle.feature.coreshell.domain.GameState import com.daniil.shevtsov.idle.feature.flavor.flavorMachine @@ -102,7 +104,7 @@ private fun createMainViewState(state: GameState): MainViewState { state.resources.find { it.key == ResourceKey.Blood }?.value ?: 0.0 ), resourceChanges = mapResourceChanges(resourceChanges), - ratioChanges = mapRatioChanges(ratioChanges), + ratioChanges = mapRatioChanges(ratioChanges, state.player.tags), ) } } @@ -174,8 +176,8 @@ private fun createActionState( } .filter { action -> action.resourceChanges.all { (resourceKey, resourceChange) -> - val currentResource = resources.find { it.key == resourceKey }!!.value - currentResource + resourceChange >= 0 + val currentResource = resources.find { it.key == resourceKey }?.value + currentResource != null && currentResource + resourceChange >= 0 } } .map { action -> @@ -207,7 +209,7 @@ private fun createActionState( } ), resourceChanges = mapResourceChanges(resourceChanges), - ratioChanges = mapRatioChanges(ratioChanges), + ratioChanges = mapRatioChanges(ratioChanges, state.player.tags), isEnabled = isActive, ) } @@ -223,7 +225,7 @@ private fun createActionState( ) } -private fun mapResourceChanges(resourceChanges: Map) = +private fun mapResourceChanges(resourceChanges: ResourceChanges) = resourceChanges.map { (resourceKey, changeValue) -> val formattedValue = ("+".takeIf { changeValue > 0 } ?: "") + changeValue.formatRound(digits = 2) @@ -233,8 +235,12 @@ private fun mapResourceChanges(resourceChanges: Map) = ) } -private fun mapRatioChanges(ratioChanges: Map) = - ratioChanges.map { (ratioKey, changeValue) -> +private fun mapRatioChanges( + ratioChanges: RatioChanges, + tags: List +) = + ratioChanges.map { (ratioKey, tagChanges) -> + val changeValue = tagChanges[emptyList()] ?: 0.0 val formattedValue = ("+".takeIf { changeValue > 0 } ?: "") + (changeValue * 100) .formatRound(digits = 2) + " %" diff --git a/app/src/main/java/com/daniil/shevtsov/idle/feature/ratio/domain/RatioStubs.kt b/app/src/main/java/com/daniil/shevtsov/idle/feature/ratio/domain/RatioStubs.kt index f3663880..1333ef56 100644 --- a/app/src/main/java/com/daniil/shevtsov/idle/feature/ratio/domain/RatioStubs.kt +++ b/app/src/main/java/com/daniil/shevtsov/idle/feature/ratio/domain/RatioStubs.kt @@ -1,5 +1,8 @@ package com.daniil.shevtsov.idle.feature.ratio.domain +import com.daniil.shevtsov.idle.feature.action.domain.RatioChangeForTags +import com.daniil.shevtsov.idle.feature.tagsystem.domain.Tag + fun ratio( key: RatioKey = RatioKey.Mutanity, title: String = "", @@ -11,6 +14,6 @@ fun ratio( ) fun ratioChange( - key: RatioKey = RatioKey.Mutanity, + tags: List = emptyList(), change: Double = 0.0, -) = key to change +): RatioChangeForTags = mapOf(tags to change) diff --git a/app/src/main/java/com/daniil/shevtsov/idle/feature/tagsystem/domain/TagExtensions.kt b/app/src/main/java/com/daniil/shevtsov/idle/feature/tagsystem/domain/TagExtensions.kt index fef19f8b..bc50760e 100644 --- a/app/src/main/java/com/daniil/shevtsov/idle/feature/tagsystem/domain/TagExtensions.kt +++ b/app/src/main/java/com/daniil/shevtsov/idle/feature/tagsystem/domain/TagExtensions.kt @@ -5,3 +5,13 @@ fun Map.requiredTags(): List = fun Map.hasRequiredTag(tag: Tag): Boolean = requiredTags().contains(tag) +fun List.satisfies(relation: TagRelation, tag: Tag): Boolean = satisfies(relation, listOf(tag)) + +fun List.satisfies(relation: TagRelation, tags: List): Boolean = when (relation) { + TagRelation.Provides -> false + TagRelation.Removes -> false + TagRelation.RequiresNone -> tags.none { tag -> tag in this } + TagRelation.RequiredAll -> tags.all { tag -> tag in this } + TagRelation.RequiredAny -> tags.any { tag -> tag in this } +} + diff --git a/app/src/main/java/com/daniil/shevtsov/idle/feature/tagsystem/domain/Tags.kt b/app/src/main/java/com/daniil/shevtsov/idle/feature/tagsystem/domain/Tags.kt index cd630c12..b968c2b4 100644 --- a/app/src/main/java/com/daniil/shevtsov/idle/feature/tagsystem/domain/Tags.kt +++ b/app/src/main/java/com/daniil/shevtsov/idle/feature/tagsystem/domain/Tags.kt @@ -76,8 +76,16 @@ object Tags { val Tech = Tag(name = "Tech") } + object Appearance { + val Human = Tag(name = "Human Appearance") + val Monster = Tag(name = "Monster Appearance") + } + val Surgeon = Tag(name = "Surgeon", description = "You are very precise with the scalpel") - val SolitaryJob = Tag(name = "Solitary Job", description = "People don't pay attention as long as the job gets done") + val SolitaryJob = Tag( + name = "Solitary Job", + description = "People don't pay attention as long as the job gets done" + ) val CorpseAccess = Tag(name = "Corpse Access") val MeatAccess = Tag(name = "Meat Access") val LaborIntensive = Tag(name = "Labor intensive job") diff --git a/app/src/main/java/com/daniil/shevtsov/idle/feature/upgrade/domain/Upgrade.kt b/app/src/main/java/com/daniil/shevtsov/idle/feature/upgrade/domain/Upgrade.kt index ef1d4d24..d8d8ed90 100644 --- a/app/src/main/java/com/daniil/shevtsov/idle/feature/upgrade/domain/Upgrade.kt +++ b/app/src/main/java/com/daniil/shevtsov/idle/feature/upgrade/domain/Upgrade.kt @@ -1,7 +1,7 @@ package com.daniil.shevtsov.idle.feature.upgrade.domain -import com.daniil.shevtsov.idle.feature.ratio.domain.RatioKey -import com.daniil.shevtsov.idle.feature.resource.domain.ResourceKey +import com.daniil.shevtsov.idle.feature.action.domain.RatioChanges +import com.daniil.shevtsov.idle.feature.action.domain.ResourceChanges import com.daniil.shevtsov.idle.feature.tagsystem.domain.Tag import com.daniil.shevtsov.idle.feature.tagsystem.domain.TagRelation @@ -10,8 +10,8 @@ data class Upgrade( val title: String, val subtitle: String, val price: Price, - val resourceChanges: Map, - val ratioChanges: Map, + val resourceChanges: ResourceChanges, + val ratioChanges: RatioChanges, val status: UpgradeStatus, val tags: Map>, ) diff --git a/app/src/main/java/com/daniil/shevtsov/idle/feature/upgrade/domain/UpgradeStubs.kt b/app/src/main/java/com/daniil/shevtsov/idle/feature/upgrade/domain/UpgradeStubs.kt index 6ca2ed83..38d6df93 100644 --- a/app/src/main/java/com/daniil/shevtsov/idle/feature/upgrade/domain/UpgradeStubs.kt +++ b/app/src/main/java/com/daniil/shevtsov/idle/feature/upgrade/domain/UpgradeStubs.kt @@ -1,7 +1,7 @@ package com.daniil.shevtsov.idle.feature.upgrade.domain -import com.daniil.shevtsov.idle.feature.ratio.domain.RatioKey -import com.daniil.shevtsov.idle.feature.resource.domain.ResourceKey +import com.daniil.shevtsov.idle.feature.action.domain.RatioChanges +import com.daniil.shevtsov.idle.feature.action.domain.ResourceChanges import com.daniil.shevtsov.idle.feature.tagsystem.domain.Tag import com.daniil.shevtsov.idle.feature.tagsystem.domain.TagRelation @@ -11,8 +11,8 @@ fun upgrade( subtitle: String = "", price: Double = 0.0, status: UpgradeStatus = UpgradeStatus.NotBought, - resourceChanges: Map = mapOf(), - ratioChanges: Map = mapOf(), + resourceChanges: ResourceChanges = mapOf(), + ratioChanges: RatioChanges = mapOf(), tags: Map> = mapOf(), ) = Upgrade( id = id, diff --git a/app/src/test/java/com/daniil/shevtsov/idle/feature/action/domain/ActionsTest.kt b/app/src/test/java/com/daniil/shevtsov/idle/feature/action/domain/ActionsTest.kt new file mode 100644 index 00000000..24e47305 --- /dev/null +++ b/app/src/test/java/com/daniil/shevtsov/idle/feature/action/domain/ActionsTest.kt @@ -0,0 +1,125 @@ +package com.daniil.shevtsov.idle.feature.action.domain + +import assertk.Assert +import assertk.assertThat +import assertk.assertions.index +import assertk.assertions.isEqualTo +import assertk.assertions.prop +import com.daniil.shevtsov.idle.feature.coreshell.domain.GameState +import com.daniil.shevtsov.idle.feature.coreshell.domain.gameState +import com.daniil.shevtsov.idle.feature.player.core.domain.player +import com.daniil.shevtsov.idle.feature.ratio.domain.Ratio +import com.daniil.shevtsov.idle.feature.ratio.domain.RatioKey +import com.daniil.shevtsov.idle.feature.ratio.domain.ratio +import com.daniil.shevtsov.idle.feature.tagsystem.domain.Tag +import com.daniil.shevtsov.idle.feature.tagsystem.domain.Tags +import org.junit.jupiter.api.Test + +internal class ActionsTest { + + fun actionClicked(oldState: GameState, id: Long): GameState { + val action = oldState.actions.find { it.id == id }!! + val ratioKey = RatioKey.Suspicion + val oldRatio = oldState.ratios.find { ratio -> ratio.key == ratioKey }!! + + val generalTags = oldState.player.generalTags + + val stealActionRatioChanges = mapOf( + RatioKey.Suspicion to mapOf( + listOf(Tags.State.Invisible) to 1.0, + emptyList() to 5.0, + ) + ) + val humanActionRatioChanges = mapOf( + RatioKey.Suspicion to mapOf( + listOf(Tags.Appearance.Monster) to 10.0, + emptyList() to 0.0, + ) + ) + + val ratioChanges = when (action) { + stealAction -> stealActionRatioChanges + humanAction -> humanActionRatioChanges + else -> throw IllegalArgumentException() + } + + val ratioChange = ratioChanges[RatioKey.Suspicion]?.minByOrNull { (tags, value) -> + (tags - generalTags).size + }?.value ?: 0.0 + + val newRatio = oldRatio.copy(value = oldRatio.value + ratioChange) + + return oldState.copy( + ratios = oldState.ratios.map { ratio -> + when (ratio.key) { + newRatio.key -> newRatio + else -> ratio + } + } + ) + } + + private val stealAction = + action(id = 1L, ratioChanges = ratioChanges(RatioKey.Suspicion to 5.0)) + private val humanAction = + action(id = 2L, ratioChanges = ratioChanges(RatioKey.Suspicion to 0.0)) + private val initialState = gameState( + actions = listOf(stealAction, humanAction), + ratios = listOf(ratio(key = RatioKey.Suspicion, value = 10.0)), + ) + + @Test + fun `should add much suspicion for stealing when visible`() { + val oldState = initialState + val newState = actionClicked(oldState, stealAction.id) + + assertThat(newState) + .extractingSuspicion() + .isEqualTo(15.0) + } + + @Test + fun `should add little suspicion for stealing when invisible`() { + val oldState = initialState.copy( + player = player(generalTags = listOf(Tags.State.Invisible)) + ) + + val newState = actionClicked(oldState, stealAction.id) + + assertThat(newState) + .extractingSuspicion() + .isEqualTo(11.0) + } + + @Test + fun `should add no suspicion for human action when human appearance`() { + val oldState = initialState.copy( + player = player(generalTags = listOf(Tags.HumanAppearance)) + ) + + val newState = actionClicked(oldState, humanAction.id) + + assertThat(newState) + .extractingSuspicion() + .isEqualTo(10.0) + } + + @Test + fun `should add suspicion for human action when not human appearance`() { + val oldState = initialState.copy( + player = player(generalTags = listOf(Tags.Appearance.Monster)) + ) + + val newState = actionClicked(oldState, humanAction.id) + + assertThat(newState) + .extractingSuspicion() + .isEqualTo(20.0) + } + + private fun Assert.extractingSuspicion() = prop(GameState::ratios) + .index(0) + .prop(Ratio::value) + + +} diff --git a/app/src/test/java/com/daniil/shevtsov/idle/feature/main/domain/MainFunctionalCoreTest.kt b/app/src/test/java/com/daniil/shevtsov/idle/feature/main/domain/MainFunctionalCoreTest.kt index cf4e2666..618ecdd0 100644 --- a/app/src/test/java/com/daniil/shevtsov/idle/feature/main/domain/MainFunctionalCoreTest.kt +++ b/app/src/test/java/com/daniil/shevtsov/idle/feature/main/domain/MainFunctionalCoreTest.kt @@ -3,9 +3,10 @@ package com.daniil.shevtsov.idle.feature.main.domain import assertk.all import assertk.assertThat import assertk.assertions.* -import com.daniil.shevtsov.idle.core.domain.balanceConfig import com.daniil.shevtsov.idle.core.navigation.Screen import com.daniil.shevtsov.idle.feature.action.domain.action +import com.daniil.shevtsov.idle.feature.action.domain.ratioChanges +import com.daniil.shevtsov.idle.feature.action.domain.ratioChangesWithTags import com.daniil.shevtsov.idle.feature.coreshell.domain.GameState import com.daniil.shevtsov.idle.feature.coreshell.domain.gameState import com.daniil.shevtsov.idle.feature.location.domain.LocationSelectionState @@ -17,9 +18,6 @@ import com.daniil.shevtsov.idle.feature.main.presentation.SectionState import com.daniil.shevtsov.idle.feature.main.presentation.sectionState import com.daniil.shevtsov.idle.feature.player.core.domain.Player import com.daniil.shevtsov.idle.feature.player.core.domain.player -import com.daniil.shevtsov.idle.feature.player.species.domain.Species -import com.daniil.shevtsov.idle.feature.player.trait.domain.TraitId -import com.daniil.shevtsov.idle.feature.player.trait.domain.playerTrait import com.daniil.shevtsov.idle.feature.ratio.domain.Ratio import com.daniil.shevtsov.idle.feature.ratio.domain.RatioKey import com.daniil.shevtsov.idle.feature.ratio.domain.ratio @@ -51,7 +49,7 @@ class MainFunctionalCoreTest { id = 0L, price = 4.0, resourceChanges = mapOf(ResourceKey.Blood to -4.0), - ratioChanges = mapOf(RatioKey.Mutanity to 0.4), + ratioChanges = ratioChanges(RatioKey.Mutanity to 0.4), ) ), ) @@ -90,7 +88,7 @@ class MainFunctionalCoreTest { id = 1L, tags = mapOf(TagRelation.Provides to listOf(providedTag)), resourceChanges = mapOf(ResourceKey.Blood to -0.4), - ratioChanges = mapOf(RatioKey.Mutanity to 0.5), + ratioChanges = ratioChanges(RatioKey.Mutanity to 0.5), ) ), ) @@ -116,9 +114,9 @@ class MainFunctionalCoreTest { resourceChange(key = ResourceKey.Blood, change = 2.0), resourceChange(key = ResourceKey.Money, change = -7.0), ), - ratioChanges = mapOf( - ratioChange(key = RatioKey.Mutanity, change = 2.0), - ratioChange(key = RatioKey.Suspicion, change = -3.0), + ratioChanges = ratioChangesWithTags( + RatioKey.Mutanity to ratioChange(change = 2.0), + RatioKey.Suspicion to ratioChange(change = -3.0), ), tags = mapOf( TagRelation.Provides to listOf(providedTag) @@ -318,7 +316,7 @@ class MainFunctionalCoreTest { ratio(key = RatioKey.Suspicion, value = 0.95), ), actions = listOf( - action(id = 1L, ratioChanges = mapOf(RatioKey.Suspicion to 0.05)) + action(id = 1L, ratioChanges = ratioChanges(RatioKey.Suspicion to 0.05)) ) ) diff --git a/app/src/test/java/com/daniil/shevtsov/idle/feature/main/presentation/MainPresentationTest.kt b/app/src/test/java/com/daniil/shevtsov/idle/feature/main/presentation/MainPresentationTest.kt index e2897923..a5dd231a 100644 --- a/app/src/test/java/com/daniil/shevtsov/idle/feature/main/presentation/MainPresentationTest.kt +++ b/app/src/test/java/com/daniil/shevtsov/idle/feature/main/presentation/MainPresentationTest.kt @@ -6,6 +6,7 @@ import assertk.assertThat import assertk.assertions.* import com.daniil.shevtsov.idle.core.ui.Icons import com.daniil.shevtsov.idle.feature.action.domain.action +import com.daniil.shevtsov.idle.feature.action.domain.ratioChanges import com.daniil.shevtsov.idle.feature.action.presentation.* import com.daniil.shevtsov.idle.feature.coreshell.domain.gameState import com.daniil.shevtsov.idle.feature.flavor.Flavors @@ -22,6 +23,7 @@ import com.daniil.shevtsov.idle.feature.ratio.domain.ratio import com.daniil.shevtsov.idle.feature.ratio.presentation.RatioModel import com.daniil.shevtsov.idle.feature.resource.domain.ResourceKey import com.daniil.shevtsov.idle.feature.resource.domain.resource +import com.daniil.shevtsov.idle.feature.resource.domain.resourceChange import com.daniil.shevtsov.idle.feature.resource.presentation.ResourceModel import com.daniil.shevtsov.idle.feature.shop.presentation.UpgradesViewState import com.daniil.shevtsov.idle.feature.tagsystem.domain.TagRelation @@ -696,7 +698,7 @@ class MainPresentationTest { fun `should display action ratio changes`() = runBlockingTest { val action = action( id = 1L, - ratioChanges = mapOf( + ratioChanges = ratioChanges( RatioKey.Mutanity to 0.5, RatioKey.Suspicion to -0.01, ) @@ -844,6 +846,84 @@ class MainPresentationTest { .containsExactly(mainRatio, RatioKey.Suspicion) } + @Test + fun `should show resource changes of action`() { + val blood = resource(key = ResourceKey.Blood, value = 10.0) + val money = resource(key = ResourceKey.Money, value = 10.0) + val state = gameState( + resources = listOf(blood, money), + actions = listOf( + action( + resourceChanges = mapOf( + resourceChange(key = blood.key, change = 5.0), + resourceChange(key = money.key, change = -5.0), + ) + ) + ) + ) + val viewState = mapMainViewState(state) + + assertThat(viewState) + .extractingHumanActions() + .extracting(ActionModel::resourceChanges) + .index(0) + .extracting(ResourceChangeModel::icon, ResourceChangeModel::value) + .containsExactly( + Icons.Blood to "+5", + Icons.Money to "-5", + ) + } + + @Test + fun `should show ratio changes of action`() { + val state = gameState( + actions = listOf( + action( + ratioChanges = ratioChanges( + RatioKey.Mutanity to -0.5, + RatioKey.Suspicion to 1.0, + ) + ) + ) + ) + val viewState = mapMainViewState(state) + + assertThat(viewState) + .extractingHumanActions() + .extracting(ActionModel::ratioChanges) + .index(0) + .extracting(RatioChangeModel::icon, RatioChangeModel::value) + .containsExactly( + Icons.Mutanity to "-50 %", + Icons.Suspicion to "+100 %", + ) + } + + @Test + fun `should show ratio changes of upgrade`() { + val state = gameState( + upgrades = listOf( + upgrade( + ratioChanges = ratioChanges( + RatioKey.Mutanity to -0.5, + RatioKey.Suspicion to 1.0, + ) + ) + ) + ) + val viewState = mapMainViewState(state) + + assertThat(viewState) + .extractingUpgrades() + .extracting(UpgradeModel::ratioChanges) + .index(0) + .extracting(RatioChangeModel::icon, RatioChangeModel::value) + .containsExactly( + Icons.Mutanity to "-50 %", + Icons.Suspicion to "+100 %", + ) + } + private fun Assert.extractingUpgrades() = extractingMainState() .prop(MainViewState.Success::shop) diff --git a/app/src/test/java/com/daniil/shevtsov/idle/feature/tagsystem/domain/TagExtensionsTest.kt b/app/src/test/java/com/daniil/shevtsov/idle/feature/tagsystem/domain/TagExtensionsTest.kt new file mode 100644 index 00000000..c02c9eac --- /dev/null +++ b/app/src/test/java/com/daniil/shevtsov/idle/feature/tagsystem/domain/TagExtensionsTest.kt @@ -0,0 +1,48 @@ +package com.daniil.shevtsov.idle.feature.tagsystem.domain + +import assertk.assertThat +import assertk.assertions.isFalse +import assertk.assertions.isTrue +import org.junit.jupiter.api.Test + +internal class TagExtensionsTest { + + private val tags = listOf(tag(name = "lol"), tag(name = "kek"), tag(name = "cheburek")) + + @Test + fun `should work for require any`() { + assertThat(tags.satisfies(TagRelation.RequiredAny, tag("kek"))) + .isTrue() + assertThat(tags.satisfies(TagRelation.RequiredAny, listOf(tag("lol"), tag("kek")))) + .isTrue() + assertThat(tags.satisfies(TagRelation.RequiredAny, listOf(tag("kek"), tag("goulash")))) + .isTrue() + assertThat(tags.satisfies(TagRelation.RequiredAny, tag("goulash"))) + .isFalse() + } + + @Test + fun `should work for require all`() { + assertThat(tags.satisfies(TagRelation.RequiredAll, tag("kek"))) + .isTrue() + assertThat(tags.satisfies(TagRelation.RequiredAll, listOf(tag("lol"), tag("kek")))) + .isTrue() + assertThat(tags.satisfies(TagRelation.RequiredAll, tag("goulash"))) + .isFalse() + assertThat(tags.satisfies(TagRelation.RequiredAll, listOf(tag("lol"), tag("goulash")))) + .isFalse() + } + + @Test + fun `should work for require none`() { + assertThat(tags.satisfies(TagRelation.RequiresNone, tag("goulash"))) + .isTrue() + assertThat(tags.satisfies(TagRelation.RequiresNone, tag("kek"))) + .isFalse() + assertThat(tags.satisfies(TagRelation.RequiresNone, listOf(tag("lol"), tag("kek")))) + .isFalse() + assertThat(tags.satisfies(TagRelation.RequiresNone, listOf(tag("lol"), tag("goulash")))) + .isFalse() + } + +} diff --git a/gradle.properties b/gradle.properties index 8602c779..5d871dff 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,4 +16,5 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 --illegal-access=permit # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true # Kotlin code style for this project: "official" or "obsolete": -kotlin.code.style=official \ No newline at end of file +kotlin.code.style=official +#org.gradle.unsafe.configuration-cache=true