Improved accuracy of barrows rewards

This commit is contained in:
Player Name
2023-11-05 08:20:10 +00:00
committed by Ryan
parent 04882136f8
commit a04c36f5cd
@@ -21,17 +21,15 @@ import core.api.utils.WeightedItem
*/ */
object RewardChest { object RewardChest {
private val REGULAR_DROPS = WeightBasedTable.create( private val REGULAR_DROPS = WeightBasedTable.create(
WeightedItem(Items.COINS_995, 1, 5306, 950.0), WeightedItem(Items.COINS_995, 1, 777, 380.0),
WeightedItem(Items.MIND_RUNE_558, 60, 60, 300.0), WeightedItem(Items.MIND_RUNE_558, 250, 350, 125.0),
WeightedItem(Items.MIND_RUNE_558, 100, 850, 300.0), WeightedItem(Items.CHAOS_RUNE_562, 115, 135, 125.0),
WeightedItem(Items.CHAOS_RUNE_562, 115, 720, 300.0), WeightedItem(Items.DEATH_RUNE_560, 70, 85, 125.0),
WeightedItem(Items.DEATH_RUNE_560, 15, 15, 300.0), WeightedItem(Items.BLOOD_RUNE_565, 35, 45, 125.0),
WeightedItem(Items.DEATH_RUNE_560, 70, 230, 300.0), WeightedItem(Items.BOLT_RACK_4740, 35, 40, 125.0),
WeightedItem(Items.BLOOD_RUNE_565, 35, 230, 300.0), WeightedItem(Items.TOOTH_HALF_OF_A_KEY_985, 1, 1, 3.0),
WeightedItem(Items.BOLT_RACK_4740, 35, 280, 300.0), WeightedItem(Items.LOOP_HALF_OF_A_KEY_987, 1, 1, 3.0),
WeightedItem(Items.TOOTH_HALF_OF_A_KEY_985, 1, 1, 25.0), WeightedItem(Items.DRAGON_MED_HELM_1149, 1, 1, 1.0)
WeightedItem(Items.LOOP_HALF_OF_A_KEY_987, 1, 1, 25.0),
WeightedItem(Items.DRAGON_MED_HELM_1149, 1, 1, 3.0)
) )
private val AHRIM = arrayOf(4708, 4710, 4712, 4714) private val AHRIM = arrayOf(4708, 4710, 4712, 4714)
private val DHAROK = arrayOf(4716, 4718, 4720, 4722) private val DHAROK = arrayOf(4716, 4718, 4720, 4722)
@@ -48,51 +46,33 @@ object RewardChest {
*/ */
@JvmStatic @JvmStatic
fun reward(player: Player) { fun reward(player: Player) {
var rewards: MutableList<Item> = ArrayList()
// Roll barrows rewards
var barrowsRewardsIDs: MutableList<Int> = ArrayList() var barrowsRewardsIDs: MutableList<Int> = ArrayList()
for (i in 0..5) { for (i in 0..5) {
if (player.savedData.activityData.barrowBrothers[i]) { if (player.savedData.activityData.barrowBrothers[i]) {
barrowsRewardsIDs.addAll(BARROWS_DROP_IDS[i]) barrowsRewardsIDs.addAll(BARROWS_DROP_IDS[i])
} }
} }
val nKilledBrothers = barrowsRewardsIDs.size / 4 barrowsRewardsIDs.shuffle()
val maxRolls = 1 + maxOf(0, RandomFunction.random(nKilledBrothers - 3, nKilledBrothers))
var nBarrowsRewards = 0
val barrowsItemChance = 5 * barrowsRewardsIDs.size
for (i in 0 until maxRolls) {
if (RandomFunction.random(3223) <= barrowsItemChance) {
nBarrowsRewards++
}
}
if (nBarrowsRewards > barrowsRewardsIDs.size) {
nBarrowsRewards = barrowsRewardsIDs.size
}
// Award all non-barrows rewards (using the remaining rolls) var rewards: MutableList<Item> = ArrayList()
val remainingRolls = maxRolls - nBarrowsRewards val nKilled = barrowsRewardsIDs.size / 4
if (remainingRolls > 0) { roll@for (i in 0 until nKilled+1) {
val nonBarrowsRewards = REGULAR_DROPS.roll(null, remainingRolls) if (barrowsRewardsIDs.size > 0 && RandomFunction.roll(450 - 58 * nKilled)) {
addItem@for (i in 0 until nonBarrowsRewards.size) { // Award a random item from a random brother
if (i > 0) { val reward = barrowsRewardsIDs[0]
// If we have already awarded this item, just combine their amounts rewards.add(Item(reward, 1))
for (j in 0 until rewards.size) { barrowsRewardsIDs.removeAt(0)
if (nonBarrowsRewards[i].id == rewards[j].id) { } else {
rewards[j].amount += nonBarrowsRewards[i].amount // Award a drop from the regular drop table
continue@addItem val drop = REGULAR_DROPS.roll(null, 1)[0]
} for (i in 0 until rewards.size) {
// If we have already awarded this item, just add to the previous quantity
if (rewards[i].id == drop.id) {
rewards[i].amount += drop.amount
continue@roll
} }
} }
rewards.add(nonBarrowsRewards[i]) rewards.add(drop)
}
}
// Award a random selection of barrows rewards, if rolled
if (nBarrowsRewards > 0) {
barrowsRewardsIDs.shuffle()
for (i in 0 until nBarrowsRewards) {
rewards.add(Item(barrowsRewardsIDs[i], 1))
} }
} }