利用 Excel 编写一个可配置的天赋加点模拟系统

作者:riku
2017-11-25
27 21 2

先介绍一下 Lost Castle 的天赋系统

它拥有一个天赋树(包含三条技能分支以及若干天赋深度),另一部分是技能消费天赋点随添加技能数而递增的数值系统,第三部分在结束加点时会燃烧掉一部分灵魂点(天赋点)。

这里介绍一下天赋消耗递增的数值系统,这个数值系统设计精妙的地方在于,它没有硬性设定好你只能加满一些天赋或者你只能选某一种天赋,它所有的天赋是兼容。但是每当你点了一个天赋时,所有天赋将比原先需要消耗更多的天赋点才能点亮。这就要求你必须在一开始就合理分配并思考好想要走哪个天赋方向。另一方面,它使得天赋的加点逐渐减速,越往后玩,你加天赋的速度就越慢,通过天赋点收敛的方式给你一个无形的上限。

这样的数值设计,我认为的一个好处是可以压缩新手(刚玩没几把)与老手(玩了好久)的玩家之间的天赋差距。同时,又给你一个理论上可以点亮所有天赋的机会(实际上要点满天赋到底需要多少灵魂,我也不知道,反正贼多),让你每次玩都会觉得我再玩几把就可以有天赋提升,就有可能通过这一关。

在文章中,我把它称为天赋消耗递增的数值系统。

天赋系统

天赋模拟器演示

然后,这篇文章要讲的是如何利用 excel 来实现前两部分的功能,即一个可加点的天赋界面以及随着点亮技能越多后的天赋消耗递增的数值系统。

首先来看一张基本实现后的图示:

请无视具体天赋的设计,这个是我根据某款游戏自己想的天赋


也就是说,当完成时我们将拥有一个天赋模拟器的界面,可以用来点你设计好的天赋。

天赋模拟器实现的功能

不明确开发功能是无法入手进行开发的,所以我们要先列出我们的天赋模拟器要实现哪些功能

  1. 实现一个可交互的天赋加点界面(它包含天赋的相关信息以及加减天赋的功能)
  2. 允许清空所有的天赋点进行重置(假设我不想这么点了,不需要一个个天赋点才撤回)
  3. 可以设置允许分配的天赋点总量(这里包含当剩余天赋点不足时不允许再加点的贡呢给)
  4. 实现天赋之间的解锁关系(举例:第一层天赋当点满5级后,解锁第二层天赋)
  5. 实现天赋消耗递增的数值系统以及它的配置文件
  6. 用一张天赋的配置表实现调整修改所有参数

下图示就是那部分的功能结构:

一、制作天赋技能配置表

这一部分主要是配置表的设计,核心的思路就是如何将每个技能的各个升级状态用唯一的标识来标记。剩下的部分就是填写相应的数值以及解锁的前置条件。

天赋配置表

一些字段的说明:

  • 天赋 id:这是一个自增且唯一的 id 号(类似主 key),它可以用来定位每一行,在填写解锁条件时就可以填写天赋 id 来锁定哪个技能的哪一级是解锁的前置条件
  • 天赋类型:用来区分天赋的大类(伤害、防御、恢复这样)
  • 天赋深度:代表这个天赋技能在天赋树的第一层(假设我们这里有四层深度)
  • 天赋分支:用来区分在当前天赋层,处于哪个天赋分支中。这样既实现了同一类天赋的相同深度时,玩家可以选不同分支天赋的功能
  • 天赋等级:代表当前这个天赋处于几级
  • 行标签:这个标签和天赋 id 其实作用差不多,但是它更具有可读性,主要用在天赋模拟器的天赋信息上
  • 参数1,2,3:天赋技能可以填的参数
  • 解锁条件:这里可以填写天赋 id,表示解锁这个技能需要的前置条件
  • 备注:就是备注而已= =

*可以发现左半边好多的字段主要都是用来定位这一行的天赋技能的唯一性。

*当然,天赋配置表是根据天赋模拟器实现的功能来调整,所以事先可以先设计天赋配置表,然后根据模拟器微调一些表结构

二、制作天赋模拟器

这一部分就是整个天赋模拟器的重点部分了,你要用一个 sheet 来开发一个可交互的天赋加点界面。

首先,我们需要有几个概念:

  1. excel 内置的单元格函数功能;
  2. excel 中的控件元素;
  3. VBA 脚本    

这三个概念是我们制作一个天赋模拟器的要素。

excel 的函数功能

这里我先暂时略过,因为牵涉的东西太多太杂,具体用到哪些函数,可以下载我附件里面的文档,然后再看。

excel 中的控件元素

在我们这个天赋模拟器里,总共会用到两种控件,一个是的重置天赋用的按钮,一个是加减天赋用的控件。

控件

在开发工具这个 sheet 下面,通过插入控件的方式,可以插入表单控件和 ActiveX 控件,表单控件和 ActiveX 控件主要的区别在于 ActiveX 控件是允许使用 VBA 脚本来控制的,所以这里我们要插入两个 ActiveX 的控件。

在 excel 中插入控件后,在设计模式下双击控件,就会进入到 VBA 的工程中。

这里有个重要的概念!

异步的事件触发。

什么意思呢?意思就是说当你双击一个控件时 VBA 会自动给你注册一个该控件的元素名,类似下图的第一行下拉菜单中的 SpinButton17,这代表有一个名叫 SpinButton17的控件被 VBA 注册。

而一般我们会通过对控件在特定的事件中需要实现哪些逻辑进行编程。

举个例子,比如上图中的最后一段代码,CommandButton1_Click(),CommandButton1代表了一个注册的控件名,而 Click()是这个控件下拥有的事件函数名,代表点击事件。也就是说,这段代表的是,当我们对 CommandButton1这个控件进行点击(这个事件)的时候,会执行中间的代码。

这就是异步事件触发的概念。

所以当我们了解了如果通过 VBA 控制控件之后,我们就可以生成一个天赋加减功能的基础控件,这也是这个天赋模拟器实现的基础:

在上述 GIF 中,你可以看到通过点击向下的按钮,我们就给这个天赋加了1点,然后点击向上箭头就减去这个天赋一点

至于黄色部分的技能描述以及天赋等级与下一级消耗天赋点如何变化的,主要是通过 VBA 在事件中给对应的单元格进行天赋等级的加减实现的。(消耗天赋点的动态变化有些复杂,在第三部分一起讲)

所以要实现一个这样的控件并不难,剩下的就是想要加点和减点时需要判定的条件以及天赋等级如何变化,解锁条件如何变化等等

这里有几个实现的逻辑要点:

  1. 当加点时首先判断是否天赋点数够你加点
  2. 当加点时,该天赋已解锁
  3. 当加点时,该天赋是否已达到等级上限

*减点的逻辑基本与加点相似,多一个有对该天赋有解锁依赖关系的天赋有点亮情况下,这个天赋最多只能减少至保证下一级天赋能点亮的等级

三、制作天赋消耗递增的数值表

这张是用来实现像 lost-castle 里面的天赋点数递增的功能。

这里我并没有仔细研究 lost-castle 它的递增模型使用的公式是怎么样的,我自己用一个简易的递增模型来代替。

主要的思路就是实现当累计点亮的天赋次数增加,其他未点亮的天赋的点数消耗会以一定关系增加:

当前天赋消耗 =  向上取整(初始天赋消耗 × ( 累计点亮次数 ^ 增长系数))

  • 当前天赋消耗:就是最终获得的你目前要加点的天赋消耗
  • 初始天赋消耗:是你要加点的这个天赋下一级的初始天赋消耗(初始天赋消耗意思是当这个天赋等级是所有累计的第一次加)
    • *这里的值就是从天赋技能配置表里面的初始天赋消耗的字段读来的值
  • 累计点亮次数:就是总共已经点亮了几次天赋
  • 增长系数:这是一个用来控制模型增长速度的调整系数
  • 向上取整:为什么要向上取整?这保证了这次累计点亮次数变化时,至少有一个最小整数单位可以被增加,不会出现不变或者增加小数点的情况

上图就是通过这个简易模型模拟出来初始天赋为100时,随着累计点亮次数的增加而增加的消耗点数

难点!

也许你发现了,我这个天赋点消耗的增加,看似简单的功能,如何反馈在天赋模拟器的交互界面上?以及当我加一个天赋后,又在另一个天赋上减掉一点的时候,这天赋消耗变化?

这里一个原则:当我减去一点我已加点的天赋,我需要把当初加这个天赋时所消耗的天赋点返还给玩家,然后从累计点亮次数上-1。

这里的难点就在于要求你首先要记录累计点亮的次数,同时要求你记录在某个天赋的 X 等级时加点消耗了多少天赋点。的

实现方法:在 VBA 中初始创建对应每个技能等级的一个数组,用来储存最后一次该天赋的第 N 个等级下消耗了多少点。

本来我是想同堆栈的数据结构来解决这个问题的,不过看了一下 VBA 的堆栈的数据结构过于...奇怪= =?所以就用数组方式实现了。(如果有新的思路的小伙伴记得分享哈!)

总结

如此一来,一个类似 lost-castle 的天赋模拟器就实现了,剩下的就是一些表格修饰啊,之类的。顺便一提,这个没有提天赋点按钮重置怎么搞,因为原理基本和加减天赋的控件一样,就不展开说了。

总之,其实这个天赋模拟器实现的核心思想概括成一句话,就是:

用可配置的表结构,让天赋模拟器读取配置表中的数值,然后通过交互的界面进行加点。

另外重要的概念说三遍!VBA 的异步事件!VBA 的异步事件!VBA 的异步事件!

  • P.S. 另外提醒一下,你打开文档后需要允许启用宏才可以使用天赋模拟器= =,记得要启用宏
  • P.S2.  天赋模拟器中有一个优化问题,就是当第一次加天赋时,它在处理天赋消耗递增时感觉效率有点慢(大概要几秒),我觉得应该是 excel 的单元格函数功能查询起来非常慢,如果你加点点快了容易出现天赋消耗计算错误的情况。如果有哪位小伙伴有好办法请务必教教我!OTZ (搞了好久不知道如何解决)

以上,我想想怎么附上天赋模拟器的完整文档附件。