前言

稍微讲解下《魔兽争霸 3》中的视野、可见度、战争迷雾、黑色迷雾等概念和相关 API 的用法。因为开发需要,所以稍微研究过。

视野

视野的三个级别:

  • 可见: 视野内(FOG_OF_WAR_VISIBLE)
  • 已探测: 战争迷雾(FOG_OF_WAR_FOGGED)
  • 未探测: 黑色迷雾(显示地形)/黑色阴影(全黑)(FOG_OF_WAR_MASKED)

这里名词可能有点混乱,WE 里的「黑色迷雾」/「黑色阴影」实际都指本文的未探测级别。

视野

视野2

一张地图的未探测部分要么是黑色迷雾,要么是黑色阴影。在地图属性中勾选「显示小地图地形」就是黑色迷雾,不勾选就是黑色阴影,这项设置无法用脚本修改。

单位视野

单位视野最大为 1800,原版单位三级猫头鹰(2200)和血精灵的塔(1900)的视野实际上也只有 1800,用 Shift 输入超过 1800 的值实际也只会有 1800。

设置战争迷雾/黑色阴影

相关 API:

native FogMaskEnable        takes boolean enable returns nothing
native IsFogMaskEnabled     takes nothing returns boolean
native FogEnable            takes boolean enable returns nothing
native IsFogEnabled         takes nothing returns boolean

相关触发:

具体效果:

  • 禁用战争迷雾:已探测 → 可见(已探测区域变为可见区域)
  • 禁用黑色阴影:未探测 → 已探测
  • 启用战争迷雾/黑色阴影:恢复原状

可见度修正器

相关 API:

native CreateFogModifierRect      takes player forWhichPlayer, fogstate whichState, rect where, boolean useSharedVision, boolean afterUnits returns fogmodifier
native CreateFogModifierRadius    takes player forWhichPlayer, fogstate whichState, real centerx, real centerY, real radius, boolean useSharedVision, boolean afterUnits returns fogmodifier
native CreateFogModifierRadiusLoc takes player forWhichPlayer, fogstate whichState, location center, real radius, boolean useSharedVision, boolean afterUnits returns fogmodifier
native DestroyFogModifier         takes fogmodifier whichFogModifier returns nothing
native FogModifierStart           takes fogmodifier whichFogModifier returns nothing
native FogModifierStop            takes fogmodifier whichFogModifier returns nothing

相关触发:

可见度修正器

具体效果:

新建的可见度修正器需要启用才会生效,创建的修正器里允许就是启用。

  • 开启黑色迷雾修正器: 已探测 → 未探测
  • 开启战争迷雾修正器: 未探测 → 已探测
  • 开启可见修正器: 全部 → 可见
  • 关闭/删除修正器: 不恢复原状但不再生效

修正器的优先级高于设置战争迷雾/黑色阴影。
修正器之间先创建的(不是先启用的)优先级更高。

设置地图迷雾

相关 API:

native SetFogStateRect      takes player forWhichPlayer, fogstate whichState, rect where, boolean useSharedVision returns nothing
native SetFogStateRadius    takes player forWhichPlayer, fogstate whichState, real centerx, real centerY, real radius, boolean useSharedVision returns nothing
native SetFogStateRadiusLoc takes player forWhichPlayer, fogstate whichState, location center, real radius, boolean useSharedVision returns nothing

相关触发:

具体效果:

这个 API 相当于只持续一瞬间的可见度修正器,即只改变当前的视野情况,不影响后续的视野变化。

地图默认设置

  • 显示小地图地形
  • 启用战争迷雾
  • 启用黑色阴影

具体应用

走过的地方保留视野(单层战争迷雾):

  • 禁用战争迷雾

初始全黑,走过的地方也全黑:

  • 不勾选显示小地图地形
  • 开启黑色迷雾修正器

刷新地图,全部变为未探测:

  • 设置地图迷雾(黑色迷雾)

碎碎念

从上帝视角往下看,没有任何迷雾是最自然的想法。为了增加游戏博弈深度,RTS 游戏设计了战争迷雾。《魔兽争霸 2》更是开创了更复杂的双层战争迷雾,视角与视野出现了割裂,视角是上帝视角,但视野却是所有己方单位的视野合集。

另一方面,在《星际争霸》系列中,玩家视角能看到隐形单位的波纹,己方单位却「看」不到这些隐形单位,无法进行攻击,这里视角与视野又反转了设定。当然这就是《星际争霸》对隐形的设计,这样的形式很巧妙,设定反转云云只是本人的吹毛求疵罢了。

结语

介于贴吧精品区被百度删除了很多部分,也没有一个新的像样的开放社区,只能在这里以本人的粗浅理解和经验延续记录一些魔兽地图编辑器的开发知识。(不过这篇是我以前就写的,只是稍微整理了下)