SDL中文论坛

标题: 兵种能力(Abilities) [打印本页]

作者: ancientcc    时间: 2020-11-29 10:48
标题: 兵种能力(Abilities)


如何定义[abilities]块
一个[abilities]块大致可分为三个部分;说明、条件、操作。让结合“治疗+16”进一步说明。
  1. #define ABILITY_HEALS16
  2.     [heals]
  3.         value=16
  4.         id=heals16
  5.         name= _ "heals +16"
  6.         female_name= _ "female^heals +16"
  7.         description= _ "Heals +16:
  8. This unit combines herbal remedies with magic to heal units more quickly than is normally possible on the battlefield.

  9. A unit cared for by this healer may heal up to 8 HP per turn, or stop poison from taking effect for that turn.
  10. A poisoned unit cannot be cured of its poison by a healer, and must seek the care of a village or a unit that can cure."
  11.         affect_self=no
  12.         poison=slowed
  13.         [affect_adjacent]
  14.             adjacent=n,ne,se,s,sw,nw
  15.         [/affect_adjacent]
  16.     [/heals]
  17. #enddef
复制代码

对能力中的三要素,说明没什么好补充的,以下详细叙述“条件”、“操作”。

要素之条件
在描述条件前让先看下能力释放逻辑。释放逻辑指的是能力是怎么被释放的。对能力拥有者来说,释放能力是个被动过程,即拥有技持单位是“等”着被询问是否有该项持能,如果有就释放。以下是通用释放逻辑。

治疗能力。程序运行到新回合开始时要进入治疗阶段,程序挑出一个可治疗单位(HP未满),针对该单位从自已所在位置到六个相邻位置依次询问是否有相关单位拥有治疗能力,如果有,把该操作加入操作集。形成的操作集不为空时,从集合中选出个最好治疗操作(像增加的HP最大),执行该操作。此时可治疗单位称被能力单位。

领导持能。当部队要攻击时,针对正要实施的攻击单位从自已所在位置到六个相邻位置询问是否有相关单位拥有领导能力,如果有,把该操作加入操作集。形成的操作集不为空时,从集合中选出个最好领导操作(像增加的攻击力最大)。此时攻击单位称被能力单位。

此种逻辑下,拥用能力单位是被动方,当要判断是否可释放条件时,被能力单位反而成了“中心”单位。条件包括两种:位置条件、被能力单位的特殊要求。

条件I:位置条件
被能力单位和拥有能力单位必须满足一定位置条件才发动能力。

能力可能影响自已,可能影响相邻单位。但最多影响相邻单位,无法影响相邻以外的单位,像隔一格的。
affect_self指示该能力是否影响自已。yes时影响,否则不影响。默认影响。
affect_adjacent块指示该持能影响哪些相邻单位。由于最多影响相邻位置,于是可出现“n”、“ne”、“se”、“s”、“sw”、“nw”中一个或多个。
在任一时刻,能力是否能释放依赖被能力单位的当前位置,affect_self、affect_adjacent等于设定了位置条件。

对“治疗+16”来说,被能力单位和拥有能力单位必须满足相邻关系;而对“自疗+16”来说,被能力单位和拥有能力单位必须是同一个单位。

条件II:被能力单位的特殊要求
“领导”能力能强化等级低的单位的攻击力,也就是说被能力单位(“中心”单位)的等级必须低于拥有能力单位等级。这个低于关系就是对被能力单位的特殊要求。
  1. #define ABILITY_LEADERSHIP_LEVEL_1
  2.     # Canned definition of the Leadership (level 1) ability to be included in an
  3.     # [abilities] clause.
  4.     [leadership]
  5.         id=leadership1
  6.         value=10
  7.         cumulative=no
  8.         name= _ "leadership"
  9.         female_name= _ "female^leadership"
  10.         description= _ "Leadership:
  11. This unit can lead our own units that are next to it, making them fight better.

  12. Adjacent own units of lower level will do more damage in battle. When a unit adjacent to, of a lower level than, and on the same side as a unit with Leadership engages in combat, its attacks do 25% more damage times the difference in their levels."
  13.         affect_self=no
  14.         [affect_adjacent]
  15.             adjacent=n,ne,se,s,sw,nw
  16.             [filter]
  17.                 level=0
  18.             [/filter]
  19.         [/affect_adjacent]
  20.     [/leadership]
  21. #enddef
复制代码
[affect_adjacent]块中的[filter]块就用于描述这个特珠要求,它是一个标准单位过滤器。相应的,[leadership]根下(如果存在)的[filter_self]就用于描述自已既是被能力又是拥有能力单位时的特殊要求。

能力条件中没对拥有者有特殊要求。拥有者只要同时满足拥有该能力和位置条件就行了。
作者: ancientcc    时间: 2020-11-29 10:50
要素之操作
操作集表示格式
在C/C++程序内,操作集表示格式是unit_ability_list,更具体说是std::vector<std::pair<const config *, unit *> >。
(, 下载次数: 5396)


通用操作和私有操作
能力操作分通用操作和私有操作。

对“治疗+16”能力来说,它有两个操作:“value=16”指示对被能力单位增加16HP;“poison=slowed”指示如果被能力单位正处于中毒状态时,则此回合不降HP。对于后者,它是[heals](“治疗+16”是[heals]一个实例)特有的,而对前者(value字段)则是通用的。

要理解为什么说“value=16”是通用,让看“一级领导”(ABILITY_LEADERSHIP_LEVEL_1)能力。该能力也有个“value”字段,即“value=10”,它给等级0单位增加“10”攻击力。

“治疗+16”、“一级领导”,它们的“value”字段意义不一样,一个增加HP,一个增加攻击力,但它们在MOD中采用同一种表示法,它们是能力中的通作操作。当然,通用操作表现出的一致不仅仅是同一表示法,还有施加它们之上的运算。继续以上的有5种[heals]的治疗例子,[0]、[2]、[4]项[heals]都有加HP功能,他们分散在三个单位,增加HP不能累加,于是系统就要在这三个[heals]中选择加HP最大的那个,[0]增加20HP,它最大,于是最后会选它。相应的对领导能力,要是一个要被能力单位旁边站着两个单位,一个有“一级领导”能力,一个有“二级领导”能力,这时系统就要选中能加强攻击力更多的,即拥有“二级领导”的那个单位。以代码来看,这两个操作都是选择最大value值操作,除去这种操作,通用操作还支持更多运算,像加法,乘法。

cumulative意义不是累加,而是指示是否考虑基本值(基本值的默认值是0。对基本值非零例子,参考坚定能力,坚定能力基本值是单位常态下抗性)。true时考虑基本值,并取基本值和value之中最大值;false时不考虑基本值,直接取value值。如果不存在value字段,则会忽略cumulative字段。

效果(运算)集表示格式
效果集是基于操作集上得出的集合,用它就可计算出最后需要的值。在C/C++程序内,效果集表示格式是std::vector<unit_abilities::individual_effect>。由于效果集中的元素会作为最终运算中的操作数,有时把效果集称作运算集。
(, 下载次数: 5428)





欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/) Powered by Discuz! X3.3