Skip to content

Commit 6971d81

Browse files
committed
can now activate multiple challenges.
1 parent f271508 commit 6971d81

File tree

24 files changed

+157
-92
lines changed

24 files changed

+157
-92
lines changed

core/src/main/assets/miscs/items.png

454 Bytes
Loading

core/src/main/java/com/egoal/darkestpixeldungeon/Badges.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -961,9 +961,11 @@ object Badges {
961961

962962
fun validateChampion() {
963963
// if (Dungeon.IsChallenged()) return
964-
if (Dungeon.hero.challenge != null) {
965-
if (Dungeon.hero.challenge != Challenge.LowPressure) displayBadge(Badge.CHAMPION)
966-
Challenge.PassChallenge(Dungeon.hero.challenge!!)
964+
with(Dungeon.hero.challenges) {
965+
if (isNotEmpty()) {
966+
if (!contains(Challenge.LowPressure)) displayBadge(Badge.CHAMPION)
967+
forEach { Challenge.PassChallenge(it) }
968+
}
967969
}
968970
}
969971

core/src/main/java/com/egoal/darkestpixeldungeon/Challenge.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,5 +127,16 @@ enum class Challenge {
127127
} catch (e: IOException) {
128128
}
129129
}
130+
131+
private val incompatibles = listOf(Pair(Gifted, CastingMaster), Pair(Faith, Immortality))
132+
133+
private fun CheckCompatible(ch1: Challenge, ch2: Challenge): Boolean {
134+
if (ch1 == LowPressure || ch1 == PathOfAsceticism) return false
135+
if (incompatibles.any { it.first == ch1 && it.second == ch2 }) return false
136+
return true
137+
}
138+
139+
fun IsCompatible(ch1: Challenge, ch2: Challenge): Boolean =
140+
CheckCompatible(ch1, ch2) && CheckCompatible(ch2, ch1)
130141
}
131142
}

core/src/main/java/com/egoal/darkestpixeldungeon/Dungeon.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ object Dungeon {
244244
hero.live()
245245
}
246246

247-
fun IsChallenged(): Boolean = ::hero.isInitialized && hero.challenge != null
247+
fun IsChallenged(): Boolean = ::hero.isInitialized && hero.challenges.isNotEmpty()
248248

249249
fun newLevel(): Level {
250250
nullLevel()
@@ -448,7 +448,7 @@ object Dungeon {
448448
depth = this@Dungeon.depth
449449
level = hero.lvl
450450
armorTier = hero.tier()
451-
challenge = hero.challenge
451+
challenges = hero.challenges.toList()
452452
}
453453

454454
} else if (WndResurrect.instance != null) {

core/src/main/java/com/egoal/darkestpixeldungeon/GamesInProgress.kt

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,8 @@ package com.egoal.darkestpixeldungeon
2323
import com.egoal.darkestpixeldungeon.actors.hero.HeroClass
2424
import com.egoal.darkestpixeldungeon.actors.hero.HeroSubClass
2525
import com.watabou.noosa.Game
26-
2726
import java.io.IOException
28-
import java.util.HashMap
27+
import java.util.*
2928

3029
object GamesInProgress {
3130
private const val MAX_SLOT = 6 // enough to compatible with pre 0.6.0 saves
@@ -123,13 +122,13 @@ object GamesInProgress {
123122
}
124123
}
125124

126-
fun set(cl: HeroClass, depth: Int, level: Int, challenge: Challenge?) {
127-
val info = Info()
128-
info.depth = depth
129-
info.level = level
130-
info.challenge = challenge
131-
state[cl] = info
132-
}
125+
// fun set(cl: HeroClass, depth: Int, level: Int, challenge: Challenge?) {
126+
// val info = Info()
127+
// info.depth = depth
128+
// info.level = level
129+
// info.challenge = challenge
130+
// state[cl] = info
131+
// }
133132

134133
fun setUnknown(cl: HeroClass) {
135134
state.remove(cl)
@@ -149,8 +148,8 @@ object GamesInProgress {
149148
var level = 0
150149
var armorTier = 0
151150

152-
var challenge: Challenge? = null
151+
var challenges: List<Challenge> = listOf()
153152

154-
val isChallenged: Boolean get() = challenge != null
153+
val isChallenged: Boolean get() = challenges.isNotEmpty()
155154
}
156155
}

core/src/main/java/com/egoal/darkestpixeldungeon/actors/buffs/Pressure.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import com.egoal.darkestpixeldungeon.actors.hero.HeroLines
99
import com.egoal.darkestpixeldungeon.actors.hero.perks.Optimistic
1010
import com.egoal.darkestpixeldungeon.actors.hero.perks.PressureIsPower
1111
import com.egoal.darkestpixeldungeon.items.artifacts.GoddessRadiance
12-
import com.egoal.darkestpixeldungeon.items.artifacts.ThornsOfPain
1312
import com.egoal.darkestpixeldungeon.items.helmets.Mantilla
1413
import com.egoal.darkestpixeldungeon.messages.M
1514
import com.egoal.darkestpixeldungeon.messages.Messages
@@ -80,7 +79,7 @@ class Pressure : Buff(), Hero.Doom {
8079
val p1 = hero.heroPerk.get(Optimistic::class.java)?.resistChance() ?: 0f
8180
val p2 = hero.buff(GoddessRadiance.Recharge::class.java)?.evadeRatio() ?: 0f
8281
val p3 = if (hero.belongings.helmet is Mantilla && !hero.belongings.helmet!!.cursed) 0.1f else 0f
83-
val p4 = if (hero.challenge== Challenge.PathOfAsceticism) .1f else 0f
82+
val p4 = if (hero.challenges.contains(Challenge.PathOfAsceticism)) .1f else 0f
8483

8584
return GameMath.ProbabilityPlus(p1, p2, p3, p4)
8685
}
@@ -136,7 +135,7 @@ class Pressure : Buff(), Hero.Doom {
136135
}
137136

138137
private fun procValue(): Float {
139-
if (Dungeon.hero.challenge == Challenge.LowPressure) return 0f
138+
if (Dungeon.hero.challenges.contains(Challenge.LowPressure)) return 0f
140139

141140
var value = if (Dungeon.level.locked) 2f else 1f
142141
value += Random.Float(Dungeon.depth / 5f)

core/src/main/java/com/egoal/darkestpixeldungeon/actors/hero/Hero.kt

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ class Hero : Char() {
122122
val belongings = Belongings(this)
123123

124124
lateinit var pressure: Pressure
125-
var challenge: Challenge? = null
125+
val challenges: HashSet<Challenge> = hashSetOf()
126126

127127
fun STR(): Int {
128128
var str = this.STR + if (weakened) -2 else 0
@@ -183,7 +183,7 @@ class Hero : Char() {
183183
?: 1) > 1 && belongings.weapon !is Whip
184184

185185
fun regenerateSpeed(): Float {
186-
if (challenge == Challenge.Immortality) return 0f
186+
if (challenges.contains(Challenge.Immortality)) return 0f
187187

188188
val hlvl = buff(Hunger::class.java)!!.hunger()
189189
if (hlvl >= Hunger.STARVING) return 0f
@@ -331,7 +331,7 @@ class Hero : Char() {
331331
pressure = Buff.affect(this, Pressure::class.java)
332332
if (buff(SkillTree.Updater::class.java) == null)
333333
SkillTree.Updater().attachTo(this)
334-
challenge?.live(this)
334+
challenges.forEach { it.live(this) }
335335
}
336336

337337
fun tier(): Int = belongings.armor?.tier ?: 0
@@ -1002,14 +1002,14 @@ class Hero : Char() {
10021002
heroClass.upgradeHero(this)
10031003

10041004
// perk
1005-
if (challenge == Challenge.Gifted) {
1005+
if (challenges.contains(Challenge.Gifted)) {
10061006
// 2, 4, 6, 8, 10...
10071007
if (lvl % 2 == 0) {
10081008
val perk = Perk.RandomPositive(this)
10091009
heroPerk.add(perk)
10101010
PerkGain.Show(this, perk)
10111011
}
1012-
} else if(challenge== Challenge.PathOfAsceticism){
1012+
} else if (challenges.contains(Challenge.PathOfAsceticism)) {
10131013
// do nothing
10141014
} else {
10151015
//2, 6, 10... gain a perk
@@ -1419,8 +1419,14 @@ class Hero : Char() {
14191419
val armor = bundle.get("armor") as Armor?
14201420
info.armorTier = armor?.tier ?: 0
14211421

1422-
val chastr = bundle.getString(CHALLENGE)
1423-
if (chastr.isNotEmpty()) info.challenge = Challenge.valueOf(chastr)
1422+
val a = bundle.getStringArray(CHALLENGES)
1423+
if (a != null) {
1424+
info.challenges = a.map { Challenge.valueOf(it) }.toList()
1425+
} else {
1426+
// old savers
1427+
val chastr = bundle.getString(CHALLENGE)
1428+
if (chastr.isNotEmpty()) info.challenges = listOf(Challenge.valueOf(chastr))
1429+
}
14241430
}
14251431

14261432
fun ReallyDie(src: Any?) {
@@ -1476,6 +1482,7 @@ class Hero : Char() {
14761482
private const val MAGICAL_RESISTANCE = "magical_resistance"
14771483
private const val RESERVED_PERKS = "reserved_perks"
14781484
private const val CHALLENGE = "challenge"
1485+
private const val CHALLENGES = "challenges"
14791486
private const val PERK_GAIN = "perk_gain"
14801487
private const val SPAWNED_PERKS = "spawned-perks"
14811488
private const val USER_NAME = "username"
@@ -1514,7 +1521,7 @@ class Hero : Char() {
15141521

15151522
bundle.put(ARCANE_FACTOR, arcaneFactor)
15161523

1517-
if (challenge != null) bundle.put(CHALLENGE, challenge.toString())
1524+
bundle.put(CHALLENGES, challenges.map { it.toString() }.toTypedArray())
15181525

15191526
belongings.storeInBundle(bundle)
15201527
}
@@ -1557,8 +1564,14 @@ class Hero : Char() {
15571564
val pre = buff(Pressure::class.java)
15581565
if (pre != null) pressure = pre
15591566

1560-
val chastr = bundle.getString(CHALLENGE)
1561-
if (chastr.isNotEmpty()) challenge = Challenge.valueOf(chastr)
1567+
val a = bundle.getStringArray(CHALLENGES)
1568+
if (a != null) {
1569+
a.forEach { challenges.add(Challenge.valueOf(it)) }
1570+
} else {
1571+
// old savers
1572+
val chastr = bundle.getString(CHALLENGE)
1573+
if (chastr.isNotEmpty()) challenges.add(Challenge.valueOf(chastr))
1574+
}
15621575

15631576
}
15641577
}

core/src/main/java/com/egoal/darkestpixeldungeon/actors/hero/HeroClass.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,11 +349,11 @@ enum class HeroClass(private val title: String, vararg subclasses: HeroSubClass)
349349

350350
onHeroUpgraded(hero)
351351

352-
if (hero.challenge == Challenge.Faith || hero.challenge == Challenge.Immortality) {
352+
if (hero.challenges.contains(Challenge.Faith) || hero.challenges.contains(Challenge.Immortality)) {
353353
hero.HP = hp
354354
hero.HT = ht
355355
}
356-
if (hero.challenge == Challenge.Faith)
356+
if (hero.challenges.contains(Challenge.Faith))
357357
Ankh().apply { isBlessed = true }.collect()
358358
}
359359

core/src/main/java/com/egoal/darkestpixeldungeon/actors/mobs/DM300.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ class DM300 : Mob() {
241241

242242
resetBumpCell();
243243
Dungeon.level.drop(SkeletonKey(Dungeon.depth), pos).sprite.drop()
244-
if (Dungeon.hero.challenge != Challenge.PathOfAsceticism)
244+
if (!Dungeon.hero.challenges.contains(Challenge.PathOfAsceticism))
245245
Dungeon.level.drop(TomeOfRetrain(), pos).sprite.drop()
246246

247247
Badges.validateBossSlain()

core/src/main/java/com/egoal/darkestpixeldungeon/actors/mobs/King.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ class King : Mob() {
142142
}
143143

144144
val prizes = arrayListOf(SkeletonKey(Dungeon.depth), ArmorKit(), CrownOfDwarf())
145-
if (Dungeon.hero.challenge != Challenge.PathOfAsceticism) prizes.add(TomeOfUpgrade())
145+
if (!Dungeon.hero.challenges.contains(Challenge.PathOfAsceticism)) prizes.add(TomeOfUpgrade())
146146
for (item in prizes) {
147147
val cell = if (avals.isEmpty()) pos else avals.random()
148148
Dungeon.level.drop(item, cell).sprite.drop(pos)

core/src/main/java/com/egoal/darkestpixeldungeon/actors/mobs/Mob.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,9 @@ abstract class Mob : Char() {
127127

128128
// chance to lift as an elite
129129
var chance = .1f + (max(0, Dungeon.depth - 5) / 10) * .05f // 10%, 15%, 15%, 20%, 20%
130-
if (Dungeon.hero.challenge == Challenge.PathOfAsceticism) chance += .05f
130+
if (Dungeon.hero.challenges.contains(Challenge.PathOfAsceticism)) chance += .05f
131131

132-
if (Dungeon.hero.challenge == Challenge.Outrage || Random.Float() < chance) {
132+
if (Dungeon.hero.challenges.contains(Challenge.Outrage) || Random.Float() < chance) {
133133
val cnt = Random.chances(floatArrayOf(.6f, .3f, .1f)) + 1
134134

135135
abilities.addAll(randomAbilities(cnt))

core/src/main/java/com/egoal/darkestpixeldungeon/actors/mobs/Tengu.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ class Tengu : Mob() {
154154
}
155155

156156
val prizes = arrayListOf(SkeletonKey(Dungeon.depth), MoonStone())
157-
if (Dungeon.hero.challenge != Challenge.PathOfAsceticism) prizes.add(TomeOfPerk())
157+
if (!Dungeon.hero.challenges.contains(Challenge.PathOfAsceticism)) prizes.add(TomeOfPerk())
158158
for (item in prizes) {
159159
val cell = if (avals.isEmpty()) pos else avals.random()
160160
Dungeon.level.drop(item, cell).sprite.drop(pos)

core/src/main/java/com/egoal/darkestpixeldungeon/actors/mobs/npcs/Monument.kt

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import com.egoal.darkestpixeldungeon.scenes.GameScene
88
import com.egoal.darkestpixeldungeon.sprites.CharSprite
99
import com.egoal.darkestpixeldungeon.sprites.MobSprite
1010
import com.egoal.darkestpixeldungeon.utils.GLog
11-
import com.egoal.darkestpixeldungeon.windows.WndDialogue
1211
import com.egoal.darkestpixeldungeon.windows.WndSelectChallenge
1312
import com.watabou.noosa.TextureFilm
1413
import com.watabou.utils.Bundle
@@ -26,16 +25,20 @@ class Monument : NPC.Unbreakable() {
2625
override fun interact(): Boolean {
2726
if (!activated && Dungeon.hero.lvl == 1) //todo: rework this
2827
GameScene.show(object : WndSelectChallenge() {
29-
override fun onChallengeWouldActivate(challenge: Challenge) {
30-
val hero = Dungeon.hero
31-
if (hero.challenge != null) return
32-
33-
activated = true
34-
(sprite as Sprite).activate()
35-
challenge.affect(hero)
36-
hero.challenge = challenge
28+
override fun activeChallenges(challenges: List<Challenge>) {
29+
if (challenges.isNotEmpty()) {
30+
val hero = Dungeon.hero
31+
challenges.forEach {
32+
it.affect(hero)
33+
hero.challenges.add(it)
34+
}
35+
36+
activated = true
37+
(sprite as Sprite).activate()
38+
GLog.n(M.L(Monument::class.java, "activated"))
39+
}
40+
3741
hide()
38-
GLog.n(M.L(Monument::class.java, "activated", challenge.title()))
3942
}
4043
})
4144

core/src/main/java/com/egoal/darkestpixeldungeon/items/potions/Potion.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ open class Potion : Item() {
181181
}
182182

183183
override fun doPickUp(hero: Hero): Boolean {
184-
if (hero.challenge == Challenge.PathOfAsceticism) {
184+
if (hero.challenges.contains(Challenge.PathOfAsceticism)) {
185185
GLog.n(M.L(Challenge::class.java, "gone", name()))
186186
hero.next()
187187
return true

core/src/main/java/com/egoal/darkestpixeldungeon/items/scrolls/Scroll.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ abstract class Scroll : Item() {
102102
}
103103

104104
override fun doPickUp(hero: Hero): Boolean {
105-
if (hero.challenge == Challenge.PathOfAsceticism) {
105+
if (hero.challenges.contains(Challenge.PathOfAsceticism)) {
106106
GLog.n(M.L(Challenge::class.java, "gone", name()))
107107
hero.next()
108108
return true

core/src/main/java/com/egoal/darkestpixeldungeon/items/scrolls/ScrollOfUpgrade.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,16 @@ import com.egoal.darkestpixeldungeon.Dungeon
2626
import com.egoal.darkestpixeldungeon.actors.hero.Hero
2727
import com.egoal.darkestpixeldungeon.effects.Speck
2828
import com.egoal.darkestpixeldungeon.effects.particles.ShadowParticle
29+
import com.egoal.darkestpixeldungeon.items.Item
2930
import com.egoal.darkestpixeldungeon.items.armor.Armor
3031
import com.egoal.darkestpixeldungeon.items.rings.Ring
3132
import com.egoal.darkestpixeldungeon.items.wands.Wand
3233
import com.egoal.darkestpixeldungeon.items.weapon.Weapon
34+
import com.egoal.darkestpixeldungeon.messages.M
3335
import com.egoal.darkestpixeldungeon.messages.Messages
36+
import com.egoal.darkestpixeldungeon.scenes.GameScene
3437
import com.egoal.darkestpixeldungeon.utils.GLog
3538
import com.egoal.darkestpixeldungeon.windows.WndBag
36-
import com.egoal.darkestpixeldungeon.items.Item
37-
import com.egoal.darkestpixeldungeon.messages.M
38-
import com.egoal.darkestpixeldungeon.scenes.GameScene
3939
import com.watabou.utils.Random
4040

4141
class ScrollOfUpgrade : InventoryScroll() {
@@ -55,7 +55,8 @@ class ScrollOfUpgrade : InventoryScroll() {
5555
identifiedByUse = false
5656
}
5757

58-
if (Item.curUser.challenge == Challenge.Gifted || Item.curUser.challenge == Challenge.CastingMaster)
58+
if (Item.curUser.challenges.contains(Challenge.Gifted) ||
59+
Item.curUser.challenges.contains(Challenge.CastingMaster))
5960
GLog.n(M.L(Challenge::class.java, "gone", name()))
6061
else
6162
GameScene.selectItem(itemSelector, mode, inventoryTitle)

core/src/main/java/com/egoal/darkestpixeldungeon/items/unclassified/Gold.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class Gold(value: Int = 1, private val pure: Boolean = false) : Item() {
3535

3636
override fun actions(hero: Hero): ArrayList<String> {
3737
val actions = ArrayList<String>()
38-
if (hero.challenge == Challenge.CastingMaster) actions.add(AC_CAST)
38+
if (hero.challenges.contains(Challenge.CastingMaster)) actions.add(AC_CAST)
3939
return actions
4040
}
4141

@@ -46,7 +46,7 @@ class Gold(value: Int = 1, private val pure: Boolean = false) : Item() {
4646
}
4747

4848
override fun doPickUp(hero: Hero): Boolean {
49-
if (!pure && hero.challenge == Challenge.GreedIsGood) {
49+
if (!pure && hero.challenges.contains(Challenge.GreedIsGood)) {
5050
GLog.n(M.L(Challenge::class.java, "gone", name()))
5151
hero.next()
5252
return true

core/src/main/java/com/egoal/darkestpixeldungeon/levels/LastShopLevel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class LastShopLevel : RegularLevel() {
4040
val diggers = ArrayList<Digger>()
4141

4242
for (i in 1..4) diggers.add(Random.chances(normalDiggers).newInstance())
43-
if (Dungeon.hero.challenge != Challenge.CastingMaster && Imp.Quest.isCompleted)
43+
if (!Dungeon.hero.challenges.contains(Challenge.CastingMaster) && Imp.Quest.isCompleted)
4444
diggers.add(MerchantDigger())
4545

4646
return diggers

core/src/main/java/com/egoal/darkestpixeldungeon/levels/RegularLevel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ abstract class RegularLevel : Level() {
8484
protected var chosenDiggers = ArrayList<Digger>()
8585
protected open fun chooseDiggers(): ArrayList<Digger> {
8686
val diggers = selectDiggers(Random.NormalIntRange(1, 4), Random.IntRange(12, 15))
87-
if (Dungeon.shopOnLevel() && Dungeon.hero.challenge != Challenge.CastingMaster) diggers.add(MerchantDigger())
87+
if (Dungeon.shopOnLevel() && !Dungeon.hero.challenges.contains(Challenge.CastingMaster)) diggers.add(MerchantDigger())
8888

8989
return diggers
9090
}
@@ -230,7 +230,7 @@ abstract class RegularLevel : Level() {
230230
}
231231

232232
override fun createMobs() {
233-
if (Dungeon.hero.challenge != Challenge.CastingMaster)
233+
if (!Dungeon.hero.challenges.contains(Challenge.CastingMaster))
234234
createSellers()
235235

236236
val trySpawn = { space: Space ->

0 commit comments

Comments
 (0)