一,定义条件
进入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,
};
斜角最高,平角次之。
似乎没有用啊,按照文中内容,把原版和刀剑之上CvGameCoreDLL文件夹里的两个文件都进行了修改,没加mod开了一把,用编辑器把城市文化扩张到三格,结果市民还是只能工作在两格范围内
我只能说以前玩5格都没问题,但年代久远,不管了。