Giter Club home page Giter Club logo

freewars's People

Contributors

babygogogo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

mtdesert tst5381

freewars's Issues

AI估值函数需求

要实现AI,就需要实现一系列的估值函数。所谓估值函数是这样的函数,它以当前战场的状况(包括敌我分布,地形,金钱等一切相关信息)为参数,以特定方式计算出一个值(值越高越好),那么其他代码就可以根据这个值来选择最好的走法并指挥部队。
简单起见,估值函数考虑联防、卡位之类的问题,只需要单独考虑自己的每一个单位,即使走位会造成自我卡位也不要紧。不考虑估值函数的自我动态优化(也就是说评分方式确定后,在运行时就不再改变)。技能也暂时不考虑,就当成双方NOP即可。

以我目前仅有的知识来看,针对本游戏,在上述约束下,AI代码的大致运行步骤如下:

  • 找出当前局面最应该行动的单位
  • 针对此单位,计算其所有可到达的位置的待机评分(站位评分)
  • 对于上述每个可达的位置,计算部队除待机外,可执行的指令的评分(指令评分;不考虑站位)
  • 对应的站位评分和指令评分直接相加,就是单位执行某个行动的总得分(行动得分)。一个单位同一时刻通常会有多个可用的行动,AI将选择得分最高的行动加以执行
  • 所有单位行动完毕后,考虑如何建造部队

各个函数直接实际上会有相互影响。比如当前局面最应该行动的部队的选择,就直接受到各个部队可执行的行动的影响。我们固然可以在每次选择前都先把所有部队的所有行动评分计算出来,并直接选出最高的那个行动加以执行,但这可能会导致游戏卡顿,需要实验验证。如果不事先计算行动评分,那么这个最应该行动的单位的选择,可以依据单位的出场顺序、或者事先规定特定兵种的行动优先度来决定。
又比如,站位评分和指令评分直接相加作为行动得分,实际上也可能并不科学,但目前先不考虑这么多。

综上,我目前需要的估值函数就是:

  • 选择最应该行动的部队的函数
  • 站位评分函数
  • 指令评分函数(游戏指令比较多,目前可以只考虑占领和攻击)
  • 建造评分函数

由于我对AI(以及本游戏)没有什么了解,所以很可能会存在比上述办法更好的方案。欢迎各位提出意见,谢谢!

AI概述

FreeWars AI设计概述

前言

设计AI不是一件简单的事情。由于个人能力有限,另外为了降低算法及运算复杂度,我决定让AI只对自己的各个部队单独进行分析,而不考虑互相之间的联防/卡位等问题。

AI的主要功能,实际上就是对部队可用的所有指令都进行评分,并选出最高分的那个指令加以实施。

部队可用的指令多种多样,但我们可以人为地把一个指令分成两个部分,分别是“站位”以及“行动”。举例而言:

  • 步兵移动到一个城市上进行占领,则“站位”就是该城市所在的位置,“行动”就是占领
  • 坦克移动到某个位置并攻击某敌军,则“站位”就是该位置,“行动”就是攻击
  • 自走火炮原地待机,则“站位”就是原地,“行动”就是待机

这样,对“站位”以及“行动”分别进行评分,并将评分直接相加,就是该指令的总分。对于一个部队,AI计算其所有可用指令的得分,并选出最高分的指令,这就是AI所认为的最好的指令。

除了部队指令,AI还需要考虑生产部队、释放技能等问题。这些同样是由评分所决定的,其公式将在后文详述。

另外,AI还需要考虑部队移动顺序,这同样在后文详述。

辅助参数、函数、运算符

辅助参数是在评分中会用到的一些参数,它们可以根据场上形势简单计算得到。

辅助函数、运算符是一些常用的小函数和符号,具体意义见下文。

参数:AI部队价值与玩家部队价值的比值(下称UnitValueRatio)

顾名思义, UnitValueRatio = AI所有部队的总价值(含队友的) / 玩家所有部队的总价值。计算总价时,部队的剩余HP考虑在内。

函数:min() max()

min()用于求出参数中最小的一项;max用于求出参数中最大的一项。

运算符

+-*/:加减乘除

^:幂运算,x^2就是x的平方

部队指令评分

概述

部队指令评分 = 站位评分 + 行动评分

通常情况下,部队会有多个可选的站位,每个站位上可能会有一个或多个的行动可选。比如,对于一个移动力为2的Mech,在地形无阻挡的情况下其可用的站位共有13个,在这些站位上根据地图实际情况又可能会有攻击、占领、待机、合流等行动可用。

为找出某个部队评分最高的指令,AI需要枚举每个站位计算站位评分,对于每个站位又需要枚举每个可用的行动计算行动评分,由此可以得出所有可用指令的评分,然后AI才能选出分数最高的指令并加以执行。

站位评分

站位评分 = 受威胁评分 + 维修补给评分 + 占用有生产力的据点的评分 + 与最近的非我方据点的距离的评分 + 与敌人部队的距离的评分

各项子评分见下文详述。

受威胁评分

此评分用于避免AI把部队无脑送给玩家。

受威胁的评判标准是:是否有玩家部队能够对AI部队造成50点或以上、或者是不足50但足以致死的伤害(考虑运气、HP、弹药、地形、技能、晋升、指挥塔、战局设定等各项加成,下同),不考虑玩家拆盾,不考虑玩家可能进行的维修、补给操作。这个标准会导致一些明显的问题:

  • AI的火箭车等高价的脆弱部队可能会直接暴露在玩家的INF、Bike攻击范围中
  • AI会把任意的盟友部队当成是无敌的盾,即使玩家可以轻易拆掉这个盾并对后面的部队造成威胁
  • 即使玩家只有一个AA,AI的两个或以上的BC也都会同时认为受到威胁
  • 如果玩家有个弹药耗尽的AA停在玩家城市上,AI会认为此AA不能造成威胁,而不考虑它在回合初会得到补给并造成威胁

简单起见,以上所有问题都被AI无视。

具体公式为:

  • 如果部队不受任何威胁,则受威胁评分 = 0;
  • 如果部队受到威胁,则受威胁评分 = -min(50, AI部队实际HP) * (2 + 部队原价 / 1000) / (max(1, UnitValueRatio) ^ 2)

此公式意味着,部队越贵,则受威胁时的评分越低(注意是负数);如果AI的部队总价值比玩家的要高,则评分会上升,意味着AI的部队优势越大,则AI的部队站位越不怕死。

维修补给评分

此评分用于引导AI对受伤及缺少弹药的部队进行回复。

AI只考虑使用据点对部队进行维修补给,不考虑使用Rig。

具体公式为:

  • 如果据点不能维修和补给部队,则评分 = 0
  • 如果能维修,则评分由三个子评分合计得到:
    • 回复HP评分 = (10 - 部队显示的HP) * 15
    • 回复弹药评分 = (部队最大弹药量 - 部队当前弹药量) / 部队最大弹药量 * 55 (若部队无主武器,则此项为0)
    • 回复燃料评分 = (部队最大燃料量 - 部队当前燃料量) / 部队最大燃料量 * 50 * 坠毁加成 (若部队耗尽燃料会坠毁,则加成值取2,否则取1)

此公式意味着,部队当前HP、弹药、燃料越少,则维修补给评分越高。

占用有生产力的据点的评分

此评分用于避免AI无故占用盟友或自己的工厂/机场/海港。

具体公式为:

  • 如果据点不属于盟友和AI自己,则评分 = 0
  • 如果属于,则:
    • 据点是工厂,则评分 = -500
    • 据点是机场,则评分 = -200
    • 据点是海港,则评分 = -150

此公式意味着,AI“很不乐意”占用盟友或自己的工厂,机场和海港次之。

与最近的非我方据点的距离的评分

此评分用于引导AI把部队向中立及玩家据点靠近。

为避免AI被特殊地形挡住而无法到达目的地,所以计算距离需要把地形考虑在内(不考虑玩家或AI部队的阻挡),这意味着计算量较大。为避免计算时间过长,我们人为地限定最大路径长度为max(10, 部队移动力),并枚举这个最大长度之内所有非AI方的据点计算其距离评分,取评分最高的一个作为本项最终评分。

距离评分公式为:

距离评分 = 与据点的距离 * -20 * 据点类型加成 * 据点所属势力加成 * 据点剩余占领点加成

其中:

  • 据点类型加成:当据点是工厂/机场/海港其中一种则取0.5,否则取1。这个设定是为了让AI更愿意靠近这几种据点。
  • 据点所属势力加成:当据点是中立时取0.5,否则取1。这个设定是为了让AI更愿意靠近中立据点,从而使得开局走法更合理。
  • 据点剩余占领点加成:当剩余占领点数为20(即无部队正在占领该据点)时取1,否则取2。这是为了让AI更愿意靠近“空闲”的据点。

由于搜索的路径长度有限,所以存在一种可能性,即搜索范围内一个非AI方的据点都没有。在这种情况下,本项最终评分 = (max(10, 部队移动力) + 1) * (-20 * 2)

与敌人部队的距离的评分

此评分用于引导AI把部队向玩家部队靠近。

由于计算量的限制,本项中的距离直接采用曼哈顿距离,无视地形减速和阻挡。考虑到玩家的部队一般不会站桩,而是也会向AI的部队靠近(而且玩家很自然地会选择正确的路线),所以无视地形计算距离造成的负面影响虽然存在,但勉强可以接受。

为避免玩家用一个部队就把AI的大部队勾引出去,这里的距离采用的是与玩家所有部队的平均距离。

具体公式为:

距离评分 = 与玩家所有部队的平均距离 * -10 (如果玩家一个部队都没有,则评分为0)

行动评分

部队可用的行动种类有很多,比如攻击、占领、待机、合流等等。AI并没有完成对所有行动的评分,没有评分的行动就相当于被禁用了。

以下详述目前已完成的行动评分。

攻击评分

此评分用于引导AI攻击最合适的目标。

AI会预估这次攻击会造成的攻击伤害(考虑了各种加成,包括运气伤害):

攻击伤害 = min(预估能造成的伤害, 目标的实际HP)

AI还会预估这次攻击会被造成的反击伤害(同样考虑各种加成以及运气伤害):

反击伤害 = min(预估会被造成的反击伤害, 自身的实际HP)

攻击评分建立在这两个预估的数值之上。由于存在运气因素,而且预估的运气伤害和实际的运气伤害不一定相同,所以存在AI预计能击破玩家部队但实际上剩余1HP的情况,或者是预计不会被反击致死,实际上却挂了的情况;这也是AI随机性的来源之一。

评分公式:

当目标是陨石时,攻击评分 = min(攻击伤害, 陨石剩余生命值)。

当目标是部队时:攻击评分 = 10 + 攻击伤害评分 + 目标占领加成 + 反击伤害评分

其中:

  • 攻击伤害评分 = 攻击伤害 * (2 + 目标原价 / 1000 + max(0, UnitValueRatio - 1)) + 击破加成(如果能击破则取值30,否则取值为0)
  • 目标占领加成取值方法:
    • 目标并非正在占领据点,则取值为0
    • 目标正在占领据点,且下一回合不能完成占领,则取值为20
    • 目标正在占领据点,且下回合能够完成,则取值为200
    • 若目标正在占领的是HQ/工厂/机场/海港,则取值额外增加99999
  • 反击伤害评分 = 反击伤害 * (2 + 自身原价 / 1000) + 被击破加成(如果会被反击击破则取值-20,否则取值为0)

这公式意味着,攻击伤害、目标价值、AI部队优势越大,评分越高;反击伤害、自身价值越大(反击伤害不为0时),评分越低。

(未完待续……欢迎留言评论,不必担心断楼)

技能系统改进的一点讨论

距离 freewar 的诞生已经有几个月,而系列首作的 babywar 也有一年多的历程。从 baby 开发该项目以来,接触本游戏的人最为直观的印象(除了画风)应该就是技能系统了。技能系统从最初的概念开始经历无数磨难,再到 freewar 的新理念,可以说是相当的曲折和艰辛。
在 baby 即将就职之际,作为给 baby 本人的入职礼物,我冒昧的于此给本游戏提供一次改革性建议。这份 issue 可以说是本人长时间不断改进不断贴合现有 babywar 和 freewar 的思维产物,当然也很私利的夹杂了我个人对 AW 系列完美形态的一种理想。
以下,我将从现有状况分析开始,一步步带出我对技能系统的新设想。

一、现状分析
现条件下的 freewar 技能系统可以说已经相当完善了。如果采用之前提到过的「主动技系统改造方案」,确实十分美观。
不过我这里认为 dor 大背景下,不管现有的还是「主动技改造方案」中的技能系都统仍然存在一些问题。
(1)日常技能偏强
这里所说的偏强是指预期的强度。也就是系统允许玩家获得的日常技能随着战局的发展容易产生超出规格的强度。其实对于日常强度来说,很多人是会把老三代的评判标准与 dor 混淆的。但是因为公式、地形、单位等等的不同,两者对于日常能力的评判标准大相径庭。就拿最为常见的攻防增幅技能来说,其增幅数值的大小造成的强度提升跟老三代完全不同(具体可以参考我之前的一个破阵效率分析表)。这里我也不得不承认,我的 AWAU 采用 dor 公式后依然照搬老三代的 CO 技能实际上非常不合理,只不过由于是 PVE 游戏,所以这个不合理在 AWAU 中并没体现得特别明显。而作为 PVP 游戏(虽然曾经宣称是 PVP 而如今大多数人变成了虐 AI ……)的 freewar 在今后实战 PVP 增多以后,我相信这个日常偏强的瑕疵会暴露无遗。
从 dor 的原作来看,我个人觉得 dor 对于日常的强调在淡化。整个 dor 考验的都是玩家用平等日常强度的单位对抗敌人的能力。虽然有人会认为 dor 的指挥官范围是一个小范围巨大增幅的日常,不过个人认为 dor 指挥官范围属于一种小 power,这个小 power 再加上释放全屏特技这个大 power,形成了考验玩家 power 掌控能力的特技系统。综合本段内容,我认为在 dor 背景下的技能系统,应该是一个 日常些微增幅,特技(主动技)是主要亮点的技能系统。
(2)技能的超高自由度
自由度高其实算不上瑕疵,不过姑且先说问题。不管第(1)条怎么阐述,日常偏强可以通过各种限制来控制。可选技能多则带来了三个方面的小问题。
1)强度不稳定
技能的价格是恒定的,但是技能并非单独存在,有些技能搭配可以诞生 bug 级别的组合。这个问题在 babywar 的开发初期也出现过,不过也因为屠刀改进法不了了之了……
2)风格的不统一
原作的 CO 系统虽然捆绑技能比较死板,倒也是每个 CO 自成一派,存在「风格」这种东西。当前的 freewar 自由度高,变化多样,却少了一点点微小的美感。那就是主动技与日常的联系度、主动技各个组成部分之间的关联度等等关联性的东西。某种程度上说,这也是防守方无法应对布阵的一个根源性原因之一。
3)选择困难
也并非真的选择困难。将日常和主动技放到一个盘子里,用相同的货币去购买,还是过于一锅端了。虽然通过反复调整价格可以实现预期效果,不过过程技术难度大,确定最佳定价并非易事。日常和主动技还是需要一定区分的,当然,这是一条算不上瑕疵的瑕疵。
(3)平衡与规范化调整措施的补丁痕迹明显
这一条挺难阐述的。简单点说的话,就是当前的各种机制、系统等等是由曾经最初的设想进化而来,而各种调整和规则变化的过程中,对于规范游戏和平衡游戏的目的性太强,使得过程中我们做出的调整看起来很刻意。所以系统和规则的各种要素嵌合度还不够。

二、需求和目标
经过以上的分析,我认为技能系统的改进方向应该满足这么几个需求。
(1)保证自由度。(这个是这个本游戏和开发者的初衷,所以放在首位)
(2)日常技能「调味剂」化,提升主动技的地位。
(3)在第(1)条的基础上给出框架限制,通过合理的自由度削减从而控制技能在不同条件下的强度波动。
(4)在第(3)条的基础上强调第二次自由度,也就是就算给出了限制因素,也并非关闭了大门,只不过有代价的增加,或者说沿着框架走回有一定收益。
(5)日常与主动技的价格系统做一定隔离。这个隔离并不一定要让日常和主动技产生两种货币,可以做有技巧性的软隔离。
(6)整个新改进的系统自称一体,特征明显,能够让这个游戏拥有它自己的灵魂。(这个要求太空太泛太难,估计我之后提出的方案也没有实现这一条)
(7)改进的新技能系统与目前的系统比较贴合,而且从程序上也要有较好的实现度。

三、对策给定
遵照第 二 大点的需求和原则,在此允许我阐述一下我对技能系统的一个设想。虽然不认为会被多少朋友接受,但是我认为提出来提供一种思路也是不错的。

1、概念与框架
新技能系统的概念源自现有的系统。从原版的 CO 技能系统,到 babywar 的定制技能系统,再到现在 freewar 的动态技能系统,(上面几个级技能系统命名都是我瞎编的,反正就那个意思=。=)这个技能系统的创新是十分值得肯定的。当 yyCO 和 hack 时候的自创 CO 成为了常事,玩家们甚至开发者们都慢慢觉得 CO 这个设定已经定型了。直到 babywar 出现,才终于打破了长达十年之久的固定思维。而在 freewar 中 baby 再一次解除了技能在开场前就确定这一固定思维,开创了在战斗过程中形成玩家技能的这一系统。
作为本次提供的新思路,从概念上保留了当前 freewar 技能系统优秀的部分,主要有以下几点:
(1)玩家以「白板」(即无日常和主动技)的状态开始游戏,在一局游戏的进行过程中逐渐让自己的技能成型。
(2)技能的获得和发动来自战斗中的能量累积,和 freewar 中一样,能量是技能的货币。
(3)采用「主动技系统改造方案」中提到的设定变更技能的机制,不过应用在其他方面。
(4)最为重要的一点,对玩家研发技能给出一定程度的限制措施。同时一定程度上鼓励玩家采取较为系统和风格化的技能构成。又在此基础之上提供给玩家「系统和风格化的高性价比技能配置」和「非系统和风格化但多变灵活的技能配置」两种选择。
综合以上概念,便形成了之后具体的一个思路。

2、具体思路
(1)技能集
秉着最低限度限制玩家技能配置的原则,将所有技能(包括日常和主动技)划分为几个大类(目前的设想是4个)。每个大类的技能都拥有较为共同的特征,将每一类成为技能集。玩家在游戏开始前需要选择一个技能集,并在游戏中只能使用这个技能集中的技能,也就是说以技能集限定玩家在本局游戏中的一个总体风格。但是技能集中的技能是很多的,所以无需担心限制过大变为以前那种 CO 系统。

(2)日常技与日常技能槽
日常技的设定变更较大。存在如下机制:
1)日常效果淡化
日常技能效果大幅度削弱,进而将主要戏份让给主动技。以其中一个名为「FIGHTER」的技能集中对近战机械加成的技能来说,日常玩家能够达成的最高近战机械攻击加成为 10%,相对于原作的 max 仅仅只有一半。
2)日常多样化机制保留
依然保留 freewar 中对玩家开发日常技能的自由度。也就是说玩家仍然可以多方面地研发不同类型的日常技能,只不过必须是一个技能集中的日常技能。不过,一个技能只能研发一次,不能重复研发。当然,为了让玩家有机会在一个方向不断延伸,设定了第 3)条机制
3)树状日常技能体系
这是一个算不上限制机制的一种限制。这个体系的规则是:一项日常技能更大幅度的提升必须建立在完成了这项日常技能前一步的提升基础上。结合第 2)条举个例子,在「FHGHTER」这个技能集中存在强化近战机械攻击力的日常技能,近战机械的攻击增加分为 Lv1 和 Lv2,只有在研发了 Lv1 以后才能继续研发 Lv2,最终近战机械的日常攻击力增幅是已经研发的 Lv1 和 Lv2 所提供增幅的总和。简单来说,就是一种简单的技能树。
4)负面技能引入技能树
为了平衡技能强度,而引入一部分负面日常效果,作为开启新技能的条件。仍然应用 3)中的例子,在近战机械的攻击增加 Lv1 和 Lv2技能之前,加入远程攻击减益。这样,简单而完整的一个日常技能线条为:远程攻击降低 Lv1 → 近战机械攻击增加 Lv1 → 远程攻击降低 Lv2 → 近战机械攻击增加 Lv2
5)日常技能槽
这是本设计系统中较为重要的参数。类似于 babywar 中的技能槽。每一个技能对应一个技能槽占用量,当技能槽满了以后,玩家便不能继续研发新的日常技能了。
6)日常技能的研发
日常技能的研发不消耗能量。这是相对于现有 freewar 技能系统最大的改变。玩家在自己首个回合开始或一个日常技能研发完成后的自己回合中可以选择自己要研发的下一个日常技能。选定以后,随着游戏的开展,技能研发的进度会增长。至于增长机制,我还没有想好。这里提供几个思路:①随着战斗的进行,战斗中积累的能量等量纳入研发进度(但是这个不消耗能量) ②研发进度随着回合数量增长 ③研发进度随着资金的增加或者使用进行增长。当研发进度满后,不论处于谁的回合,这个日常立即生效。日常技能生效前,对与敌人是不可见的。
7)日常技能的取消
因为日常技能槽的限制,允许玩家变更日常技能。步骤就是现取消目前已经研发的某技能。然后选择新的其他日常技能研发。这个取消机制暂时还没有完全确定,取消是否消耗资源、是否可以同时取消多个都没有确定。

(3)主动技
主动技作为这个技能系统的关键,设定如下机制:
1)能量
主动技的发动消耗能量,能量消耗随着发动次数逐渐增加,这个和现有技能系统差别不大。
2)树状主动技体系
和日常技能类似,主动技也存在一个方向技能的不同等级。有类似启动 Lv2 必须先启动 Lv1 的限定。玩家可以从最初没有前提条件的主动技开始,在能量足够的情况下一路点选进阶主动技(过程中存在分支,但是不限制分支量,也就是可以所有分支都去点),选择完成后所有点选的主动技在本回合打包立即全部发动。
3)路线限定
但是有一个限制条件,玩家选择了源头的第一个主动技以后,本次主动技发动就只能沿着这个主动技向下点选进阶主动技,而无法跳跃到其他路线。不过并不影响玩家下一次选择其他路线,也就是实现了主动技的自由定制。比如我可以这回合发动打包效果为「近战机械攻+20」的主动技,下次可以发动同是一条路线上的打包效果为「近战机械攻+30,移动+1」的主动技,甚至可以下次发动另一条路线上打包效果为「全军攻+50」的主动技。
4)日常联动优惠
由于日常采用「近战机械攻击增加」,对手肯定容易预见你会在主动技中选择同样加成的「近战机械攻击增加」主动技,所以增加一个日常联动的优惠政策。再次举例,比如在日常研发了「近战机械攻击增加 Lv1」,则主动技的「近战机械攻击增加 Lv3~Lv5」对能量的消耗将会有所降低。这样实现了对玩家采用系统风格化特技配置的鼓励,也能够让玩家选择突发性杀伤力强的非对应日常的其他路线主动技。
5)极限主动技的日常限定
这个是在 4)的基础上更进一步。举例:当主动技路线「近战机械攻击增加」达到 Lv8 以上的更高等级时,由于该加成威力十分巨大能够秒杀满血同单位,也是原作中超出规格的巨大加成,就需要玩家研发过日常技的「近战机械攻击增加 Lv2」作为大威力主动技的限制条件。

(4)日常技和主动技参数分析
以上,全部的新技能系统思路就已经解明了。这里将技能所需要的一些参数进行罗列
1)日常技
①技能代码(用于编程方面的识别)②技能类型(日常还是主动)③技能名称(包含了名称和等级)④前置技能⑤研发成本(研发所需能量或时间等)⑥对技能槽的占用量⑦研发后受到联动优惠的主动技代码和优惠幅度
2)主动技
①技能代码(用于编程方面的识别)②技能类型(日常还是主动)③技能名称(包含了名称和等级)④前置技能(仅前置技能已点选才能点选该技能,源头主动技无前置,但当其他源头已点选,该源头无法点选)⑤所需能量⑥是否受联动优惠及优惠幅度

(5)技能集分类
这里给出目前对技能集的设想
1)「FIGHTER 战士」对全军或大量主要兵种以及主要战场的战斗力进行强化,专注于正面对抗能力,最为传统和常规但是强力稳健。如:近战强化、陆军强化、全军强化等
2)「RANGER 游骑兵」以较为特殊的能力,同时为正面和侧面作战提供强化加成,并具备使用非常规战术的资质。如:远程强化、地形攻防、移动增加。天气操控等
3)「SPECIAL 特勤」致力于对少量或战力较弱单位进行专精,通过较长的树枝延伸获得所有技能树种类中最大幅度的强化,实现用以点带面的方式影响战局。如:步兵系强化、空军强化、海军强化、单一兵种强化等
4)「ENGINEER 工程师」放弃了对单位的直接可见的强化,转而拥有辅助类或Debuff类以及AOE等非常规手段操纵战局。如:HP加减、维修、金钱类、幸运类等

四、总结
这是一个实现难度(编程上)和现有技能系统比稍微偏难一些的系统。另外理解起来也会有点困难。
我个人认为这是一个十分好的系统,希望各位能够采纳并多多讨论。

Single Mode 评分公式

纵观AW老三代和DoR,评分系统始终保持三个维度。即:速度(Speed),力量(Power),技术(Technique)。其中:

  • 速度反应玩家的通关速度,是对攻略总效率的评判;
  • 力量反应玩家的攻击猛烈程度,是对攻击有效性的评判;
  • 技术反应玩家的总体把控能力,是对单位利用率的评判;

DoR中采用的参数相较于老三代有较大变化,也更加合理。参考之后给出如下150分制评分公式:

  1. 速度(Speed)
    速度分的评判参数是R=「实际通关天数/目标天数」,其中目标天数默认为15天,可以人工设定;
    计算公式为:
    (1)当R≤1时:速度分 = min(200 - R * 100,150)
    (2)当R≥1时:速度分 = max(150 - R * 50,0)
    为了直观体现分数曲线,把分数上限和下限剥离,得到分数关于R的函数图像如下:
    image

  2. 力量(Power)
    力量分的评判参数是R=「平均伤害值+平均击杀率」,该两个数值均为0-100之间的自然数;
    计算公式为:
    (1)当R≤100时:力量分=max(R * 2 - 100,0)
    (2)当R≥100时:力量分=min(R,150)

当前游戏版本中:

  • 平均伤害值 = floor(玩家主动攻击的总伤害 / 玩家主动攻击总次数)
  • 平均击杀率 = floor(玩家主动攻击造成的击杀数 / 玩家主动攻击总次数)

其中:

  • floor()是向下取整的函数
  • 主动攻击总次数不包含攻击地图特殊物体的次数
  • 主动攻击总伤害包含了幸运伤害以及溢出伤害,不包含攻击地图特殊物体的伤害
  • 主动攻击造成的击杀数不包含击破地图特殊物体的次数,不包含被装载的AI部队(即,如果玩家击杀了AI的一个装有两个部队的Lander,击杀数只加一而不加三)
  • 平均伤害值有可能超过100,所以取值区间为非负整数

为了直观体现分数曲线,把分数上限和下限剥离,得到分数关于R的函数图像如下:
image

  1. 技术(Technique)
    技术分的评判参数是R=「sqrt(敌总单位价值)/[sqrt(我总单位价值)+sqrt(我损失单位价值)]」
    计算公式为:
    (1)当R≤0.8时:技术分=max(R * 125,0)
    (2)当R≥0.8时:技术分=min(R * 62.5+50,150)

当前游戏版本中:

  • 敌总单位价值 = AI预部署单位价值 + AI生产单位价值
    • 不考虑刷血、维修
  • 我总单位价值 = 玩家预部署单位价值 + 玩家生产单位价值
    • 不考虑刷血、维修
  • 我损失单位价值 = 部队发生战斗时(不论主动或被动)产生的损失 + 玩家自行删除单位产生的损失 + 燃料耗尽自爆产生的损失
    • 各项损失均把装载了的部队价值计算在内
    • 不考虑刷血、导弹轰炸

为了直观体现分数曲线,把分数上限和下限剥离,得到分数关于R的函数图像如下
image

高级设定:
速度分已给出高级设定。
力量分分为三个点,0分点,100分点和150分点。0和100分点,100分与150分点之间线性变化。默认的0分点、100分点、150分点的R值为:50,100,150
技术分分为三个点,0分点,100分点和150分点。0和100分点,100分与150分点之间线性变化。默认的0分点、100分点、150分点的R值为:0,0.8,1.6

主动技系统的改造方案

当前,游戏中的主动技系统可以概述为以下两点:

  • 玩家需要提前一回合支付一定能量,发出“主动技宣言”,也就是告诉对手,自己下回合可能会发动主动技
  • 进入下回合后,玩家既可以不发动主动技,也可以任意发动任何技能

这个系统导致了一个问题:若宣言方持有大量能量,则由于可以任意发动技能,防守方将面临无法布阵的窘境。为了解决这个问题,八云提出了一套新的方案,我稍作一些调整并在此作出描述。

新方案的概述:
每个玩家都有且只有一套主动技。这套主动技可以在游戏中免费动态改变,但这个过程需要一回合时间。只要能量足够,玩家随时可以消耗相应能量来激活这套主动技,不需要提前宣言或支付额外费用。
要快速理解这个方案,可以想象为:本方案就类似于AW1,不同点在于玩家的主动技可变,比如这回合可以是Andy的维修技能,下回合可以是Sami的完美占领技能,等等。

详细描述如下:

  • 玩家以白板的状态进入战局
  • 玩家有且只有两套主动技的配置,分别称为“实装配置”和“预备配置”,对于这两套配置:
    • 包含的技能种类、数量、强度都没有限制
    • 激活配置所需的能量由系统自动计算,不设上限,且仅在激活实装配置(也就是发动主动技)时才需要支付
  • 战局中所有玩家都能随时看到对手的两套配置的具体内容
  • 进入战局后,玩家每回合都可以为自己设定预备配置,此过程不需要支付能量
  • 玩家的每个回合初,若预备配置不为空,则实装配置将自动被预备配置替换掉,预备配置将被清空;除此途径之外,玩家无法改动实装配置
  • 玩家每回合都可以消耗能量激活实装配置,但一回合只能激活一次,而且配置里的所有技能效果是一次性全部激活(也就是说,无法通过多个再动技能实现一回合三动)
  • 激活实装配置只需要支付该配置本身的能量消耗,不需要额外付出能量,不需要提前宣言
  • 激活实装配置后,其效果立刻生效,直至玩家下个回合初失效
  • 激活期间,玩家无法再通过战斗获得能量

注意,以上条款意味着,玩家如果想激活一套不同于当前实装配置的主动技,则必须首先设定预备配置,等到下回合初系统自动把实装配置更新后才行。由于预备配置对对手可见,所以这就避免了现有机制下,玩家任意发动技能导致防守方无法布阵的窘境。

本方案与八云提出的方案略有不同,主要在于八云认为同一回合内玩家不能同时激活实装配置和更新预备配置,而我个人觉得应该可以允许玩家这么做。再次感谢八云!

最后,我个人认为这套方案相当漂亮,既和原作系统接近,又保留了高自由度的特色(而且应该不至于破坏游戏性)。如果能获得大家的同意,则这应该就是FreeWars在游戏系统上的最终定案。
欢迎各位留言提问和提意见,谢谢!

如何自行导入PVE地图及设定地图高级选项

本文包含三部分内容,分别是:

  • 绘图时的注意事项
  • 如何把地图导入游戏并进行本机测试
  • 如何为地图设定高级选项

绘图时的注意事项

由于AI智商有限,为了保证PVE地图的游玩体验,请您在绘图时注意以下几点:

  1. AI不懂如何使用运输系,因此请避免AI势力需要使用运输系的场合
  2. AI不懂生产舰载机,因此航母对于AI而言基本没有作用
  3. 避免路口过窄的图,这种图容易导致AI造出一大堆没有作用的单位,而且进攻无力
  4. 目前,AI一定不会主动生产这些部队:Flare,Missiles,Rig,Transport Copter,Seaplane,Lander,Carrier
  5. 强烈建议您测试过地图再发布,详细方法见下文

如何把地图导入游戏并进行本机测试

为了保证游玩体验,强烈建议您在完成绘图后,自行导入游戏并试玩几次,并进一步优化地图。
假设您的游戏目录在E:\FreeWars,那么导入方法如下:

  1. 在Tiled软件里绘图完成后,通过Files->Export As ... 功能,导出一个lua文件,将其改名为PVE_YiDongYuJinGong.lua
  2. 把该文件复制到E:\FreeWars\res\data\templateWarField 目录,替换掉同名文件
  3. 用文本编辑器(如notepad)打开该文件,在第二行插入以下代码并保存:
  warFieldName = "地图名称", -- 可以改为地图的名称(需要保留引号),也可以不改
  authorName   = "作者名称", -- 可以改为您的称号(需要保留引号),也可以不改
  playersCount = 2, -- 如果地图势力数不是2,需要把2改成相应数字

插入完成后,该文件最前面的几行开始将类似于以下形式:

return {
  warFieldName = "猛 虎 出 山", -- 可以改为地图的名称(需要保留引号),也可以不改
  authorName   = "RushFTK", -- 可以改为您的称号(需要保留引号),也可以不改
  playersCount = 2, -- 如果地图势力数不是2,需要把2改成相应数字
  version = "1.1",
  ...(以下省略)

之后,您就可以打开游戏,并在“单机模式-战役”中看到您的地图并开始测试。


如何为地图设定高级选项

这里假设您已经懂得如何导入地图到游戏中了。
假设地图lua文件是PVE_YiDongYuJinGong.lua,要设定高级选项,您需要:

  1. 用文本编辑器打开该文件
  2. 找到
  playersCount = 2,

这行代码(如果您遵循上面的导入步骤,则这行代码会在第四行),并在其下一行插入以下代码:

  advancedSettings = {
    attackModifier            = 0,     -- 全局攻击力加成(百分比):0=无加成(默认),-30=原作沙尘暴效果。可用范围:-100 ~ 无穷大
    energyGainModifier        = 100,   -- 全局能量获取速度倍率(百分比):100=默认速率(默认),0=无法获得能量,200=两倍获取速度。可用范围:0 ~ 无穷大
    incomeModifier            = 100,   -- 全局收入倍率(百分比):100=1000收入(默认),0=无收入,200=两倍(即2000)收入。可用范围:0 ~ 无穷大
    isActiveSkillEnabled      = true,  -- 是否启用主动技(布尔值):true=是(默认),false=否。
    isFogOfWarByDefault       = false, -- 是否雾战(布尔值):true=是,false=否(默认)。
    isPassiveSkillEnabled     = true,  -- 是否启用日常技(布尔值):true=是(默认),false=否。
    isSkillDeclarationEnabled = true,  -- 是否启用主动技宣言(布尔值):true=是(默认),false=否。
    playerIndex               = 1,     -- 玩家行动顺序(正整数):1=红方(默认),2=蓝,3=黄,4=黑。可用范围:1 ~ 地图玩家总数
    moveRangeModifier         = 0,     -- 全局部队移动力加成(整数):0=无加成(默认),-1=全部减一,1=全部+1。可用范围:任意整数(无论如何,部队最低移动力为1)
    startingEnergy            = 0,     -- 全局初始能量值(整数):0=0(默认)。可用范围:0 ~ 无穷大
    startingFund              = 0,     -- 全局初始资金(整数):0=0(默认)。可用范围:0 ~ 无穷大
    visionModifier            = 0,     -- 全局建筑及部队视野加成(整数):0=无加成(默认),-1=全部减一,1=全部+1。中立建筑(火焰)不受影响。可用范围:任意整数(无论如何,建筑和部队最低视野为1)

    targetTurnsCount          = 5,     -- 速度100分目标天数
  },
  1. 之后,您就可以随意开脑洞了。比如,如果您希望玩家使用黄色势力,只需把
playerIndex = 1,

改成

playerIndex = 3,

(切记必须保留逗号)即可。您可以根据提示修改其他选项,以达到您想要的效果。
4. 完成后,强烈建议您进入游戏测试几次,确保地图游玩体验符合您的意图。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.