使用Lua制作动态数据表格

表格配置中有种很常用的表格就是等级数值表,类似下面这种:

table_1
一般都是数值策划用exce制作出来的,而且很大可能是用公式计算出来的。通常情况下这么做没什么问题,但是有这么一种需求,一个怪物的掉落经验会随着玩家等级变化而变化,那么要配置这样一个掉落表就会是个让人很繁琐的事情了。通常我们会有两种做法:(我之前呆过的项目经验)

  1. 直接让程序在代码里实现,但这样做的不好在于策划如果不懂程序,要更改还要去找程序,而且如果不同的怪物有不同的规则呢,程序要累死……
  2. 为怪物表里的每个怪物再单独配置一个这样的等级对照表,就像下面这样:

table_2

再配置一个slime.txt(假设规则是玩家大于10级后,每大一级递减20%)如下面这样:

table_3

而slime_metal.txt的规则可能不一样,他是根据玩家当前等级给予等级 * 50的经验,因此我们得配这样一个表。

table_4
想像下,如果有几百种怪物,该是多么的复杂…Orz,那么有没有更好的方法呢?

重新整理一下,这些表格通常来说都是有一个规律,那么如果用类似DSL的方式来填表是不是就可以了呢?利用Lua,结合之前我们说的动态解析表格,我们可以实现一个像下面这样的表来做一个新的解决方案,配置出来的表大概如下(是不是和excel的公式类似?):

table_5
一个表格就可以搞定所有,而且对于数值策划而言,配置这样的数学表达式也应该不是什么难事(什么,搞不定?那别做了)

接下来就说说怎么实现这种动态数据吧,其实主要是利用了Lua的脚本动态载入特性和它的闭包特性。

根据数据类型将公式做为Lua语句存储,然后在需要获取数值时,为其构造一个Env环境(比如上述例子,需要为其构造level, min, max这3个变量)形成闭包,然后执行这个闭包获得最终结果。具体代码其实很简单的,就贴个核心代码吧(基于Lua5.3,Lua5.1请用setenv):

code_0

code_1

大功告成,最后,高呼一声Lua大法好!

发表评论

电子邮件地址不会被公开。