本人玩文明系列是彻头彻尾的奇观党,不抢全奇观浑身不舒服。文明6的奇观可以直观地显示在大地图上,俯瞰一大片奇观密密麻麻的矗立在一起非常壮观,全身上下每个毛孔都舒爽极了。但是这代建奇观对地形要求较多,自然刷图是不可能把全奇观都凑一起的。所幸后来发现了cheat map editor这款mod,自改地图解千愁,奇观党一本满足。
用了几次以后,又开始往地图上塞自然奇观,人文自然奇观相互映衬、相得益彰,美感又上了一个层次。但是,我发现CME放置自然奇观的时候不能选择朝向,张掖丹霞总是只能放置为西南-东北朝向,百内国家公园总是只能东-西朝向,这不免多了一些限制,让人颇不爽。
为了解决这个问题,我找遍了各游戏论坛贴吧,尤其是NexusMod站原作者的贴,发现居然没人问这个问题。没辙,只好自己想办法解决。经过简单的研究,居然幸运地一下就发现了调整的手段。
(资料图片)
首先进入CME的存放位置 \Documents\My Games\Sid Meier's Civilization VI\Mods\CheatMapEditor\目录,在里面找到CME_WonderGen.lua这个文件。这个看名字就知道是关于如何生成自然奇观的文件,看来作者也感觉放置奇观太复杂,专门用了一个文档来写相关代码。这里面的函数是未编译的明文源码,我们要做到就是修改这个文件,令它按照我们的思路来运作。所以一定要先做好备份。.lua文件本质上就是文本文档,可以用记事本直接打开,但为了操作方便还是建议使用稍微专业一点的文档编辑工具,比如UltraEdit。
打开以后,在文档的第8行和第306行各定义了一个函数:CustomGetMultiTileFeaturePlotList2( ) 和 CustomGetMultiTileFeaturePlotList( ),真正起效的是后面那个不带数字后缀的函数,所以我们的修改从306行开始。
为了了解函数的工作原理(不需要了解的太复杂),这里介绍一个里面用得最频繁的子函数。看第446行到第451行,可以看到这里连续6次调用了一个Map.GetAdjacentPlot( )子函数,括号里面的参数只有最后一个不同。从函数名到参数名,看字面意思也能猜到,这个函数的作用就是找当前格子的某个相邻格子。游戏中一个格子有6个相邻格子,根据方向依次是东北、东、东南、西南、西、西北,恰好就是这个子函数被连续6次调用时被最后一个参数所指明的方向。如果是有编程基础的看官,应该能猜到,NORTHEAST、EAST、SOUTHEAST、SOUTHWEST、WEST、NORTHWEST这6个表示方向的标识符多半是一个枚举型,其实和数字0、1、2、3、4、5是等价的。这里之所以专门提一嘴,是因为后面会用到这个猜测。
具备了这点基础知识,我们已经可以来进行实战了。看代码第319行到第328行,首先①处黄线的注释就告诉我们,这一段是在处理占两格的自然奇观,必须东-西朝向面向摄像机。②处红线的判断条件代码则更详细指出,这一段是专门处理百内国家公园和约塞米蒂的。至于③处蓝线的注释讲解了具体方法,以当前格子为西格子,找到当前格子东边的相邻格子,这两个格子自然构成了东-西朝向的两格。④处的紫色线则是具体处理过程,参数指定的EAST就是代表“找到东边的相邻格子”这一步。在游戏内,我们放置约塞米蒂也确实只能横着放,看来就是因为这里被限制了。我们尝试把EAST改成NORTHEAST,保存文档后进游戏实际看看效果。注意,如果你正开着游戏,需要退出游戏后再进,才能再次加载MOD。
再次进入游戏后使用CME放置约塞米蒂,当场就可以看到确实是当前格子和东北格子变成了约塞米蒂。save-load后再载入游戏,却发现没有显示模型。鼠标移到格子上,提示文字表明这个格子确实是约塞米蒂了,但视觉上还是没变。这时,才明白为什么作者要单独把百内和约塞米蒂单独列出来处理了,看来作者也发现了这俩奇观只有东-西方向摆放、正面面对摄像机时才有模型。(这个似乎可以理解,像珠穆朗玛峰等奇观,确实当两个摆放方向不同时,甚至有无河流流过时,模型是不同的)。
虽然初战失利,但不必气馁。继续看428行到441行。看①处黄线的注释可知,这一段是处理连续3个格子排成直线的情况。②处红线的判断条件代码则更明确指出这一段就是针对张掖丹霞的。③处蓝线是一个for循环,这里就要用到我们前面提到的那个猜想,NORTHEAST、WEST等表示方向的标识符,其实就是数字。④处的紫色线这个位置就是GetAdjacentPlot( )函数的最后一个参数,本来应该是填NORTHEAST这类标识符的,但实际上在此处是填了一个整数变量 i,范围从0到5。这一段for循环所执行的动作其实就是:在选定当前格子(称为第1格)后,从“东北”方向开始,找到紧邻的格子(称为第2格),判断第2格是否符合放置张掖丹霞的条件。如果不符合,则顺时针找下一个相邻格子。而如果符合,就沿着当前方向进一步判断第2格的紧邻格子(称为第3格)是否符合放置张掖丹霞的条件,如果也符合,那么就报告主函数,说这里可以放置。如果不符合,则退回寻找下一个第2格。如此循环,直到把6个方向都找遍。
由于“是否符合放置条件”的判断很宽松,所以基本上第一个“东北”方向就总是能满足条件,于是我们在游戏里用CME放置的张掖丹霞地形就总是西南-东北向的。要修改这个其实也很简单,看③处蓝线设定了整数变量 i 的起始值是0,也就是从“东北”方向开始找,我们只要把 i=0改成 i=1,它就变成从“东”开始找了;同理,改成 i=2,它就变成从“东南”开始找了。这其实就已经够了,足以让我们在游戏里放置下东-西向或东南-西北向的张掖丹霞地形。
改成 i=2后进入游戏,放置张掖丹霞,成功得到了东南-西北向的丹霞奇观。至此我们终于收获了一个战果。
下一段443行一直到584行都是在写如何放置米尔福德峡湾,主要是试图让峡湾的那个豁口朝向大海一侧。由于这个机制在正常游戏中也能被反映出来(也就是:你想让峡湾朝向哪个方向,就在那个方向放置海,背后方向放置陆地),所以没必要改动。另外,巨人堤和多佛白崖也是会随着地形自动旋转的,不用管。
从585行开始,就是除掉前面说的约塞米蒂、张掖丹霞等特殊情况之外,更加普遍的情况了。包括棉花堡等典型2格地形,珠穆朗玛峰等典型三角形地形,白沙漠等典型4格菱形地形,这里被统一归类到了“其他”里面。为了代码书写方便,589行到594行已经提前帮我们把6格紧邻格子找好了,分别用pWPlot、pSEPlot等变量名称指代,记住他们的名字,下面要用。
第596行到第600行是在处理奇观第2格的情况(1格奇观当然无需任何处理)。①处黄线的判断条件是当奇观格子数大于1,也就是2格、3格、4格奇观的第2个格子都被囊括其中。②处红线的注释明白说了,第2格无条件找东边相邻格,也就是③处紫色线调用的pEPlot。如果你是想放置一个2格奇观,那么看到这里就够了。比如我们想放置一个东北-西南向的棉花堡,把③处的pEPlot改成pNEPlot就行了。想放置东南-西北向就把pEPlot改成pSEPlot。
特别注意!!!由于下面对3、4格奇观的第3格也是默认找东北格,所以如果你已经把第2格改成了东北格,那么在游戏里就不要放置3格奇观,否则也会出错,不能正确显示模型。
如果要放置3、4格奇观,那么继续往下看。3格奇观有两种方向,“当前-东-东北”构成的朝上三角形,以及“当前-东-东南”构成的朝下三角形,无论哪个都需要第2格是“东”格,所以我们先把前面599行恢复成pEPlot。然后看604行到617行,这里是在讲3、4格奇观的第3格怎么找。
①处黄线的判断条件是当奇观格子数大于2,也就是只关系到3、4格奇观了。②处红线出现了分支,对于张掖丹霞和罗赖马山有特殊处理。由于张掖丹霞已经被前面我们讲过的428到441行处理掉了,所以这一小段其实只影响罗赖马山。专门说一下罗赖马山,这是游戏里形状最奇怪的一个奇观,它需要“当前-东-西-东南”4个格子构成一个钩子型(这个Mod的作者称之为L型或三角形带一个尾巴),所以③处蓝线表明罗赖马山的第3格是找了“西”格。除了罗赖马山这一个特殊情况,④处紫色线注释说明了其他所有3、4格奇观的第3格都是找了“东北”格,也就是⑤处红线的pNEPlot。如果我们想让3格奇观呈现向下三角摆放,那么就把这里pNEPlot改成pSEPlot即可。
如果要放置4格奇观,那么还要继续往下看。4格奇观有三种方向,东北-西南向菱形、北-南向菱形、东南-西北向菱形(神奇的罗赖马山除外)。
都到这一步了,已经是文档的末尾了,应该也很熟练了。①处黄线的判断条件是当前奇观的格子数大于3,也就是只剩4格奇观会被影响了。②处红线又出现了分支,还是针对罗赖马山,③处蓝线注释说明了找“东南”格,也就是④处紫色线使用的pSEPlot。而对于其他4格奇观,则都是菱形,鉴于前面第3格默认选择了“东北”格,所以这里⑤处红线注释说明第4格会找“西北”格,也就是⑥处黄线使用的pNWPlot。这样,就构成了一个“当前-东-东北-西北”构成的东南-西北向菱形。所以想一想,如果我们想要一个南-北向的菱形,其实就需要“当前-东-东北-东南”格,那么就去在599行、615行、632行这3处代码分别指定的格子替换成我们想要的格子的对应变量名,就可以实现。
同理,如果想要东北-西南向的菱形,那就需要“当前-东北-西北-西”或者“当前-东-东南-西南”格子,在相应位置替换即可。罗赖马山也是一样道理,如果我们想要一个长边是东北-西南向的放置,那就使用“当前-东北-东-西南”格子,在599行、609行、626行位置替换就行了。Simple Geometry!!!
总结起来,如果想要旋转某个自然奇观的摆放,那么流程就是:退出游戏→修改Mod文件夹里CME_WonderGen.lua文档的相关代码,令其摆放逻辑符合我们的要求→重新进游戏,使用CME放置奇观→成功后退出游戏→将Mod文档复原,重新进入游戏→继续下一回合。真的是非常的Simple呢!
关键词: