Lost Gate

这个世界实在太无趣了… 既然如此,那就再创造一个世界如何?

战斗系统的构成笔记(中):战斗数值公式、配置的解析还原


客户端演出系统完成后,战斗系统的表皮就算完成了。

但要编写庞大的敌人数据库、遇敌数据、阵形数据等,对个人而言,是一件难以估量的事。

而还原魔力的本身的战斗配置是最好的选择,一方面,可以进一步还原魔力的世界,另外可以节省出时间进行二次创作。

而战斗公式自然也从原版中进行反推。 幸运的是,网络上有许多前辈推算过魔力的公式。不幸的是,存在着大量的纰漏、错误。

在这里感谢小D(数据偏执狂、女装大佬)给我的帮助,提供了世界观测者的核心公式,总算完成了大部分战斗公式,在此分享战斗伤害公式(网上许多资料推算错漏太多):

 

//************ 最终物理伤害 *********
public static double getPhyDamage(CharacterBaseAttr atker, CharacterBaseAttr target, bool cri, bool pvp)
{

//******* step 1 max(1,fix(max(0,[种族修正+属性修正 -1])*中值基础伤害*浮动系数))
//基本伤害
double phyBaseDmg = getBasePhyDmg(atker, target);
//种族修正
double raceFix = getRaceFix(atker, target);
//属性修正
double attrFix = getAttrFix(atker, target);
//浮动系数
double rndFix = getRndFix();

double dmg_base = Math.Max(1d, Math.Max(0d, (raceFix + attrFix – 1)) * phyBaseDmg * rndFix);

//******* step 2 //fix(必杀伤害+单位状态修正*单位优先修正*武器修正*第一轮计算结果)

//必杀伤害
double criDmg = cri ? getCriFix(atker, target) : 0d;
//状态修正
double stoneFix = getStoneStateFix(target);
//单位优先修正
double typeFix = pvp ? 1d : getFighterTypeFix(atker, target);
//武器修正
double weaponFix = getWeaponFix(atker);

//修正后的基础伤害
double dmg_fixed = Math.Floor(criDmg + stoneFix * typeFix * weaponFix * dmg_base);
//******* step 3 最终伤害=多级取整(技能修正*精灵变身修正*武器种类修正*防守状态修正 *第二轮计算结果)

dmg_fixed *= atker.phyDmgFix;

return dmg_fixed;
//第三部整合到技能逻辑里,不在这里运算了。

}

//魔法伤害公式

public static double getMgcDamage(CharacterBaseAttr atker, CharacterBaseAttr target, double[] dmgCfg, int skLv, double atkWin, double atkWater, double atkEarth, double atkFire, bool cri, bool pvp)
{

//最终伤害=floor(其他修正* floor(抗魔修正*单位优先修正*人物属性修正*(种族修正+魔法属性修正)*精神比修正
//*(精神贡献系数+魔攻贡献系数)*设定伤害*0.88*浮动系数))

//种族修正
double raceFix = getRaceFix(atker, target);
//属性修正
double attrFix = getAttrFix(atker, target);
//浮动系数
double rndFix = getMgcRndFix();
//状态修正
double stoneFix = getStoneStateFix(target);
//单位优先修正
double typeFix = pvp ? 1d : getFighterTypeFix(atker, target);
//其他修正
double exFix = 1d;
//设定的基础伤害
double baseDmg = dmgCfg[skLv – 1];

//精神贡献系数 min(80,四舍五入(攻方精神/(msp/80)))/80
double msp = 103d + skLv * 20d;
double sprFix = Math.Min(80d, Math.Round(atker.spr / (msp / 80d))) / 80d;

//魔攻系数 0~0.5

double mgcAtkMin = getMgcAtk_Min(skLv);
double mgcAtkScope = getMgcAtkPlusScope(skLv);
//实际有效值,低于最小魔攻则认为是0
double mgcAtkPlusValue = Math.Max(0, atker.mgcAtk – mgcAtkMin);
double mgcAtkFix = 0.5d * Math.Min(1d, mgcAtkPlusValue / mgcAtkScope);

double damb = mgcBaseDmg_single[skLv – 1];

//精神修正比(暂无)
double sprOverPowerFix = getSprOverPowerFix(atker, target, atker.charType == CharType.Hero);
//魔法属性修正
double mgcAttrFix = getMgcAtkAttrFix(atkWin, atkWater, atkEarth, atkFire, target);

//抗魔修正
double mgcDefFix = getMgcDefFix(skLv, target);

//最终结果

double result = Math.Floor(
exFix * Math.Floor(mgcDefFix * typeFix * attrFix * (raceFix + mgcAttrFix) * sprOverPowerFix * (sprFix + mgcAtkFix) * baseDmg * 0.88d * rndFix)
);
result *= atker.mgcDmgFix;

return result;

//factor 种族、属性、魔法属性综合修正
//factor1 魔攻修正
//factor2 抗魔修正
//factor3 精神比修正
//factor4 战斗修正 穿插在float内 不参与取整 顺位待明确
//dam=fix[fix[factor3*特殊舍入[(min[80,准四舍五入[(Sp1-2)/step]]*dstep]+特殊舍入[damb*factor1])]*factor*factor4*float]*factor2
//必杀伤害
//double criDmg = cri ? getCriFix(atker, target) : 0d;
}

 

有了公式以后,角色的属性计算、成长计算、战斗计算就可以进行了。这样角色就可以通过设定等级、加点即可推算出与原版一致的属性,而不用设定99999之类的测试属性了。

接下来是配置的解析,还是不少的:

 

enemyBase

怪物的基础模版,例如 树精的base就叫树精,但任务中的 xxx的树精,base也是树精。

enemy

怪物表,可以是enemyBase的实例,记录了怪物的等级随机范围,掉落物品,特性(2动,是否boss等)。特别说的是,召唤id居然在这个表,也就是召唤技能施放的时候需要读取enemy身上的召唤数据,感觉挺奇葩的。

group

阵形表,表明该组合每个站位会有哪些怪物登场, 当然这些怪物读取自enemey表

encount

遇敌区域表,在地图中标记遇敌区域,指定遇敌率,以及遇敌后的group

enemyai

敌人的AI表,结构很简单,从上到下,根据概率判断是否执行某个技能。 与当今行为树这类AI相比,简单不少,但应对回合游戏倒是够用了,还很容易配置。

看看这个类结构,我觉得不需要过多解释了……

public class EnemyAI
{
public int id = 0;
//条件
public int[] condition = new int[10];
//目标
public int[] target = new int[10];
//技能
public int[] skill = new int[10];
//概率
public int[] priority = new int[10];

}

enemytalk

敌人的战斗对话表,定义了在各种情况下所BB的内容。 例如:死亡后,  “呼~玩得好累啊”

skill

这是我自行整合的表,原本的配置叫tech,因可读性问题,转义为了unity格式。

含义如它的名字,定义各类技能的基本信息。

 

解析以上表以后,即可在世界地图中真实遇敌,还原原版的敌人。

 

 

Email
57085445@qq.com

讨论群
LostGate同人游戏 184379459
魔力宝贝官方手游群 540221885