[MOD设计资料] 城市工作范围的原理与修改

一,定义条件

进入CvGameCoreDLL目录打开“CvDefines.h”,可以找到下边四行。

#define NUM_CITY_PLOTS												(21)
#define CITY_HOME_PLOT												(0)
#define CITY_PLOTS_RADIUS											(2)
#define CITY_PLOTS_DIAMETER										((CITY_PLOTS_RADIUS*2) + 1)

NUM_CITY_PLOTS 是城市工作的地块数量
CITY_HOME_PLOT 是城市是位于那一个地块
CITY_PLOTS_RADIUS 是工作范围半径
CITY_PLOTS_DIAMETER 是工作范围这个正方形的长宽

他们的关系会在后面讲。

二,城市范围的结构

打开“CvGlobals.cpp”,找函数“void CvGlobals::init()”,再往下看。

	int aiCityPlotX[NUM_CITY_PLOTS] =
	{
		0,
		0, 1, 1, 1, 0,-1,-1,-1,
		0, 1, 2, 2, 2, 1, 0,-1,-2,-2,-2,-1,
	};

	int aiCityPlotY[NUM_CITY_PLOTS] =
	{
		0,
		1, 1, 0,-1,-1,-1, 0, 1,
		2, 2, 1, 0,-1,-2,-2,-2,-1, 0, 1, 2,
	};

	int aiCityPlotPriority[NUM_CITY_PLOTS] =
	{
		0,
		1, 2, 1, 2, 1, 2, 1, 2,
		3, 4, 4, 3, 4, 4, 3, 4, 4, 3, 4, 4,
	};

	int aaiXYCityPlot[CITY_PLOTS_DIAMETER][CITY_PLOTS_DIAMETER] =
	{
		{-1, 17, 18, 19, -1,},
		{16,  6,  7,  8, 20,},
		{15,  5,  0,  1,  9,},
		{14,  4,  3,  2, 10,},
		{-1, 13, 12, 11, -1,}
	};

现在先看aaiXYCityPlot这个二维数组
根据之前的定义,aaiXYCityPlot[5][5],就是一个长宽都是5的25格的二维数组。再看四个角的-1,-1就是不工作的格,NUM_CITY_PLOTS的定义为21,现在明了吧。
现在用你的斗鸡眼看一下这个aaiXYCityPlot数组像什么?就是游戏中的城市工作范围。

aaiXYCityPlot、aiCityPlotX、aiCityPlotY三者的关系用一张图来表示

如果理解?从aaiXYCityPlot中间的0开始,右1,下2。。。顺时针至20为止
aiCityPlotX、aiCityPlotY就是坐标,将X和Y分开为两个数组,数组分为三行是让你好理解,就是有三层,看一下aaiXYCityPlot这个正方形。

aaiXYCityPlot的0,就是aiCityPlotX和aiCityPlotY的第一行第一个,0和0,合起来就是0,0
aaiXYCityPlot的1,就是aiCityPlotX和aiCityPlotY的第二行第一个,0和1,合起来就是0,1
aaiXYCityPlot的2,就是aiCityPlotX和aiCityPlotY的第二行第二个,1和1,合起来就是1,1
aaiXYCityPlot的3,就是aiCityPlotX和aiCityPlotY的第二行第三个,1和0,合起来就是1,0
aaiXYCityPlot的9,就是aiCityPlotX和aiCityPlotY的第三行第一个,0和2,合起来就是0,2
aaiXYCityPlot的16,就是aiCityPlotX和aiCityPlotY的第三行第八个,-1和-2,合起来就是-1,-2
aaiXYCityPlot的20,就是aiCityPlotX和aiCityPlotY的第三行第十二个,-1和2,合起来就是-1,2

好了,还不明的话我没办法了。

aiCityPlotPriority看字面是优先级,但因计算不在DLL内,不能解释作用如何。配合aaiXYCityPlot看一下,就明白为斜角的格设高一点。

原理解释到此,应该不会有理解上的困难。

注意,城市工作范围和城市扩展的文化范围是没有任何关系的。

三,修改

现在实现三格城市工作范围吧。

1,打开“CvDefines.h”,修改

#define CITY_PLOTS_RADIUS											(3)

3格半径的话,CITY_PLOTS_DIAMETER = ((CITY_PLOTS_RADIUS*2) + 1),CITY_PLOTS_DIAMETER相乘就等于49

2,先设计好aaiXYCityPlot这个二维数组

打开“CvGlobals.cpp”,修改

	int aaiXYCityPlot[CITY_PLOTS_DIAMETER][CITY_PLOTS_DIAMETER] =
	{
		{-1, -1, 32, 33, 34, -1, -1},
		{-1, 31, 17, 18, 19, 35, -1},
		{30, 16, 6,  7,  8,  20, 36},
		{29, 15, 5,  0,  1,  9,  21},
		{28, 14, 4,  3,  2,  10, 22},
		{-1, 27, 13, 12, 11, 23, -1},
		{-1, -1, 26, 25, 24, -1, -1}
	};

形状是你自己喜欢,没-1也没关系,我当前只是按文化扩展来定工作范围的形状。

3,定义NUM_CITY_PLOTS

打开“CvDefines.h”,修改

#define NUM_CITY_PLOTS												(37)

49-12,12就是12格-1,实际工作的只有37格

4,定义XY数组

打开“CvGlobals.cpp”,修改

	int aiCityPlotX[NUM_CITY_PLOTS] =
	{
		0,
		0, 1, 1, 1, 0,-1,-1,-1,
		0, 1, 2, 2, 2, 1, 0,-1,-2,-2,-2,-1,
		0, 1, 2, 3, 3, 3, 2, 1, 0,-1,-2,-3,-3,-3,-2,-1,
	};

	int aiCityPlotY[NUM_CITY_PLOTS] =
	{
		0,
		1, 1, 0,-1,-1,-1, 0, 1,
		2, 2, 1, 0,-1,-2,-2,-2,-1, 0, 1, 2,
		3, 3, 2, 1, 0,-1,-2,-3,-3,-3,-2,-1, 0, 1, 2, 3,
	};

自己数格吧,或者先画张图来填也行,我也建议你这样做,免得搞错坐标

5,最后再写优先级

	int aiCityPlotPriority[NUM_CITY_PLOTS] =
	{
		0,
		1, 2, 1, 2, 1, 2, 1, 2,
		3, 4, 4, 3, 4, 4, 3, 4, 4, 3, 4, 4,
		5, 6, 7, 6, 5, 6, 7, 6, 5, 6, 7, 6, 5, 6, 7, 6,
	};

斜角最高,平角次之。

VC++文明4
Comments ( 2 )
Add Comment
  • Damasco

    似乎没有用啊,按照文中内容,把原版和刀剑之上CvGameCoreDLL文件夹里的两个文件都进行了修改,没加mod开了一把,用编辑器把城市文化扩张到三格,结果市民还是只能工作在两格范围内

    • ztj

      我只能说以前玩5格都没问题,但年代久远,不管了。