SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 5913|回复: 0
打印 上一主题 下一主题

[MOD] [terrain_type]

[复制链接]

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
跳转到指定楼层
楼主
发表于 2020-11-29 10:47:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[terrain_type]用于在WML中描述地形,一般出现在terrain.cfg。

以下是描述“灰色深水”地形的[terrain_type]。
  1. [terrain_type]
  2.         symbol_image=water/ocean-grey-tile
  3.         id=deep_water_gray
  4.         editor_name=_"Gray Deep Water"
  5.         string=Wog
  6.         aliasof=Wo
  7.         submerge=0.1
  8.         editor_group=Water
  9. [/terrain_type]
复制代码
  • symbol_image:在minmap中描述该地形的图像。
  • editor_image:在地图编辑器中描述该地形的图像。如果没有定义该字段,使用symbol_image。
  • id:一个不可翻译字符串,用于标识该地形。它用于WML中的某些部队属性字段值,例如[movetype](但参看底下的aliasof=属性,在movetypes并不需要例出所有id)。
  • name:地形名。一个可翻译字符串,用于在游戏和地图编辑器中命名该地形。
  • editor_name:只用于地图编辑器中,用于更详细命名该地形。一旦使用该属性后,地形以着这样的格式被命名:“<editor_name>/<name>(<aliases>)。”
  • string:在地图和剧本中表示该地形。
  • submerge:介于0和1之间的浮点数,指示在该地形时多少部队的单位图像要被淹没。
  • aliasof:以逗号分隔的字符串,用于表示它属于哪(些)类地形。这是一个字符列表,但字符“+”、“-”有特别意义。一开始,C/C++从左到右试图取最优值,当碰到“-”时,改试图取最坏值,碰到“+”又改为取最优值(在“+”、“-”后需要放逗号,要放一个字符“+”号则需要双引用)。操作符具有传染性,即它会影响之后所有地形,除非再次遇到一个操作符。
  • def_alias:类似aliasof。但只是用于重载计算防御指数。
  • mvt_alias:类似aliasof。但只是用于重载计算移动点数。
  • editor_group:逗号分的编辑组名id,用于指数该地形属于那些组。
  • hidden(boolean):如果置为“yes”,该地图不会出现在地图编辑器的可选地形中。也就意味着该地形也不会出现在关卡地图。hidden=yes地形往往是类别地形。

从字面上看,id、string都是用于标识该地形,为什么要有两个,它们各是什么意义?
id、string都是不可翻译字符串。“string”指示地形标识,C/C++用它形成t_terrain地形值,在各种地形中它是唯一的。可以看到,“string”值是类似“Wog”,“Ft”,“^Fds”这类字符串,它不易记,id就是为弥补这个不足而引入的,为在编写MOD可以较容易引用该地形,因而称为地形易记名。id是类似“road”,“deep_water”这些易记字符串,它用于MOD中的像[defend]、[movement_costs]块。id容许重复,当然能不重复更好。

在深入叙述[terrain_type]前让看一个问题。地形由基本层和覆盖层组成,但[defense]块只定义了或基本层、或覆盖层、一层的值,那么当格子地形同时存在基本层、覆盖层时,它的防御指数是如何计算的?
  1. class unit
  2. {
  3.         ......
  4.         defense_cache defense_mods_;
  5.         ......
  6. };
复制代码
defense_mods_:用于缓存单位在各地形的防御力。它的key是地形,不是格子。

class terrain_type:C/C++中地形类型对象。对应WML中的[terrain_type]块。

underlying
[0](0x47740000, 0xfffffffff)(Gt,
[1](0x2b000000, 0xfffffffff)(+,
[2](0x46740000, 0xfffffffff)(Ft,

gamemap主要数据结构tcodeToTerrain_是如何形成的?
1、WML中的每个[terrain_type]形成一项<t_terrain, terrain_type>。t_terrain来自[terrain_type]中的string字段。
2、地图中每个格子上地形。如果第一步形成的tcodeToTerrain_中没有出现该地形,会以该地形为关键字形成一个<t_terrain, terrain_type>。既然在第一步找不到该地形,此地形一定既有基本层又有覆盖层。t_terrain中的base来自格子中的基本层terrain_type对象base,overlay来自格子中的覆盖层的terrain_type对象的overlay。

为什么会有aliasof?
对于同是“平原”地形,它可能又有“绿草地”,“半干的草地”,“干草地”,“残败的落叶”,它还有道路,你像“暗色尘土”,“普通尘土”,“干燥尘土”,这些地形都有一个[terrain_type],当中有不同的“string”字段值,在但在归类上它们都属于“Gt”,aliasof就表示了这个归类。

aliasof中的运算逻辑
  • “+”取更小范围。#0时范围是[0, 100],#1时范围是[10, 110],结果是[10, 100]。
  • “-”取更大范围。#0时范围是[0, 100],#1时范围是[10, 110],结果是[0, 110]。

为什么地形会被分类?
对于同是“平原”地形,它可能是“绿草地”,“半干的草地”,“干草地”,“残败的落叶”,它还有道路,像“暗色尘土”,“普通尘土”,“干燥尘土”,这些地形都有一个[terrain_type],而且当中有不同“string”字段值,在但在归类上它们都属于“Gt”,在aliasof操作数中需使用这个分类名。

1、计算时会考虑基本层和覆盖层防御指数。
2、基本层、覆盖层防御指数如何参与计算最终防御指数是由“aliasof”或“def_alias”决定。存在“def_alias”时,即使存在“aliasof”也是“def_alias”生效;当不存在“def_alias”时,“aliasof”生效。
3、“aliasof”和“def_alias”格式是一样的。可以认为该值是一公式,公式的操作符是“+”、“-”。
4、“aliasof”、“def_alias”公式内容。操作符“+”是取两操作数的更小范围;操作符“-”是取两操作数的更大范围。在游戏意义上,特意把更小范围认为“更优”,更大范围认为“更坏”。移动点数越小是“越优”,防御指数也需要越小则“越优”(游戏中将使用“100-”后的值)。
5、任何一个公式都会附加一个操作数,第一操作符是“+”时该操作数是(0, 100),第一操作符是“-”时该操作数是(100, 0)。
6、“_bas”是一个特殊操作数,它表示该处用基本层(base)数值代替。
7、在计时算同时会计算两个值(min、max),最后得出的防御指数是(min、max)之中的最大值。[defend]块中值是正数时,该值只是赋给max(min则为0);但如果[defend]块中值是负数时,该值会变成绝对值同时赋给min、max。
  1. ......
  2. string=^Fds
  3. aliasof=_bas,Ft
  4. ......
复制代码
1、Fds(夏季落叶林)这个地形属Ft(森林)。
2、不存在def-alias,计算防御指数时采用aliasof字段。
3、“_bas”表示该位置放置基地形上的防御指数,假设是平原“Gt”。
对步兵
Ft上是90,Gt上是100。
(0, 100)“+”(0, 100)==>(0, 100)(Gt部分)
(0, 100)“+”(0, 90)==>(0, 90)(Ft部分)
计算得出步兵在“Gt^Fds”上防御指数是90。

对骑兵
Ft上是-110,Gt上是100。
(0, 100)“+”(0, 90)==>(0, 90)
(0, 90)“+”(110, 110)==>(110, 90)
计算得出步兵在“Gt^Fds”上防御指数是110(取最大值)。

[defende]块书写规则
1、值越大,防御越差。
2、大于100时,一律加上负号。(为使用min是最终值)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-2 03:59 , Processed in 0.048792 second(s), 19 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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