1 of 36

背包乱斗代码解析

其一:打折与刷新

2 of 36

目录

  • 流程图
  • 打折机制概括
  • 打折机制代码对照
  • 打折机制实例讲解
  • 刷新机制概括
    • 独特物品
    • 稀有度桶
    • 门限物品
    • 锻造锤
    • 权重
  • 未来研究

3 of 36

流程图

  • [阶段 0] 准备与初始化
    • 计算 稀有度桶(会员卡)
    • 计算 Unique道具信号,占据1个或多个槽位
  • [阶段 1] 库存统计与门控道具注册
    • 计算 门控道具信号,如成功占据一个槽位
  • [阶段 2] 分配门控道具槽位
  • [阶段 3] Forging Hammer 概率与槽位分配
  • [阶段 4] 逐槽位抽取物品
  • [阶段 5]价格计算与打折判定

4 of 36

打折机制概括

  • 基础概率:SALE_CHANCE = 0.1(10%)
  • 道具调整:

  • 最终概率:基础概率+Σ(道具调整)——线性叠加

道具

每实例加成

条件/作用对象

回合限制

是否叠加

代码参照

Buy the Holy Light

20%

Holy 或 Lamp(Oil/Djinn)物品

是(按实例相加)

BuytheHolyLight.gd

Book of Basics

10%

物品为 Book 或 Spell

是(按实例相加)

BookofBasics.gd

Extra Bags

40%

物品为 Bag

是(按实例相加)

ExtraBags.gd

Vineweave Basket

20%

任意物品

Round 1 与 10

是(按实例相加;仅当轮次命中)

VineweaveBasket.gd

Lucky Cat

3%

任意物品

是(按实例相加)

LuckyCat.gd

Mega Clover

5%

任意物品

是(按实例相加)

MegaClover.gd

5 of 36

打折机制概括

  • 全局累加器:
    • 槽位以任何原因发生打折→set 0�槽位未发生打折→累加器+=最终概率
    • 累加器>1.3→当前槽位强制打折
  • 特殊情况:
    • 【只有属性】和【更多属性】两个徽章自带0.2倍打折概率系数(更难打折)
    • 第一回合第一页是全局特殊处理
      • 至少2个打折,剩余的格子继续按照打折机制判定
      • 如果前四个都不是武器,第五个强制更新为武器
      • 一定没有背包

6 of 36

打折机制代码对照

Shop.gd:常量、累计变量与首店固定打折槽位

# 文件:Core/Shop.gd 片段

const SALE_CHANCE = 0.1 # 全局基础打折概率(10%)

var saleAcc = 0.0 # 全局累加器,用于“失败后累计,超阈值强制折扣”

var bonusSaleChance: float # 本次判定的临时加成(由道具 onSaleRoll 注入)

func resetRerollCounter():

rerollsThisRun = 0

rollsThisRun = 0

saleAcc = 0.0 # 开跑或重置时,清零打折累计

uniqueAcc = 0.0

encounteredRoll.clear()

rerolledRoll.clear()

for item in ItemBook.getNumItems():

encounteredRoll.push_back(ItemBook.NOT_ENCOUNTERED)

rerolledRoll.push_back(ItemBook.NOT_ENCOUNTERED)

func openShop():

rolledUnique = null

itemsBoughtThisRound = 0

chooseOneShop = false

chooseOneLabel.hide()

shopSignLabel.show()

saleSlots.clear()

if isFirstShop(): # 首店:预选两个槽位固定打折

var indices = range(0, 5)

indices.shuffle()

saleSlots.push_back(indices[0])

saleSlots.push_back(indices[1])

Shop.gd:计算打折概率(含道具加成)

# 文件:Core/Shop.gd 片段

func getSaleChance(item = null):

var chance = SALE_CHANCE # 起始为基础概率 0.1

bonusSaleChance = 0 # 清空本次判定的临时加成

emit_signal("roll_sale", item) # 发出信号,允许道具对本次判定注入加成(如 Holy Light)

chance += bonusSaleChance # 累加由 onSaleRoll 添加的加成

if CustomRules.customRulesActive:

chance += CustomRules.getRuleValue(CustomRules.Rules.SalesChance) / 100.0 # 自定义规则的额外加成

return chance

7 of 36

打折机制代码对照

Shop.gd:进行打折判定与累计(核心逻辑)

# 文件:Core/Shop.gd 片段

func rollSale(slot) -> bool:

if not saleSlots.empty(): # 首店预选的打折槽位:命中直接返回 true

if slot.index in saleSlots:

saleSlots.erase(slot.index)

return true

var isSale = false

var saleChance = getSaleChance(slot.item) # 本次概率:基础 + 道具加成 + 自定义规则

if CustomRules.isRuleDefault(CustomRules.Rules.SalesChance):

saleChance *= slot.item.getSalesMultiplier() # 默认规则下再乘以物品的折扣乘数(大多数为 1.0)

if Util.flip(saleChance): # 随机判定(命中)

isSale = true

else:

saleAcc += saleChance # 未命中:把“本次实际概率”累加到全局 saleAcc(加成与乘数后的数值)

if saleAcc > 1.3: # 超过阈值:当前这一次强制标记折扣

isSale = true

if isSale:

saleAcc = 0.0 # 一旦出折扣(命中或强制),清零累计

return isSale

func addBonusSalesChance(chance):

bonusSaleChance += chance # 道具通过信号回调注入的加成,作用于“本次判定”

8 of 36

打折机制实例讲解

  • 情况1:0加成,运气最差
    • 第一刷,5个均不打折,累加器+=0.1*5
    • 第二刷,5个均不打折,累加器+=0.1*5
    • 第三刷,在判定第四个道具的时候能够触发,产生打折
  • 情况2:有神圣特卖,但运气很差
    • 第一刷,2个圣属性,3个普通属性,均不打折
    • 累加器+=(0.1+0.2)*2+0.1*3=0.9
    • 第二刷,前四个均不打折,累加器+=0.1*4=1.3,第五个触发累加器,产生打折
  • 情况3:有9本小红书,卷轴和书的打折概率达到100%
    • 所有书和卷轴均打折

9 of 36

刷新机制概括

  • 独特物品
    • 独特物品有持有上限,若达到上限则跳过该部分逻辑。
    • 基础概率= [0.3, 0.3, 0.3, 0.12],从第四回合起保持0.12不变。
    • 有追加概率的物品,概率总和可以大于1,此时有概率生成多个独特物品。
    • 判定失败,则把当前独特物品概率累计到累加器中
    • 当累加器>1.2时,强制占据一个独特物品槽位
    • 独特物品有独立的抽选池,独立抽选。

道具名

概率加成

容量加成

基础概率

30% (R1-3)�12% (R4+)

1

Mega Clover

+20%

-

Platin Customer Card

+30%

+1

Star of Courage

+5%

-

Uniquely Unique

+50%

+2

Fedora

+65%

+3

10 of 36

刷新机制概括——勘误

  • 独特物品
    • 独特物品有持有上限,若达到上限则跳过该部分逻辑。
    • 基础概率= [0.3, 0.3, 0.3, 0.12],从第四回合起保持0.12不变。
    • 有追加概率的物品,概率总和可以大于1,此时有概率生成多个独特物品。
    • 判定失败,则把当前独特物品概率累计到累加器中
    • 当累加器>1.2时,强制占据一个独特物品槽位
    • 独特物品有独立的抽选池,独立抽选。

  • 左侧内容仍然正确,但视频中口述的结论不对。
  • 独特物品加载仅在每回合进入商店时被触发。
  • 手动刷新不触发。
  • 技能回合,转职回合,购买技能或转职后的那一页商店,也会加载独特物品。

11 of 36

刷新机制概括

  • 稀有桶
  • 会员卡
    • 独立
    • 循环

回合

(Common)

(Rare)

(Epic)

(Legendary)

(Godly)

1

90%

10%

0%

0%

0%

2

84%

15%

1%

0%

0%

3

75%

20%

5%

0%

0%

4

64%

25%

10%

1%

0%

5

45%

35%

15%

5%

0%

6

29%

40%

20%

10%

1%

7

20%

35%

25%

15%

5%

8

20%

30%

25%

15%

10%

9

20%

28%

25%

15%

12%

10

20%

25%

25%

15%

15%

11

20%

23%

23%

17%

17%

12+

20%

20%

20%

20%

20%

12 of 36

刷新机制概括

  • 门限物品
    • 概率注册一个槽位
    • 各自的逻辑不同

门控道具

shop_chance

被门控道具数

门控机制类型

Puzzlebox

75%

5

硬编码稀有度映射

Chess Board

70%

12

稀有度映射 + 黑白平衡

Box of Riches

50%

25

权重系统(宝石池)

Deck of Cards

50%

8

硬编码稀有度映射

Bowl of Treats

30%

3

随机选择池

Wolf Emblem

25%

3

随机选择池

Dragon Nest

20%

3

随机选择池

Mr Struggles

20%

2

随机选择池

Shaman Mask

16%

4

随机选择池

Frozen Flame

15%

11

随机选择池 / 加权袋

Slime Time

10%

1

固定道具

13 of 36

刷新机制概括

  • Puzzlebox
    • 注册概率: 75%
    • 产出逻辑: 根据入参稀有度 rarity,直接映射到 5 个 Puzzlebag
    • 代码位置: Backpack Battles/Items/Exclusive/Puzzlebox.gd

稀有度(rarity)

产出道具

数组索引

0 (Common)

Puzzlebag L

puzzlebags[0]

1 (Uncommon)

Puzzlebag S

puzzlebags[1]

2 (Rare)

Puzzlebag Z

puzzlebags[2]

3 (Epic)

Puzzlebag T

puzzlebags[3]

4 (Godly)

Puzzlebag J

puzzlebags[4]

14 of 36

刷新机制概括

  • Box of Riches
    • 注册概率: 50%
    • 产出逻辑: 双概率系统
    • 25% 使用 rarityOdds
    • 75% 使用 gemOdds
    • 应用 highRolls 上调后抽取宝石
    • 代码位置: Backpack Battles/Items/BoxofRiches.gd

稀有度

gemOdds 权重

归一化概率

Common (0)

16

59.26%

Uncommon (1)

8

29.63%

Rare (2)

2

7.41%

Epic (3)

1

3.70%

Godly (4)

0.5

1.85%

总计

27

100%

15 of 36

刷新机制概括

  • Deck of Cards
    • 注册概率: 50%
    • 产出逻辑: 硬编码稀有度→卡牌映射,带条件概率分支(flip)
    • 代码位置: Backpack Battles/Items/DeckofCards.gd

稀有度

产出卡牌

条件概率

备注

Common (0)

The Lovers

-

固定

Uncommon (1)

The Tower

-

固定

Rare (2)

The Reverse  The Ace

50% / 50%

flip(0.5) 决定

Epic (3)

The Fool  The White-Eyes

30% / 70%

flip(0.3) 选 Fool

Godly (4)

The Joker  The Darkest Lotus

50% / 50%

flip(0.5) 决定

16 of 36

刷新机制概括

  • Chess Board
    • 注册概率: 70%
    • 产出逻辑: 黑白平衡机制 + 稀有度→棋子等级映射
    • 代码位置: Backpack Battles/Items/Exclusive/ChessBoard.gd

稀有度信号

棋子段位

棋子实际稀有度

0

Pawn(兵)

Common

1

Knight(骑士)

Rare

2

Bishop(主教)

Rare

3

Rook(车)

Epic

4

Queen(后)

Legendary

5(50%概率由4升级)

King(王)

Godly

17 of 36

刷新机制概括

  • Frozen Flame
    • 注册概率: 50%
    • 产出逻辑: 加权袋抽取(WeightedBag),包含 11 个冰系道具,权重 1-2
    • 代码位置: Backpack Battles/Items/Exclusive/FrozenFlame.gd

道具名

权重

归一化概率

Book of Ice

2

13.33%

Spell Scroll Frostbolt

2

13.33%

Frostbite

1

6.67%

Ice Armor

1

6.67%

Ice Bow

1

6.67%

Ice Ring

1

6.67%

Ice Staff

1

6.67%

Ice Sword

1

6.67%

Icicle

1

6.67%

Mead

1

6.67%

Snowflake

1

6.67%

总计

15

100%

18 of 36

刷新机制概括

  • Dragon Nest(龙巢)
    • 注册概率: 10%
    • 产出逻辑: 随机池抽取,3 种蛋等概率
    • 代码位置: Backpack Battles/Items/Exclusive/DragonNest.gd

道具名

概率

Emerald Egg

33.33%

Amethyst Egg

33.33%

Sapphire Egg

33.33%

19 of 36

刷新机制概括

  • Shaman Mask(萨满面具)
    • 注册概率: 30%
    • 产出逻辑: 随机池抽取,4 种符文等概率
    • 代码位置: Backpack Battles/Items/Exclusive/ShamanMask.gd

道具名

概率

Badger Rune

25%

Elephant Rune

25%

Hawk Rune

25%

Tiger Rune

25%

20 of 36

刷新机制概括

  • Slime Time(史莱姆时间)
    • 注册概率: 25%
    • 产出逻辑: 固定产出单一道具
    • 代码位置: Backpack Battles/Items/Exclusive/SlimeTime.gd

固定产出

概率

Goobling

100%

21 of 36

刷新机制概括

  • Wolf Emblem
    • 注册概率: 25%
    • 产出逻辑: 随机池抽取,3 种幼犬等概率
    • 代码位置: Backpack Battles/Items/Exclusive/WolfEmblem.gd

道具名

概率

Courage Puppy

33.33%

Wisdom Puppy

33.33%

Power Puppy

33.33%

22 of 36

刷新机制概括

  • Bowl of Treats(零食碗)
    • 注册概率: 30%
    • 产出逻辑: 稀有度重映射(Legendary+ 随机降级)+ 固定映射表
    • 代码位置: Backpack Battles/Items/Exclusive/BowlofTreats.gd
    • 本质上是33%平均,神秘的代码实现。

稀有度(重映射后)

产出道具

Common (0)

Rat

Rare (2)

Squirrel

Epic (3)

Hedgehog

23 of 36

刷新机制概括

  • Mr Struggles(挣扎先生)
    • 注册概率: 20%
    • 产出逻辑: 随机池抽取,2 种玩偶等概率
    • 代码位置: Backpack Battles/Items/MrStruggles.gd

道具名

概率

Mrs Struggles

50%

Miss Fortune

50%

24 of 36

刷新机制概括

  • Rainbow Potion
    • 注册概率: 35%
    • 产出逻辑: 从全局法杖描述符列表中随机抽取
    • 代码位置: Backpack Battles/Items/Exclusive/RainbowPotion.gd
    • 注意: 此方法无视 rarity 参数,从法杖池中等概率抽取。具体法杖列表由 ItemBook 初始化时填充(所有带 Tag.Staff 的道具)。

25 of 36

刷新机制概括

  • Forging Hammer
    • 为什么Forging Hammer还有单独的填充逻辑?

26 of 36

刷新机制概括

  • 加权逻辑
    • 阈值压制加权
    • 长久未见加权
    • 十字剑配方加权
    • 道具勾子加权
  • 过滤与唯一性约束
  • 9搜背包保底

27 of 36

刷新机制概括

  • 阈值压制加权
    • 定义:若已拥有数量n超过道具阈值T,则对权重施加分段系数。
  • 参数分布:
    • 471 个道具(79%):max_stack = 100(极高,压制几乎不触发)
    • 45 个道具(7%):max_stack = 1-8(很低,容易压制)

28 of 36

刷新机制概括

T

道具名

T

道具名

8

Stone

3

Flute

6

Healing Herbs

3

Heart Container

6

Pocket Sand

3

Jynx torquilla

5

Blood Amulet

3

Leather Boots

5

Demonic Flask

3

Oil Lamp

5

Health Potion

3

Wolpertinger

5

Mana Orb

2

Acorn Collar

4

Bag of Stones

2

Death Scythe

4

Bow and Arrow

2

Fanfare

4

Dagger

2

Hungry Blade

4

Draconic Orb

2

Leather Armor

4

Heroic Potion

2

Leather Helm

4

Pestilence Flask

2

Lucky Cat

4

Stone Skin Potion

2

Rainbow Orb

3

Book of Basics

2

Shield of Valor

3

Book of Darkness

2

Thorn Whip

3

Book of Ice

2

Toad

3

Book of Light

1

Fancy Fencing Rapier

3

Book of Nature

1

Greatsword

3

Broom

1

Hammer

3

Corrupted Crystal

1

Lightsaber

3

Crown

1

Rib Saw Blade

3

Cupcake

29 of 36

刷新机制概括

  • 长久未见加权
    • 定义:根据上次遇见到当前滚数的距离,调节权重。

30 of 36

刷新机制概括

  • 十字剑配方加权
    • 只对十字剑有效,当凑齐了一半以上的十字剑基础材料后,对剩余材料加权
    • 从来没玩过,细节跳过了

31 of 36

刷新机制概括

  • 道具勾子加权
    • 特定道具会上升特定道具特定次数下的出现概率。
    • 例如,火辣香蕉会增加接下来3次香蕉出现权重1.5倍
    • 本节内容似乎游戏内几乎没有文言提示。

32 of 36

刷新机制概括

道具

触发条件(descr 满足时乘权重)

权重

初始加成次数(命中后递减到 0 停止)

触发次数/递减

代码位置

Blood Manipulation

Vampiric 类型;Blood Amulet 特判

1.5(Blood Amulet) / 1.3(其他 Vampiric)

无限次(无递减)

Backpack Battles/Items/Exclusive/BloodManipulation.gd

Buy the Holy Light

Holy 类型 或 Oil Lamp / Djinn Lamp

1.3

无限次

Backpack Battles/Items/Exclusive/BuytheHolyLight.gd

Dark Ritual

Corrupted Crystal 且 boosted>0

1.5

1

boosted 初始 1,命中后 -1

Backpack Battles/Items/Exclusive/DarkRitual.gd

Dragon Set

Leather Armor / Boots / Gloves of Haste,各自缺且对应龙件未拥有

1.3

条件型,无递减

Backpack Battles/Items/Exclusive/DragonSet.gd

Extra Bags

任意袋子

bagWeight(JSON bagweight

无限次

Backpack Battles/Items/Exclusive/ExtraBags.gd

Heavy Drinking

Potion 类型 且 boostedPotions>0

1.5

3

boostedPotions 初始 3,命中后 -1

Backpack Battles/Items/Exclusive/HeavyDrinking.gd

Knife to Meet You

Dagger 且 boosted>0

1.7

3

boosted 初始 3,命中后 -1

Backpack Battles/Items/Exclusive/KnifetoMeetYou.gd

Hardwood

Common 近战武器,且当前没有 Common 近战武器

1.5

条件型,无递减

Backpack Battles/Items/Exclusive/Hardwood.gd

Mana Mastery

Mana Orb 且 boosted>0

1.8

1

boosted 初始 1,命中后 -1

Backpack Battles/Items/Exclusive/ManaMastery.gd

33 of 36

刷新机制概括

道具

触发条件(descr 满足时乘权重)

权重

初始加成次数(命中后递减到 0 停止)

触发次数/递减

代码位置

Girl Power

任意 Class Item

1.2

无限次

Backpack Battles/Items/Exclusive/GirlPower.gd

Mushroom Farm

Fly Agaric,且蘑菇总数未达 mushroomsNeeded

1.7

条件型,无递减

Backpack Battles/Items/Exclusive/MushroomFarm.gd

Piggy Pinata

Piggybank

1.5

无限次

Backpack Battles/Items/Exclusive/PiggyPinata.gd

Power of the Moon

Mana Orb 且 boosted>0

1.5

1

boosted 初始 1,命中后 -1

Backpack Battles/Items/Exclusive/PoweroftheMoon.gd

Smelly Barrier

Garlic 且 boostedGarlic>0

1.5

3

boostedGarlic 初始 3,命中后 -1

Backpack Battles/Items/Exclusive/SmellyBarrier.gd

Solaris

Shield of Valor / Holy Armor 且 boosted>0

1.5

1

boosted 初始 1,命中后 -1

Backpack Battles/Items/Exclusive/Solaris.gd

Spicy Banana

Banana 且 boostedBananas>0

1.5

3

boostedBananas 初始 3,命中后 -1

Backpack Battles/Items/Exclusive/SpicyBanana.gd

Stoned

Stone 且 boostedStones>0

1.7

4

boostedStones 初始 4,命中后 -1

Backpack Battles/Items/Exclusive/Stoned.gd

34 of 36

刷新机制概括

道具

触发条件(descr 满足时乘权重)

权重

初始加成次数(命中后递减到 0 停止)

触发次数/递减

代码位置

Uniquely Unique

Customer Card 且 boosted>0

1.5

2

boosted 初始 2,命中后 -1

Backpack Battles/Items/Exclusive/UniquelyUnique.gd

Smithing for Dummies

Whetstone 且 boostedWhetstones>0

1.5

1

boostedWhetstones 初始 1,命中后 -1

Backpack Battles/Items/Exclusive/SmithingForDummies.gd

Shielded

Shield of Valor 且 boostedShields>0

1.5

1

boostedShields 初始 1,命中后 -1

Backpack Battles/Items/Exclusive/Shielded.gd

Acorn Ace

Acorn Collar 且 boostedCollars>0

1.5

1

boostedCollars 初始 1,命中后 -1

Backpack Battles/Items/Exclusive/AcornAce.gd

35 of 36

未来研究�打折与刷新结合的实例研究

  • 根据道具集合和打折概率,探究每个回合前4刷新的期望值
  • 根据刷新逻辑,探究获得血剑,虚无剑,棋盘期望最高的回合和刷新方法

36 of 36

ご清聴ありがとうございました