铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 4064|回复: 8

[分享] DIY教程:如何添加化境系统

[复制链接]
发表于 2017-11-14 13:33 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
DIY教程:如何添加化境系统

将近一万行的jymain和一万多行的jywar,不论谁看了都要头晕。jywar主要问题在于,数据与实现没有分离。也就是说,在jywar中,有太多诸如
  1. if wugong == xx and pid == xx and xxx and (xxx or xxx) then
复制代码

之类的代码。所以说,如果把每种化境组合,用上述方式添加到jywar文件中,起码也要写几百行。而且,要是再添加或者剔除化境组合的话,还要再到上万行代码中找到这些地方进行修改。

所以,添加化境系统,采用数据与实现分离的方式。

首先,在jyconst文件中,设立一个CC.HUAJING全局变量,储存各种化境组合。
  1.         CC.HUAJING = {
  2.                 --紫霞
  3.                 {89, 30},
  4.                 {89, 31},
  5.                 {89, 32},
  6.                 {89, 34},
  7.                 --混元
  8.                 {90, 37},
  9.                 {90, 40},
  10.                 {90, 60},
  11.                 {90, 121},
  12.                 --神照
  13.                 {94, 114},
  14.                 }
复制代码

如此,要调整化境组合搭配,只要在jyconst中调整这张表即可。甚至,取消化境系统,只需要
  1.   CC.HUAJING = {}
复制代码

设置空表即可,完全不需要调整jywar代码。实际上,这段代码也存在问题,就是太多魔数,89啊,30啊,实际上,可以在游戏里制作一个编辑器模式,用选武功名称,而不是敲数字的方式,来输出这张表。

其次,在jymain文件中,设立一个函数HJ_WG,来查询内外功组合是否符合化境搭配。
  1. --化境判定
  2. function HJ_WG(pid, WGid)
  3.         local NGid = JY.Person[pid]["主运内功"]
  4.         if Pair_Search(NGid, WGid, CC.HUAJING) then
  5.                 return true;
  6.         end
  7.         return false;
  8. end
复制代码

HJ_WG函数中,调用了一个查表函数Pair_Search。这个查表函数,可以帮助查询任何两两匹配表,在天衣无缝系统中,还会重复用到查表函数Pair_Search。
  1. --查表
  2. function Pair_Search(item1, item2, pair)
  3.         for _ , t in ipairs(pair) do
  4.                 if t[1] == item1 and t[2] == item2 then
  5.                         return true
  6.                 end
  7.         end
  8.         return false
  9. end
复制代码


接着。开始实现化境的几个效果:
武功威力,低于600的,提升至800威力。
武功威力,超过600的,提升199威力,至多为1199威力。
增加33%连击率。
攻击时,50%几率获得【浑然天成】效果,追加300点杀气。

首先,武功威力增加,是在jymain中get_skill_power函数实现的,只需添加一两句判定即可。
  1. if HJ_WG(personid, wugongid) then
  2.         if power <= 600 then
  3.                 power = 800
  4.         else
  5.                 power = power + 199
  6.         end
  7.         if power > 1199 then
  8.                 power = 1199
  9.         end
  10. end
复制代码



余下的,都需要在上万行的jywar文件中修改。按理来说,在这里应该把逻辑与显示进一步分离,也就是说,化境系统的连击、杀气,与画面中显示"至臻化境.浑然天成"绿字,进一步分离。可是本人水平有限,对付不了上万行代码。
总体而言,大部分对于战斗系统的修改,都集中于War_Fight_Sub与War_WugongHurtLife中,前者主要处理攻击时的各种特效,而后者则处理防御时的各种特效。

War_Fight_Sub函数大致三千行,承担过多的任务,其大体执行逻辑如下:
  1. function War_Fight_Sub(id, wugongnum, x, y)
  2.         --判定所使用的武功
  3.         --判定是否合击
  4.         WAR.ZYHB = 1 --判定是否左右互博
  5.         local LJ; --计算连击率
  6.         fightnum = xx --连击次数
  7.         while WAR.ACT <= fightnum do --连击循环
  8.                 --初始化一些全局变量
  9.                 --判定额外连击
  10.                 local BJ; --计算暴击率
  11.                 --计算内功加力
  12.                 --计算特定人物攻击特效
  13.                 --计算特定武功攻击特效
  14.                 --计算标主大招特效
  15.                 War_WugongHurtLife--计算伤害的敌人
  16.                 --计算吸血
  17.                 --显示动画
  18.                 --计算武功经验与升级
  19.                 --计算内力消耗
  20.         end
  21.         local jtl = 0; --计算体力消耗
  22.         local dz = {}; --计算斗转星移
  23. end
复制代码


于是乎,连击率增加,在jywar中,查找"local LJ"计算连击率那一部分的代码,在下面添加一句。
  1. if HJ_WG(pid, wugong) then
  2.         LJ = LJ + 33
  3. end
复制代码


再接着,浑然天成,显然是在连击循环中计算,只要放在计算伤害的敌人之前都可以,于是放在计算暴击率之前,查找"local BJ",在之前添加下面一句。
  1. --化境
  2. WAR.HJ = 0
  3. if HJ_WG(pid, wugong) and JLSD(20, 70, pid) then
  4.         WAR.HJ = 1
  5.         if WAR.Person[WAR.CurID]["特效文字4"] ~= nil then
  6.                 WAR.Person[WAR.CurID]["特效文字4"] = "至臻化境.浑然天成" .."·".. WAR.Person[WAR.CurID]["特效文字4"]
  7.         else
  8.                 WAR.Person[WAR.CurID]["特效文字4"] = "至臻化境.浑然天成";
  9.         end
  10. end
复制代码

这里将,全局变量初始化与实现放在一处,可能是更合适的一种选择。


War_WugongHurtLife函数大致也有三千行,其大体执行逻辑如下:
  1. function War_WugongHurtLife(enemyid, wugong, level, ang, x, y)
  2.         --判定攻击的武功
  3.         --计算护体
  4.         ----计算阴、林、山
  5.         ----计算特定人物防御特效
  6.         ----计算特定内功防御特效
  7.         ----计算斗转星移
  8.         --计算伤害
  9.         ----计算武器、防具对伤害的影响
  10.         ----计算暴击对伤害的影响
  11.         ----计算特定人物对伤害的影响
  12.         ----计算系数对伤害的影响
  13.         ----计算连击对伤害的影响
  14.         ----计算难度对伤害的影响
  15.         ----计算闪避
  16.         ----xxxx
  17.         ----yyyy
  18.         JY.Person[eid]["生命"] = JY.Person[eid]["生命"] - hurt --伤害结算
  19.         --复活判定
  20.         --计算杀气
  21.         --计算上毒
  22.         --计算吸血内
  23.         --计算封穴、流血、冰封、灼烧、怒气
  24.         --计算杀敌增加实战
  25.         --结算
  26. end
复制代码



于是乎,追加杀气可以添加计算杀气中,搜"local spdhurt",于其后添加下面一句。
  1. --化境追加杀气
  2. if WAR.HJ == 1 then
  3.         spdhurt = spdhurt + 300
  4. end
复制代码


最末,特效文字的显示,在War_ShowFight函数中,添加下面一句。
  1. if HJ_WG(pid, wugong) then
  2.         kfname = kfname .. "·化境"
  3. end
复制代码

以及其后特效文字的显示颜色,代码就不列举了。

化境系统最终就完成了。除去jyconst中的表外,添加的代码大致五十行,并不是很难。问题的关键,在于搞清楚War_Fight_Sub与War_WugongHurtLife两个大头函数的运行逻辑。从上面可以看出,这两个函数,所承担的任务实在太多,必须重构,否则任何战斗系统的改变,修改起来都是十分头痛的。

评分

参与人数 1声望 +15 收起 理由
公子孝 + 15 技术好,版面也很工整

查看全部评分

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2017-11-14 15:39 | 显示全部楼层
新人学习中 同时请教 如果我设计个天外飞仙组合  是2个外功在一起触发类似效果 或者是类似易筋经触发罗汉 是主运触发被动  也可以这样设计吗
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2017-11-14 15:44 | 显示全部楼层
      例如外功和外功  CC.waigong = {
                --
                {30, 31},
                {31, 30},---是30-31  还是31-30也要加入啊
           若果是内功主运和被动
                --神照主运和混元被动
                CC.内功 = {
                --
                {94, 90},---这样子吗
      
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2017-11-14 15:44 | 显示全部楼层
支持下大神
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2017-11-16 21:49 | 显示全部楼层
这个帖子极具价值
不但是一个很好的DIY教程
更重要的是指出了现有的算法中存在的问题以及改进的方向
非常感谢楼主投入的心血和做出的贡献!
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2017-11-17 22:51 | 显示全部楼层
大神的高度。。。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2017-11-19 21:59 | 显示全部楼层
看了就头疼,佩服楼主
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2020-7-7 20:33 | 显示全部楼层
多謝版主無私分享
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2020-7-10 18:33 | 显示全部楼层
本帖最后由 woabclf 于 2020-7-10 18:44 编辑

化境其实就是武功组合的一种使用,很多mod都有类似的东西,已经不算新鲜了。
如果是天赋武功的各别强化或是专精系统的大解放(多专精设置),我会更有兴趣。

至尊的化境功能还被固定在增加外功威力、杀气和连击率这三种,这三种能力在黑山新版中不太给力。
奇怪的是既然黑山要黑至尊,黑山居然没继承化境,补上化境才是更完整的黑山,或许制作群可以考虑一下。

我发觉这帖子最有价值的不是化境,而是攻击函数和伤害函数的运行流程:

不看不知道,一看吓一跳,楼主的教学比蓝烟清和SYP难多了,二宫是进阶教学。

------------------------------

War_Fight_Sub函数大致三千行,承担过多的任务,其大体执行逻辑如下:

01.function War_Fight_Sub(id, wugongnum, x, y)

02.        --判定所使用的武功

03.        --判定是否合击

04.        WAR.ZYHB = 1 --判定是否左右互博

05.        local LJ; --计算连击率

06.        fightnum = xx --连击次数

07.        while WAR.ACT <= fightnum do --连击循环

08.                --初始化一些全局变量

09.                --判定额外连击

10.                local BJ; --计算暴击率

11.                --计算内功加力

12.                --计算特定人物攻击特效

13.                --计算特定武功攻击特效

14.                --计算标主大招特效

15.                War_WugongHurtLife--计算伤害的敌人

16.                --计算吸血

17.                --显示动画

18.                --计算武功经验与升级

19.                --计算内力消耗

20.        end

21.        local jtl = 0; --计算体力消耗

22.        local dz = {}; --计算斗转星移

23.end


War_WugongHurtLife函数大致也有三千行,其大体执行逻辑如下:


01.function War_WugongHurtLife(enemyid, wugong, level, ang, x, y)

02.        --判定攻击的武功

03.        --计算护体

04.        ----计算阴、林、山

05.        ----计算特定人物防御特效

06.        ----计算特定内功防御特效

07.        ----计算斗转星移

08.        --计算伤害

09.        ----计算武器、防具对伤害的影响

10.        ----计算暴击对伤害的影响

11.        ----计算特定人物对伤害的影响

12.        ----计算系数对伤害的影响

13.        ----计算连击对伤害的影响

14.        ----计算难度对伤害的影响

15.        ----计算闪避

16.        ----xxxx

17.        ----yyyy

18.        JY.Person[eid]["生命"] = JY.Person[eid]["生命"] - hurt --伤害结算

19.        --复活判定

20.        --计算杀气

21.        --计算上毒

22.        --计算吸血内

23.        --计算封穴、流血、冰封、灼烧、怒气

24.        --计算杀敌增加实战

25.        --结算

26.end

----------------------------

这东西对老手也非常有用,像我就没这么闲,会一条条把流程查出来,论坛真是卧虎藏龙,真牛人也。


【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-11-21 20:40

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表