- UID
- 3576174
- 主题
- 0
- 阅读权限
- 20
- 帖子
- 16
- 精华
- 0
- 积分
- 8
- 金钱
- 78
- 荣誉
- 0
- 人气
- 0
- 在线时间
- 0 小时
- 评议
- 0
- 帖子
- 16
- 精华
- 0
- 积分
- 8
- 金钱
- 78
- 荣誉
- 0
- 人气
- 0
- 评议
- 0
|
特技修改进阶
5. 特技修改进阶
到了这一步,其实对于lua特技脚本其实已经没太多可以说的了,对于lua的MOD,难点就在于猜测并理解游戏里的代码。有趣的是,从游戏的注释中可以看到,就算是游戏的开发者,面对某些奇怪的参数什么的也会觉得困惑,更别说是完全没有文档的我们了。在这一章我会简要介绍下我对游戏代码的理解,以供参考。因为我也没有做太深入的研究,所以如有错漏请多多包涵。
5.1 调用结构和时机以及对应的函数约定
在前面提到过atom里就提供了好几个函数调用的设定,据我所知的有如下几种:
each_turn_script=ets_function
在每回合轮到该兵种行动的那一刻调用,代表为unit_features.lua的features_auto_dispell(大恶魔的净除特性)。一般返回true。
posthitmaster=phm_function
在该兵种攻击别人的那一刻调用,代表为unit_features.lua的features_poison(刺客的毒汁特性)。函数参数为:
function phm_function(damage,addrage,attacker,receiver,minmax,userdata,hitbacking )
其中:
damage猜测为伤害计算到函数调用时刻的伤害值
addrage猜测为函数调用时刻的怒气增加值
attacker为攻击者
receiver为被攻击者
minmax猜测是用来判断是否实施了攻击(经测试电脑AI考虑攻击时函数可能会被调用,此时minmax值为3,而实际实施了攻击后调用的函数minmax值为0)
userdata不明
hitbacking是否是反击
约定的返回值一般为damage, addrage
posthitslave=phs_function
在该兵种被被人攻击的那一刻调用,代表为unit_features.lua的bear_slave(熊的兽性特性)。函数参数和返回值约定posthitmaster一样。
特技/魔法的:script_attack=sa_function
在施展该特技时调用,代表为special_attacks.lua的cast_bear(德鲁伊的召唤熊特技)。上一章已经详细分析了,一般返回true。
特技/魔法的:script_calccells=sc_function
在施展特技/魔法前用于计算可选对象,代表为spells_common.lua的calccells_all_empty_around(召唤时找出周围所有空格),一般返回true。在calccells_all_empty_around中,周围有空位的话会用Attack.marktarget()标记,没有的话就不标记任何格子,无论如何都返回true。
另外,在各种状态(比如中毒,定义的格式可以参照effects.txt的69-102行effect_poison)中也可以定义每回合调用的脚本(each_turn_attack):
script_attack=eta_function
调用时机也是在每回合轮到该兵种行动的那一刻,代表为spell_effects.lua的effect_poison_attack(中毒状态)。函数参数为:
function eta_function(target, pause, duration, attacker)
参数意义没研究过,一般返回true。
同时在状态结束(持续时间到,被驱散,或兵被杀死等)时也可以增加函数调用(参照effects.txt的202-231行effect_sleep)。
onremove=or_function
代表为spell_effects.lua的sleep_onremove(睡眠状态)。函数参数为:
function or_function(caa, duration_end)
其中:
caa为解除状态的单位
duration_end不明,是否因为持续时间到而结束?
约定的返回值一般为true。
5.2 简陋且不完整的API
稍微研究下lua代码,就可以发现系统里有几个内置的对象,比如Attack,Logic等,系统通过这些对象提供各种操作的接口。遗憾的是系统封装了这几个对象的代码,也没有任何的API文档留下,所以对于这些接口函数的作用我们只能通过已有的代码来猜测。以下是一些我研究过程中经常碰到或者用过的函数,姑且作为一个简陋且不完整的API参考:
Attack对象:操作当前的这次攻击
Attack.get_target():得到攻击对象的index,index几乎就可以视作是一个对象,下面所有idx开头的参数都可以使用这个index来调用。另外一般来说index=0的对象就是调用函数的那个兵,比如某兵被攻击调用了posthitslave,那么在该函数里index=0的就是被攻击的兵
Attack.aseq_rotate(idx_actor, idx_target):使idx_actor的朝向转向idx_target。
Attack.act_aseq(idx, action):在idx的动作序列里面增加action动作并立即返回(程序会有专门的另外线程处理动作,会按照动作序列一个个播放)。
Attack.aseq_time(idx, “x”):后面的”x”参数可选,没有的时候貌似是返回当前的动作序列时刻;有的话貌似返回执行一个动作的时间。总之这个函数的返回值是用于控制动作的时间的(比如希望仙女执行完施法动作后独角兽才开始出现)。
Attack.act_enemy(idx, bel),Attack.act_ally(idx, bel):敌我判断,其中bel省略时判断idx和当前对象?(index=0)的关系。bel一般为Attack.act_belligerent()的返回值。
Attack.act_belligerent(idx, bel):bel省略时返回idx的当前敌视方?bel不省略时设置idx的当前敌视方?(用于类似魅惑这种情况)。、
Attack.act_size(idx):返回idx的数量。
Attack.act_totalhp(idx):返回idx的总血量。
Attack.act_get_par(idx, par):返回idx的各种属性(比如par=”initiative”时返回主动性)。
Attack.atom_spawn(idx, t, atom):在t时刻在idx的位置生成一个atom对象(一般用来生成一些特效之类一次性的东西),atom为atom文件名,比如雷击效果可以是Attack.atom_spawn(idx, 0, "effect_lightpower")。
Attack.act_spawn(idx, t, atom, ang, size):在t时刻在idx的位置生成atom对象(一般用来生成召唤出来的兵),size为数量,ang为朝向。
Attack.cell_resurrect(idx, hp, t):在t时刻复活idx,hp为复活的血量。
Attack.get_custom_param(par):读取特技对应的custom_params里的参数,par指定参数名,注意返回值为string类型,可能需要用类似tonumber()之类的函数转换类型。另外对于类似“count=10-20”这种可以用text_range_dec()来得到min,max。
Attack.val_store(idx, par, val),Attack.val_restore(idx, par):把数值存储在idx所指的那个兵上,par指定值的名称,val指定值。
Attack.act_apply_spell_begin(idx, effect, dur, false),Attack.act_apply_spell_end():标记着开始在idx身上增加一个状态,在_begin和_end中间可以加上若干个Attack.act_apply_*_spell()作为状态持续过程中改变的各种能力,在状态消除后这些能力加成/减弱会自动消除。effect为状态名,和effects.txt中的名字对应,如effect_burn。dur为状态持续回数,dur为-100表示永远持续。最后的false意义不明,我见到的都是false。
以下3个函数是用于Attack.act_apply_spell_begin()和Attack.act_apply_spell_end()中间的几个代表函数:
Attack.act_apply_dmgmin_spell(par, bonus1, bonus2, 0, dur, false):修改最小伤害值,par为伤害类型(如physical物理伤害),增加的值为原值增大bonus2%最后加上bonus1。dur为持续时间,0和false意义不明。
Attack.act_apply_par_spell(par, bonus1, bonus2, 0, dur, false):修改一般的参数(比如par=”krit”暴击率),算法同上
Attack.act_apply_res_spell(par, bonus1, bonus2, 0, dur, false):修改抵抗力,par为抵抗类型。
Attack.act_posthitslave(idx, func, dur):为idx增加一个posthitslave的函数(被攻击时会调用),func为函数值(string类型)。dur省略时为无限持续时间,为0时立即取消。
Attack.act_spell_param(idx, effect, par, val):为idx的effect状态存取参数值,该值存在idx所指的兵的effect状态里。par指定参数名,val不省略时存储val,省略时返回之前存储的值。
Attack.act_del_spell(idx, effect):去除idx的effect状态,effect省略时去除所有状态。
Attack.act_enable_attack(idx, attack, enable):允许/禁止idx的某种特技,attack为特技名,enable为true时允许,false时禁止。
Attack.resort(idx):根据主动性重新排列行动的先后顺序(一般在类似召唤了新兵的场合使用)。
Attack.atk_set_damage(type, dmg),common_cell_apply_damage(idx, t):两个函数连用对idx造成伤害,类型type和伤害值dmg需要先由Attack.atk_set_damage()指定,进而用common_cell_apply_damage()指定伤害的对象和时间。
Logic对象:大概是存储着游戏的一些共用变量和参数,我没研究,还是不说了。
AU对象:没用过。
Game对象:只见过两个函数。
Game.CurLocRand(min, max):在min和max之间产生随机数。
Game.GVNumInc(par, val):增加记录参数,par为参数名,val为增加的值。比如在spell_effects.lua中effect_poison_attack就有中毒后使用Game.GVNumInc("burn_poison_enemy", 1)增加中毒和点火记录的(勋章啊)。
显然这里列出的函数是很不全的,而且部分参数和返回值也还不明朗,真正修改时还是需要多看代码多研究。
[ 本帖最后由 merlin.zll 于 2009-7-10 03:36 编辑 ] |
|