Skip to content

Commit c40d95f

Browse files
committed
Merge branch 'feat/char-advances' into 'master'
Characteristics advances Closes #52 See merge request fmasa/pv239-project!93
2 parents f2f466b + c4ec5e8 commit c40d95f

File tree

17 files changed

+211
-152
lines changed

17 files changed

+211
-152
lines changed

app/src/main/java/cz/muni/fi/rpg/model/domain/character/Character.kt

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package cz.muni.fi.rpg.model.domain.character
22

3+
import com.fasterxml.jackson.annotation.JsonAlias
34
import cz.muni.fi.rpg.model.domain.common.Ambitions
45
import cz.muni.fi.rpg.model.domain.common.Money
56
import java.lang.IllegalArgumentException
@@ -12,8 +13,9 @@ data class Character(
1213
private var psychology: String,
1314
private var motivation: String,
1415
private var race: Race,
15-
private var stats: Stats,
16-
private var maxStats: Stats,
16+
@JsonAlias("stats") // TODO: Remove alias in 1.10
17+
private var characteristicsBase: Stats,
18+
private var characteristicsAdvances: Stats = Stats(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
1719
private var points: Points,
1820
private var ambitions: Ambitions = Ambitions("", ""),
1921
private var mutation: String = "",
@@ -48,8 +50,8 @@ data class Character(
4850
career: String,
4951
socialClass: String,
5052
race: Race,
51-
stats: Stats,
52-
maxStats: Stats,
53+
characteristicsBase: Stats,
54+
characteristicsAdvances: Stats,
5355
maxWounds: Int,
5456
psychology: String,
5557
motivation: String,
@@ -60,7 +62,6 @@ data class Character(
6062
require(name.length <= NAME_MAX_LENGTH) { "Character name is too long" }
6163
require(career.length <= CAREER_MAX_LENGTH) { "Career is too long" }
6264
require(socialClass.length <= SOCIAL_CLASS_MAX_LENGTH) { "Social class is too long" }
63-
require(stats.allLowerOrEqualTo(maxStats)) { "Stats cannot be larger than max stats" }
6465
require(psychology.length <= PSYCHOLOGY_MAX_LENGTH) { "Psychology is too long" }
6566
require(motivation.length <= MOTIVATION_MAX_LENGTH) { "Motivation is too long" }
6667
require(note.length <= NOTE_MAX_LENGTH) { "Note is too long" }
@@ -70,9 +71,9 @@ data class Character(
7071
this.career = career
7172
this.socialClass = socialClass
7273
this.race = race
73-
this.stats = stats
74-
this.maxStats = maxStats
75-
points = points.withMaxWounds(maxWounds, if (hardyTalent) stats.getToughnessBonus() else 0)
74+
this.characteristicsBase = characteristicsBase
75+
this.characteristicsAdvances = characteristicsAdvances
76+
points = points.withMaxWounds(maxWounds, if (hardyTalent) getCharacteristics().getToughnessBonus() else 0)
7677
this.psychology = psychology
7778
this.motivation = motivation
7879
this.note = note
@@ -107,15 +108,16 @@ data class Character(
107108
fun updatePoints(newPoints: Points) {
108109
require(
109110
(!hardyTalent && newPoints.hardyWoundsBonus == 0) ||
110-
(hardyTalent && newPoints.hardyWoundsBonus == stats.getToughnessBonus())
111+
(hardyTalent && newPoints.hardyWoundsBonus == getCharacteristics().getToughnessBonus())
111112
) { "Hardy talent and wounds bonus are wrong" }
112113
points = newPoints
113114
}
114115

115116
fun getPoints(): Points = points
116117

117-
fun getStats(): Stats = stats
118-
fun getMaxStats(): Stats = maxStats
118+
fun getCharacteristics(): Stats = characteristicsBase + characteristicsAdvances
119+
fun getCharacteristicsBase() = characteristicsBase
120+
fun getCharacteristicsAdvances() = characteristicsAdvances
119121

120122
fun updateAmbitions(ambitions: Ambitions) {
121123
this.ambitions = ambitions

app/src/main/java/cz/muni/fi/rpg/model/domain/character/Stats.kt

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,22 @@ data class Stats(
2525
intelligence,
2626
willPower,
2727
fellowship
28-
).all { it in 0..100 }
28+
).all { it >= 0 }
2929
)
3030
}
3131

32-
fun allLowerOrEqualTo(other: Stats): Boolean {
33-
return weaponSkill <= other.weaponSkill
34-
&& dexterity <= other.dexterity
35-
&& ballisticSkill <= other.ballisticSkill
36-
&& strength <= other.strength
37-
&& toughness <= other.toughness
38-
&& agility <= other.agility
39-
&& intelligence <= other.intelligence
40-
&& initiative <= other.initiative
41-
&& willPower <= other.willPower
42-
&& fellowship <= other.fellowship
43-
}
32+
operator fun plus(other: Stats) = Stats(
33+
weaponSkill = weaponSkill + other.weaponSkill,
34+
dexterity = dexterity + other.dexterity,
35+
ballisticSkill = ballisticSkill + other.ballisticSkill,
36+
strength = strength + other.strength,
37+
toughness = toughness + other.toughness,
38+
agility = agility + other.agility,
39+
intelligence = intelligence + other.intelligence,
40+
initiative = initiative + other.initiative,
41+
willPower = willPower + other.willPower,
42+
fellowship = fellowship + other.fellowship
43+
)
4444

4545
fun getToughnessBonus() = toughness / 10
4646
}

app/src/main/java/cz/muni/fi/rpg/model/firestore/repositories/FirestoreCharacterRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ internal class FirestoreCharacterRepository(
2424
val data = mapper.toDocumentData(character)
2525

2626
Timber.d("Saving character $data in party $partyId to firestore")
27-
characters(partyId).document(character.userId).set(data, SetOptions.merge()).await()
27+
characters(partyId).document(character.userId).set(data).await()
2828
}
2929

3030
override suspend fun get(characterId: CharacterId): Character {

app/src/main/java/cz/muni/fi/rpg/model/utils.kt

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package cz.muni.fi.rpg.model
22

33
import androidx.lifecycle.LiveData
44
import androidx.lifecycle.MediatorLiveData
5+
import androidx.lifecycle.Transformations
56
import arrow.core.Either
67
import java.util.*
78

8-
99
fun generateAccessCode(): String {
1010
// TODO: Replace with better strategy
1111
return UUID.randomUUID().toString()
@@ -17,4 +17,21 @@ fun <L, R> LiveData<Either<L, R>>.right(): LiveData<R> {
1717
mediator.addSource(this) { it.map(mediator::setValue) }
1818

1919
return mediator
20-
}
20+
}
21+
22+
23+
fun <T> LiveData<T?>.notNull(): LiveData<T> {
24+
val mediator = MediatorLiveData<T>()
25+
26+
mediator.addSource(this) {
27+
if (it != null) {
28+
mediator.value = it
29+
}
30+
}
31+
32+
return mediator
33+
}
34+
35+
fun <X, Y> LiveData<X>.map(mapFunction: (X) -> Y) = Transformations.map(this, mapFunction)
36+
fun <T> LiveData<T>.distinctUntilChanged() = Transformations.distinctUntilChanged(this)
37+
fun <X, Y> LiveData<X>.switchMap(mapFunction: (X) -> LiveData<Y>) = Transformations.switchMap(this, mapFunction)

app/src/main/java/cz/muni/fi/rpg/ui/character/CharacterStatsFragment.kt

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import androidx.lifecycle.observe
99
import cz.muni.fi.rpg.R
1010
import cz.muni.fi.rpg.model.domain.character.CharacterId
1111
import cz.muni.fi.rpg.model.domain.character.Points
12+
import cz.muni.fi.rpg.model.map
1213
import cz.muni.fi.rpg.model.right
1314
import cz.muni.fi.rpg.ui.common.parcelableArgument
1415
import cz.muni.fi.rpg.ui.views.CharacterPoint
@@ -40,19 +41,10 @@ class CharacterStatsFragment : Fragment(R.layout.fragment_character_stats),
4041
}
4142

4243
private fun bindStats() {
43-
Transformations.map(viewModel.character.right()) { character -> character.getStats() }
44-
.observe(viewLifecycleOwner) { stats ->
45-
weaponSkill.value = stats.weaponSkill
46-
ballisticSkill.value = stats.ballisticSkill
47-
strength.value = stats.strength
48-
toughness.value = stats.toughness
49-
agility.value = stats.agility
50-
intelligence.value = stats.intelligence
51-
willPower.value = stats.willPower
52-
fellowship.value = stats.fellowship
53-
initiative.value = stats.initiative
54-
dexterity.value = stats.dexterity
55-
}
44+
viewModel.character
45+
.right()
46+
.map { character -> character.getCharacteristics() }
47+
.observe(viewLifecycleOwner) { statsTable.setValue(it) }
5648
}
5749

5850
private fun bindPoints() {

app/src/main/java/cz/muni/fi/rpg/ui/character/edit/CharacterEditFragment.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class CharacterEditFragment(
106106

107107
private suspend fun updateCharacter(
108108
info: CharacterInfoFormFragment.Data,
109-
statsData: CharacterStatsFormFragment.Data,
109+
statsData: CharacterStatsFormFragment.CharacteristicsData,
110110
maxWounds: Int,
111111
hardyTalent: Boolean
112112
) {
@@ -117,8 +117,8 @@ class CharacterEditFragment(
117117
career = info.career,
118118
socialClass = info.socialClass,
119119
race = info.race,
120-
stats = statsData.stats,
121-
maxStats = statsData.maxStats,
120+
characteristicsBase = statsData.base,
121+
characteristicsAdvances = statsData.advances,
122122
maxWounds = maxWounds,
123123
psychology = info.psychology,
124124
motivation = info.motivation,

app/src/main/java/cz/muni/fi/rpg/ui/character/skills/CharacterSkillsFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class CharacterSkillsFragment : Fragment(R.layout.fragment_character_skills),
5353
CombinedLiveData(viewModel.skills, characterVm.character.right())
5454
.observe(viewLifecycleOwner) { pair ->
5555
val skills = pair.first
56-
val stats = pair.second.getStats()
56+
val stats = pair.second.getCharacteristics()
5757

5858
adapter.submitList(
5959
skills

app/src/main/java/cz/muni/fi/rpg/ui/characterCreation/CharacterCreationFragment.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class CharacterCreationFragment(
4646
private var currentFragmentIndex = 0
4747

4848
private var characterInfo: CharacterInfoFormFragment.Data? = null
49-
private var characterStatsData: CharacterStatsFormFragment.Data? = null
49+
private var characterStatsData: CharacterStatsFormFragment.CharacteristicsData? = null
5050

5151
override fun onStart() {
5252
super.onStart()
@@ -139,7 +139,7 @@ class CharacterCreationFragment(
139139

140140
private fun saveCharacter(
141141
info: CharacterInfoFormFragment.Data,
142-
statsData: CharacterStatsFormFragment.Data,
142+
statsData: CharacterStatsFormFragment.CharacteristicsData,
143143
points: Points
144144
) {
145145
launch {
@@ -153,8 +153,8 @@ class CharacterCreationFragment(
153153
career = info.career,
154154
socialClass = info.socialClass,
155155
race = info.race,
156-
stats = statsData.stats,
157-
maxStats = statsData.maxStats,
156+
characteristicsBase = statsData.base,
157+
characteristicsAdvances = statsData.advances,
158158
points = points,
159159
psychology = info.psychology,
160160
motivation = info.motivation,

app/src/main/java/cz/muni/fi/rpg/ui/characterCreation/CharacterStatsFormFragment.kt

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import cz.muni.fi.rpg.ui.common.forms.Form
99
import kotlinx.android.synthetic.main.fragment_character_stats_form.*
1010

1111
class CharacterStatsFormFragment :
12-
CharacterFormStep<CharacterStatsFormFragment.Data>(R.layout.fragment_character_stats_form) {
12+
CharacterFormStep<CharacterStatsFormFragment.CharacteristicsData>(R.layout.fragment_character_stats_form) {
1313

14-
data class Data(
15-
val stats: Stats,
16-
val maxStats: Stats
14+
data class CharacteristicsData(
15+
val base: Stats,
16+
val advances: Stats
1717
)
1818

1919
var character: Character? = null
@@ -53,24 +53,19 @@ class CharacterStatsFormFragment :
5353
setShowErrorInEditText()
5454
addLiveRule(R.string.error_required) { !it.isNullOrBlank() }
5555
addLiveRule(R.string.error_value_over_100) { it.toString().toInt() <= 100 }
56-
addLiveRule(R.string.error_value_over_max) {
57-
val maxValue = entry.value.getValue().toIntOrNull()
58-
59-
maxValue == null || it.toString().toInt() <= maxValue
60-
}
6156
}
6257
}
6358

6459
setDefaultValues()
6560
}
6661

67-
override fun submit(): Data? {
62+
override fun submit(): CharacteristicsData? {
6863
if (!form.validate()) {
6964
return null
7065
}
7166

72-
return Data(
73-
stats = Stats(
67+
return CharacteristicsData(
68+
base = Stats(
7469
agility = agilityInput.getValue().toInt(),
7570
ballisticSkill = ballisticSkillInput.getValue().toInt(),
7671
dexterity = dexterityInput.getValue().toInt(),
@@ -82,7 +77,7 @@ class CharacterStatsFormFragment :
8277
weaponSkill = weaponSkillInput.getValue().toInt(),
8378
willPower = willPowerInput.getValue().toInt()
8479
),
85-
maxStats = Stats(
80+
advances = Stats(
8681
agility = maxAgilityInput.getValue().toInt(),
8782
ballisticSkill = maxBallisticSkillInput.getValue().toInt(),
8883
dexterity = maxDexterityInput.getValue().toInt(),
@@ -122,8 +117,8 @@ class CharacterStatsFormFragment :
122117
val currentInput = entry.key.first
123118
val maxInput = entry.key.second
124119

125-
currentInput.setDefaultValue(entry.value(character.getStats()).toString(), force = true)
126-
maxInput.setDefaultValue(entry.value(character.getMaxStats()).toString(), force = true)
120+
currentInput.setDefaultValue(entry.value(character.getCharacteristicsBase()).toString(), force = true)
121+
maxInput.setDefaultValue(entry.value(character.getCharacteristicsAdvances()).toString(), force = true)
127122
}
128123
}
129124
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package cz.muni.fi.rpg.ui.views
2+
3+
import android.content.Context
4+
import android.util.AttributeSet
5+
import androidx.constraintlayout.widget.ConstraintLayout
6+
import cz.muni.fi.rpg.R
7+
import cz.muni.fi.rpg.model.domain.character.Stats
8+
import kotlinx.android.synthetic.main.view_stats_table.view.*
9+
10+
class StatsTable : ConstraintLayout {
11+
constructor(context: Context) : super(context)
12+
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
13+
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int)
14+
: super(context, attrs, defStyleAttr)
15+
16+
init {
17+
inflate(context, R.layout.view_stats_table, this)
18+
}
19+
20+
fun setValue(stats: Stats) {
21+
weaponSkill.value = stats.weaponSkill
22+
ballisticSkill.value = stats.ballisticSkill
23+
strength.value = stats.strength
24+
toughness.value = stats.toughness
25+
agility.value = stats.agility
26+
intelligence.value = stats.intelligence
27+
willPower.value = stats.willPower
28+
fellowship.value = stats.fellowship
29+
initiative.value = stats.initiative
30+
dexterity.value = stats.dexterity
31+
}
32+
}

0 commit comments

Comments
 (0)