奖励系统与最优序列
浅要讲一下奖励(Bonus)系统的机制,选择方式,以及最优序列的搜索与遍历。
最新一次更新:2024-11-19
by dreamskycx
奖励系统(Bonus系统)
在官方博客的 1.9.0版本更新 (opens in a new tab) 提到了奖励系统的更新,博客中是如此描述的:
Added a Bonus system, which is available on level 6.6 and in the daily maps. Currently it has more than 40 different powerful bonuses you can choose from during the game, featuring many new gameplay mechanics. Bonus system is deterministic, making leaderboard competitons fair for everyone.
新增了奖励系统,适用于 6.6 级及每日地图。目前该系统包含超过 40 种不同强力奖励,供玩家在游戏过程中选择,引入众多全新游戏机制。奖励系统具有确定性,确保排行榜竞争对所有玩家公平公正。
事实上在当前版本中,奖励系统具有如下的一些特征:
- 每次选择时,你可以选择 3 种奖励,若你之前选择了[额外获得选择选项],你可以选择 4 种奖励。
- 选择的挑战数有一定上限。在每日挑战中,最多选择 10 种奖励;在关卡 6.6 中,最多选择 15 种奖励。
- 选择奖励需要你满足一定的杀敌数量,在当前的版本(v1.9.2+)中,每日挑战每一次选择奖励需要满足的杀敌数序列为[150,160,170,180,190,200,210,220,230,250]。
- 允许选择的奖励与地图相关,某些奖励在特定地图内不会出现。
- 你可以进行重新选择。
- 在每日挑战中,选择不需要付出任何代价,但上限只有三次。
- 在关卡 6.6 中,重新选择需要付出一定的金币。
- 你的本次选择选择奖励影响下一次可选的奖励,但只要你之前选择的奖励顺序不变,你本次可选的奖励也不变。
- 在每日挑战中,每天的选择序列不同。
本文将会介绍一些奖励系统相关的内容。
最优种子
我们将奖励选择的最终效果称为 种子 ,即种子是一系列效果的集合。
不同的奖励拥有不同的效果,比如说比较优秀的奖励有[在地图上增加一个核心],而不适合选的序列则有[矿机出怪]等。
但无论如何,我们都期望能在恰当的时期选到合适的奖励。好的种子是得到高分的基础,无论是大佬打榜,还是萌新抄作业,都对最优种子有所需求。比较可靠的手段是对种子进行评分和遍历,下面将会详细介绍其原理。
最优序列
通过记录每一次的选择,我们可以得到一组选择方式,称为 序列 。
序列是指选择方式的排列,一般来说,一个种子可能对应多个序列,但一个序列仅对应一个种子。在社群聊天中,亦可能把种子称作序列。为避免误解,本文种一律称呼序列。
为了方便说明,以下采用一串长度为 10 的数字串来进行序列记录,如 33162 41376
,它的意义如下:
- 每轮次选择有三个选项,我们用 1 代表选择第一项奖励,2 代表选择第二项奖励,3 代表选择第三项奖励。
- 如果本轮进行了重新选择,我们用 4 代表重新选择后的第一项,5 代表选择第二项,6 代表选择第三项。
- 如果在某一轮次选择了[额外获得选择选项],在下一轮次,我们用 4 代表选择第四项;若该回合出现重新选择,我们用 5 代表重新选择后的第一项,6 代表重新选择后的第二项,以此类推。
- 例如序列
33162 41376
可以理解为分别选了:第三项、第三项、第一项、重新选择后第三项,第二项[额外获得选择选项],第四项,第一项,第三项,重新选择后第三项,重新选择后第二项。
在大佬 249 等一系列人的努力下,通过对各项奖励的打分和序列评分测试的自动化,已经可以稳定输出每日的最优序列了。大佬会不定时在群(1020322961)内公布最优序列,欢迎进群喵。
序列快速模拟抽取
简述如何达到快速模拟抽取序列的方式。

模拟的原理
Infinitode 2 会根据你地图的当前情况(如你拥有的技能,地图上的出怪点等)和时间种子来生成一个序列,因此对于每日挑战来说,我们只需要保证以下内容一致:
- 地图内的关键图块一致
- 时间种子一致,对于每日挑战,这个种子是当日UTC时间(世界协调时)零点对应的UNIX时间戳。
- 如地图中拥有特殊的核心选择,如 DQ8 的赏金芯片,也会影响出现的序列
以下内容不一定要保证一致:
- 游戏版本
- 怪物的波次
- 防御塔与矿机的布置
在此之外,我们可以通过微调一些内容,如出怪数量,地图上的初始塔,达到奖励所需要的杀怪数等,来达到快速触发选择奖励的条件,进而实现快速模拟抽取的效果。
请注意,当前的模拟并不能保证完全一致。例如目前发现的[将部分奖励提升一级]的模拟就与实际情况不同。
前置准备环节
请保证你拥有一定的游戏游玩基础和程序基础。当然更好的方式是建议进群看 249 大佬发每日序列喵~
可以参照 Mod开发准备 (opens in a new tab) 一起阅读。
- 首先,从 Steam 免费获取 Infinitode 2 (opens in a new tab) 并下载。
- 前往您的 Steam 库,右键点击列表中的 Infinitode 2。选择“属性...”,进入“本地文件”标签页,然后点击“浏览...”以打开游戏安装所在的文件夹。
- 创建一个空文件夹(为简便起见,我们称之为
C:/I2Mod
),并将游戏安装文件夹中的所有内容复制到该文件夹中。确保infinitode-2.exe
文件位于C:/I2Mod/infinitode-2.exe
。从现在开始,仅修改C:/I2Mod
文件夹中的文件。 - 创建新文件
C:/I2Mod/steam_appid.txt
,用你喜欢的文本编辑器打开它,写入937310
并保存。你也可以重命名或复制位于该位置的steam_appid_example.txt
。若没有steam_appid.txt
文件,运行infinitode-2.exe
将通过 Steam 库启动游戏,而非从C:/I2Mod
路径启动。 - 创建新文件
C:/I2Mod/mod_id.txt
,用你喜欢的文本编辑器打开它,为你的模组写上任意名称(例如,test)并保存。你也可以重命名或复制位于该处的mod_id_example.txt
,并修改其内容。
如果你成功安装,你在打开游戏时就可以获得开发者奖杯,并解锁控制台和部分编辑页面。
前置准备环节(开发者模式)
开发者模式相比较于模组模式,支持全平台且相对容易操作。但开发者模式需要你有一定的科技树深度和游玩基础。
- 确保你的开发者研究处于可研究状态。
- 研究!
如果你成功安装,你可以解锁控制台和部分编辑页面。
地图编辑环节
进入游戏后,点击[选择关卡],你可以看到各种开发层和常规层的地图。往下翻可以看到每日奖励的地图。
点击一张每日地图(此处以DQ1为例),会发现关卡界面的右上角分别多了俩个图标,紫色的地图属性编辑和蓝色的地图图块编辑。

选择紫色图标,我们分别进行以下操作:
设置种子为时间戳
进去后可以直接看到Seed(种子,Random seed - enemy waves depend on it)配置栏,修改其为当日UTC时间(世界协调时)零点对应的UNIX时间戳。
如果你不知道怎么获取时间戳,可以本地运行以下python代码,或使用 Python3 在线工具 | 菜鸟工具 (opens in a new tab) 运行。
from datetime import datetime, timezone
# 获取当前UTC时间的日期部分
current_utc_date = datetime.utcnow().date()
# 创建一个代表当天0点UTC时间的datetime对象
midnight_utc = datetime.combine(current_utc_date, datetime.min.time(), tzinfo=timezone.utc)
# 将datetime对象转换为Unix时间戳
timestamp = int(midnight_utc.timestamp())
print("UTC Midnight Timestamp:", timestamp)
在 2024/11/19 的运行结果为:
UTC Midnight Timestamp: 1731974400
立即波次
修改 Fast forward frame 值为 1。
通过修改快进帧(Fast forward frame),可以实现在进入游戏后直接开始波次,快进的帧数取决于此值。
不建议将此值修改过高,否则可能导致无法预计的bug。

自定义怪物波次
往下翻页面,翻到怪物波次(Enemy waves),点击Add wave进行编辑。
点击后会出现一行默认的 小绿(Regular) 怪的设定,将数量(Count)修改为 5000,出怪时间间隔(Interval)修改为 0.003。
本操作是为了让怪物快速出来,方便快速满足奖励条件。
推荐再进行一轮 小绿(Regular) 怪的设定,将数量(Count)修改为 500000,出怪时间间隔(Interval)修改为 0.03。
本操作是给手选序列留出的时间余量,防止时间过快导致提早结束游戏。
别忘了点击右下角 Save 保存。

上图中由于显示原因,5000 和 0.003 显示不全。
自定义地图修改
返回页面,点击蓝色地图,进入自定义地图界面。
点击离界面最近的平台,将[没有防御塔]修改为[Venom(毒塔)],并将等级和经验等级升到最高,并选择毒塔的大招能力。本操作是为了批量清怪,快速满足奖励的选择条件。注意毒塔技能不需要全选,否则在脚本自动奖励选择时可能会出现无法预计的bug。
选择全部矿脉,在上面放置矿机,能力刷满。本操作是为了满足矿机加速相关的奖励条件。
复制和地图数量相同的矿脉(3个即可)。本操作是为了满足放置矿机相关的奖励条件。
在右边防止若干的基础防御塔。本操作是为了满足防御塔技能相关的奖励条件。

点击左上角的三角键运行测试。
验证
经验证,前俩轮的选择与当日挑战一致,故可认为模拟有效。
以下给出第一轮选择的截图。

序列评价与最优序列
通常,DPS(每秒伤害,Damage Per Second)是各类游戏中的一个重要的衡量指标,对于塔防游戏来说,每轮波次的怪物都会有一个血量总量,提高DPS可以快速地减少解决波次需要的时间,得到更高的分数,因此提高DPS非常重要。
Infinitode 2内含有MDPS(最大每秒伤害,Maximum Damage Per Second)计数器,属于科技研究的一部分,该计数器会统计近五秒(对防御塔来说是十秒)的内的伤害量并取最大值,并一定程度上影响技能系统和奖励系统。更多内容可以参阅靓仔大佬的【[infinitode2/无限塔防2] 增加游戏理解!深挖游戏底层逻辑-哔哩哔哩】 (opens in a new tab)内MDPS的讲解观看。
249 根据各奖励的权重对伤害提高的影响,得到了以下权重模型。
权重模型
权重模型认为每 100 得分可以让伤害(这里的伤害可以理解为攻击力)提高一倍。也就是说,满足最后的伤害倍率 和分数 的关系为 。例如,分数为 230 分的伤害倍率约为 4.925。
我们可以很容易地得到某些奖励的权重,例如,第一层的增加塔伤为 +15%,因此,可以认为其权重为 ,取到小数点后一位即为 。第二层的增加塔伤为 +30%,权重计算公式为 ,取到小数点后一位即为 17.7。
对于第一层的增加攻速,可以达到 +15%,但由于攻速的客观损失(怪物速度与攻速始终为定值,因此定量的伤害丢失必然), 249 认为实际上可以提高 +12% 的伤害,即 16.3 的权重贡献。
对于某些奖励,我们无法计算其权重,因此只能通过等效权重来进行计算。例如对矿机产生挖矿敌人的负权重,由于额外出怪,导致本轮波次需要解决的怪物数量提高,需要的伤害总量也要提高,相当于负增益。此外,矿机出怪会影响一定的防御塔布局,LargoDream 和 249 认为权重为 -20 。
对于一个序列的得分 ,我们将所有奖励的权重加起来,即满足:
表示选择奖励的权重。
权重列表
对于 DQ1 关卡,我们认为奖励的权重如下,括号内表示每次获得时候的的得分:
- 增加随机核心: AddRandomCoreTile={92.6, 84.8};
- 增加塔伤: TowersDamage={20.2, 17.7, 15.8};
- 增加塔攻速: TowersAttackSpeed={16.3, 14.7, 13.3};
- 伤害概率造成暴击: CriticalDamage={13.8, 6.4, 6.1};
- 敌人每层Buff的额外伤害: ExtraDamagePerBuff={32.2, 26.3, 22.2, 19.3, 17};
- Debuff持续时间延长: DebuffsLastLonger={9.7, 8.4, 7};
- 塔升级时闪电技能: LightningStrikeOnTowerLevelUp={32.2, 24.4, 20.2};
- 随机塔获得所有技能: AllAbilitiesForRandomTower={8.4, 7.9};
- 基地产生迷失敌人: SpawnZombiesFromBase={7, 4.3};
- 增加所有技能充能: AddAllAbilityCharges={7};
- 塔最大经验等级增加: GV_TowersMaxExpLevel={37.9, 20.2, 16.3};
- 矿工最大升级等级增加: GV_MinersMaxUpgradeLevel={22.2, 20.2, 17};
- 每分钟金币生成: DepositCoinsGeneration={2.9};
- 直接获得金币: ReceiveCoins={2.1};
- 波次中最后的敌人不造成伤害: LastEnemiesInWaveDealNoDamage={0.2};
- 低血量敌人不造成伤害: LowHpEnemiesDealNoDamage={0.1};
- 双倍采矿速度: DoubleMiningSpeed={5.7};
- 波浪中的第一个敌人爆炸: FirstEnemiesInWaveExplode={3.6};
- 敌人通过时基地爆炸: BaseExplodesOnEnemyPass={0.3};
- 建造随机矿机: BuildRandomMiner={5.7};
- 增加随机平台: AddRandomPlatform={8.4, 5.7};
- 倍增Mdps: MultiplyMdps={0.1};
- 矿机挖矿产生敌人: MinersSpawnEnemies={-20};
- 提高对冰冻/装甲敌人的塔效率: IncreasedTowerToEnemyEfficiency_FREEZING_ARMORED={13.3, 0.5};
- 赏金芯片可放在赏金芯片附近: GV_BountiesNearby={7};
- 赏金芯片附近塔可获得金币: GV_DisableBountyModifierHarm={5.7};
特别地,我们认为:
- 由于前五轮获得的为紫核,第六层到第十层获得的为橙核,因此在 DQ1 中认为紫核的权重为原本的 0.6 倍,橙核的权重不变。
对于其余的奖励,我们认为这些奖励对关卡的作用微乎其微,故不贡献权重。
搜索策略
搜索策略采用A*(A-star)算法,进行加权的广度优先搜索,权重由俩个部分组成:
若当前的遍历层数为 ,则满足:
- 部分序列的得分 , 表示选择奖励的权重。
- 潜力分 ,为与关卡有关的系数。
最后的权重为 ,优先对权重较高的进行搜索。
该策略能够在较短的时间内搜索出较优序列,且支持全遍历和多核运行。