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

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

将近一万行的jymain和一万多行的jywar,不论谁看了都要头晕。jywar主要问题在于,数据与实现没有分离。也就是说,在jywar中,有太多诸如

 if wugong == xx and pid == xx and xxx and (xxx or xxx) then

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

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

首先,在jyconst文件中,设立一个CC.HUAJING全局变量,储存各种化境组合。

	CC.HUAJING = {
		--紫霞
		{89, 30},
		{89, 31},
		{89, 32},
		{89, 34},
		--混元
		{90, 37},
		{90, 40},
		{90, 60},
		{90, 121},
		--神照
		{94, 114},
		}

如此,要调整化境组合搭配,只要在jyconst中调整这张表即可。甚至,取消化境系统,只需要

  CC.HUAJING = {}

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

其次,在jymain文件中,设立一个函数HJ_WG,来查询内外功组合是否符合化境搭配。

--化境判定
function HJ_WG(pid, WGid)
	local NGid = JY.Person[pid]["主运内功"]
	if Pair_Search(NGid, WGid, CC.HUAJING) then
		return true;
	end
	return false;
end

HJ_WG函数中,调用了一个查表函数Pair_Search。这个查表函数,可以帮助查询任何两两匹配表,在天衣无缝系统中,还会重复用到查表函数Pair_Search。

--查表
function Pair_Search(item1, item2, pair)
	for _ , t in ipairs(pair) do
		if t[1] == item1 and t[2] == item2 then
			return true
		end
	end
	return false
end

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

首先,武功威力增加,是在jymain中get_skill_power函数实现的,只需添加一两句判定即可。

if HJ_WG(personid, wugongid) then
	if power <= 600 then
		power = 800
	else
		power = power + 199
	end
	if power > 1199 then
		power = 1199
	end
end

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

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

function War_Fight_Sub(id, wugongnum, x, y) 
	--判定所使用的武功
	--判定是否合击
	WAR.ZYHB = 1 --判定是否左右互博
	local LJ; --计算连击率
	fightnum = xx --连击次数
	while WAR.ACT <= fightnum do --连击循环
		--初始化一些全局变量
		--判定额外连击
		local BJ; --计算暴击率
		--计算内功加力
		--计算特定人物攻击特效
		--计算特定武功攻击特效
		--计算标主大招特效
		War_WugongHurtLife--计算伤害的敌人
		--计算吸血
		--显示动画
		--计算武功经验与升级
		--计算内力消耗
	end
	local jtl = 0; --计算体力消耗
	local dz = {}; --计算斗转星移
end

于是乎,连击率增加,在jywar中,查找"local LJ"计算连击率那一部分的代码,在下面添加一句。

if HJ_WG(pid, wugong) then
	LJ = LJ + 33
end

再接着,浑然天成,显然是在连击循环中计算,只要放在计算伤害的敌人之前都可以,于是放在计算暴击率之前,查找"local BJ",在之前添加下面一句。

--化境
WAR.HJ = 0
if HJ_WG(pid, wugong) and JLSD(20, 70, pid) then
	WAR.HJ = 1
	if WAR.Person[WAR.CurID]["特效文字4"] ~= nil then
		WAR.Person[WAR.CurID]["特效文字4"] = "至臻化境.浑然天成" .."·".. WAR.Person[WAR.CurID]["特效文字4"]
	else
		WAR.Person[WAR.CurID]["特效文字4"] = "至臻化境.浑然天成";
	end
end

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

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

function War_WugongHurtLife(enemyid, wugong, level, ang, x, y)
	--判定攻击的武功
	--计算护体
	----计算阴、林、山
	----计算特定人物防御特效
	----计算特定内功防御特效
	----计算斗转星移
	--计算伤害
	----计算武器、防具对伤害的影响
	----计算暴击对伤害的影响
	----计算特定人物对伤害的影响
	----计算系数对伤害的影响
	----计算连击对伤害的影响
	----计算难度对伤害的影响
	----计算闪避
	----xxxx
	----yyyy
	JY.Person[eid]["生命"] = JY.Person[eid]["生命"] - hurt --伤害结算
	--复活判定
	--计算杀气
	--计算上毒
	--计算吸血内
	--计算封穴、流血、冰封、灼烧、怒气
	--计算杀敌增加实战
	--结算
end

于是乎,追加杀气可以添加计算杀气中,搜"local spdhurt",于其后添加下面一句。

--化境追加杀气
if WAR.HJ == 1 then
	spdhurt = spdhurt + 300
end

最末,特效文字的显示,在War_ShowFight函数中,添加下面一句。

if HJ_WG(pid, wugong) then
	kfname = kfname .. "·化境"
end

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

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

新人学习中 同时请教 如果我设计个天外飞仙组合 是2个外功在一起触发类似效果 或者是类似易筋经触发罗汉 是主运触发被动 也可以这样设计吗

例如外功和外功 CC.waigong = {

{30, 31},
{31, 30},—是30-31 还是31-30也要加入啊
若果是内功主运和被动
–神照主运和混元被动
CC.内功 = {

{94, 90},—这样子吗

支持下大神smile

这个帖子极具价值
不但是一个很好的DIY教程
更重要的是指出了现有的算法中存在的问题以及改进的方向
非常感谢楼主投入的心血和做出的贡献!

大神的高度。。。

看了就头疼,佩服楼主

多謝版主無私分享

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

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

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

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


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

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

  1.    --判定所使用的武功
    
  2.    --判定是否合击
    
  3.    WAR.ZYHB = 1 --判定是否左右互博
    
  4.    local LJ; --计算连击率
    
  5.    fightnum = xx --连击次数
    
  6.    while WAR.ACT <= fightnum do --连击循环
    
  7.            --初始化一些全局变量
    
  8.            --判定额外连击
    
  9.            local BJ; --计算暴击率
    
  10.            --计算内功加力
    
  11.            --计算特定人物攻击特效
    
  12.            --计算特定武功攻击特效
    
  13.            --计算标主大招特效
    
  14.            War_WugongHurtLife--计算伤害的敌人
    
  15.            --计算吸血
    
  16.            --显示动画
    
  17.            --计算武功经验与升级
    
  18.            --计算内力消耗
    
  19.    end
    
  20.    local jtl = 0; --计算体力消耗
    
  21.    local dz = {}; --计算斗转星移
    

23.end

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

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

  1.    --判定攻击的武功
    
  2.    --计算护体
    
  3.    ----计算阴、林、山
    
  4.    ----计算特定人物防御特效
    
  5.    ----计算特定内功防御特效
    
  6.    ----计算斗转星移
    
  7.    --计算伤害
    
  8.    ----计算武器、防具对伤害的影响
    
  9.    ----计算暴击对伤害的影响
    
  10.    ----计算特定人物对伤害的影响
    
  11.    ----计算系数对伤害的影响
    
  12.    ----计算连击对伤害的影响
    
  13.    ----计算难度对伤害的影响
    
  14.    ----计算闪避
    
  15.    ----xxxx
    
  16.    ----yyyy
    
  17.    JY.Person[eid]["生命"] = JY.Person[eid]["生命"] - hurt --伤害结算
    
  18.    --复活判定
    
  19.    --计算杀气
    
  20.    --计算上毒
    
  21.    --计算吸血内
    
  22.    --计算封穴、流血、冰封、灼烧、怒气
    
  23.    --计算杀敌增加实战
    
  24.    --结算
    

26.end


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