创建河流




创建河流命令:

	 [(    )] rmRiverCreate(int areaID, string waterType, int breaks, int offset, int minR, int maxR): make a river dude.
																	
	 [(    )] rmRiverAddWaypoint(riverID, xFraction, zFraction):Add waypoint to a river. Don't mix with rmRiverSetConnections or rmRiverConnectRiver
																	
	 [(    )] rmRiverAvoid(riverID, riverID2, minDist)
																	
	 [(    )] rmRiverConnectRiver(riverID, riverID, pct, end);	
																	
	 [(    )] rmRiverSetBankNoiseParams(riverID, frequency, octaves, persistence, sineLength, sineAmt, variation); 		
																	
	 [(    )] rmRiverSetShallowRadius(riverID, radius);
																	
	 [(    )] rmRiverAddShallows(riverID, count, radius); 
																	
	 [(    )] rmRiverReveal(int riverID, int extraTiles)(int riverID, int extraTiles) -- reveals a river plus the specified number of extra tiles around it.
																	
	 [(bool)] rmAddAreaToClass(int areaID, int classID): Add given area to specified class.


        rmRiverCreate(int areaID, 河流类型, 作用不明, 作用不明, 最小半径, 最大半径);
        rmRiverAddWaypoint(riverID, X坐标, Z坐标); 河流中续点
        rmRiverAddWaypoint(riverID, X坐标, Z坐标); 河流中续点
        rmRiverAddWaypoint(riverID, X坐标, Z坐标);
        rmRiverAddWaypoint(riverID, X坐标, Z坐标);
        rmRiverBuild(RiverID); 像剧情编辑器那样,你设定好中续点后,需要按建立河流才会生成河流。
        注:两个相邻中续点不能一样,否则会导致无法打开地图,也无法退出游戏,如果你的任务管理器在最顶层可以用管理器关闭帝国3,如果不在,长按5秒电源键关机吧。
                河流类型自己参照剧情编辑器或者data3.bar的waterBodies2.xml与data2.bar的waterBodies.xml。下表已经将调用名整理好了:

River
Amazon River Andes River Deccan Plateau River Pampas River
Yellow River Yukon River
Lake
Amsterdam Bayou Berlin Borneo Water
China_HC Constantinople Great Lakes Great Lakes Ice
Great Plains Pond India_HC Iroquois_HC Japan_HC
Lisbon London New England Lake Northwest Territory Water
Paris Saguenay Lake Seville Texas Pond
Yellow River Flooded
Coast
Amazon River Basin Araucania Central Coast Araucania North Coast Araucania Southern Coast
Atlantic Coast Bayou SPC Borneo Coast California Coast
Caribbean Coast Ceylon Coast Cinematic Ship Ocean Coastal Japan
Hudson Bay Hudson Bay New England Coast Yucatan Coast



来创建河流吧(仍然是在空白地图创建):传送门
  Debug.xs - 记事本 ____ X
文件(F)  编辑(E)  格式(O)  查看(V)  帮助(H)
	include "mercenaries.xs";
	include "ypAsianInclude.xs";
	include "ypKOTHInclude.xs";

	void main(void)
	{
		// ---------------------------------------- Map Info -------------------------------------------
		int playerTilesX=13200;			//设定地图X大小
		int playerTilesZ=13200;			//设定地图Z大小(帝国3的Y是高度,Z才是我们平常所用到的Y)


		//如果玩家大于4将playerTilesX与playerTilesZ改为11500(同一个值的int只能出现1次,当你需要修改数值的时候,不能再加入int)
		if (cNumberNonGaiaPlayers >4){	playerTilesX=11500;	playerTilesZ=11500;}



		if (cNumberNonGaiaPlayers >6){	playerTilesX=10500;	playerTilesZ=10500;}		//Modify Map X&Z Size of 6,7,8 Player



		int SizeX = 2*sqrt(cNumberNonGaiaPlayers*playerTilesX);
		int SizeZ = 2*sqrt(cNumberNonGaiaPlayers*playerTilesZ);



		string MapTerrain ="Carolinas\ground_marsh3_car";	//<-------- 地图地形,自己参照剧情编辑器 <--------

		string MapLighting ="319a_Snow";			//<-------- 照明,自己参照剧情编辑器 <--------

		string PlayerTerrain ="Carolinas\ground_marsh1_car";	//<--------- 玩家范围地形 <---------




		//设定地图XZ大小,分别调用上面用int定义的SizeX与SizeZ,即为rmSetMapSize(13200,13200);如果玩家大于4将改为11500
		rmSetMapSize(SizeX, SizeZ);



		rmSetMapElevationParameters(cElevTurbulence, 0.15, 2.5, 0.35, 3.0); // type, frequency, octaves, persistence, variation 

		rmSetMapElevationHeightBlend(1.0);


		//地形初始化,设定地图初始地形,调用上面用string定义MapTerrain,即为"Carolinas\ground_marsh3_car";
		rmTerrainInitialize(MapTerrain,6);



		//设定照明,调用上面用string定义MapLighting,即为"319a_Snow"
		rmSetLightingSet(MapLighting);



		rmSetGlobalRain(0.9);		//设定下雨
		chooseMercs();
		rmSetMapType("yucatan");
		rmSetMapType("water");
		rmSetMapType("default");	//设定地图类型,地图类型影响到宝藏
		rmSetMapType("land");
		rmSetMapType("bayou");
		rmSetSeaLevel(0); // this is height of river surface compared to surrounding land. River depth is in the river XML.

		rmSetStatusText("",0.01);//读取地图进度条



		rmPlacePlayersCircular(0.35, 0.35, 0.0);   	//圆形放置玩家


		
		int River2ID = rmRiverCreate(-1, "Northwest Territory Water", 1, 1, 10, 10);
		rmRiverAddWaypoint(River2ID, 1.0, 0.0 );	//坐标自己参照地图坐标,这里是地图最左端
		rmRiverAddWaypoint(River2ID, 0.6, 0.6 );	//这里是地图中心往上一点
		rmRiverAddWaypoint(River2ID, 0.0, 1.0 );	//这里是地图最右端,所以三个点连起来就是一个小三角形。
		//另外两个相邻的中续点不要设定相同,否则无法打开地图,不信的话你可以自己去试一试。
		rmRiverSetBankNoiseParams(River2ID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(River2ID);
		


		//玩家范围
		float AreaSizePlayer = rmAreaTilesToFraction(700);
		for(i=1; <=cNumberNonGaiaPlayers)
		{
			int id=rmCreateArea("Player"+i);
			rmSetPlayerArea(i, id);
			rmSetAreaWarnFailure(id, false);
			rmSetAreaSize(id, AreaSizePlayer, AreaSizePlayer);
			rmSetAreaLocPlayer(id, i);
			rmSetAreaCoherence(id, 0.85);
			rmSetAreaSmoothDistance(id, 2);
			rmSetAreaMinBlobs(id, 1);
			rmSetAreaMaxBlobs(id, 1);
			rmSetAreaTerrainType(id,PlayerTerrain);
			rmBuildArea(id);
		}


		//定义城镇中心
		int TownCenterID = rmCreateObjectDef("player TC");
		if (rmGetNomadStart())
		{
			rmAddObjectDefItem(TownCenterID, "CoveredWagon", 1, 0.0);
		}
		else
		{
			rmAddObjectDefItem(TownCenterID, "TownCenter", 1, 0);
		}
		rmSetObjectDefMinDistance(TownCenterID, 0.0);
		rmSetObjectDefMaxDistance(TownCenterID, 20.0);
		for(i=1; <=cNumberNonGaiaPlayers)
		{
			rmPlaceObjectDefAtLoc(TownCenterID, i, rmPlayerLocXFraction(i), rmPlayerLocZFraction(i));
		}


		//定义起始单位(civs.xml定义那些开局单位)
		int startingUnits = rmCreateStartingUnitsObjectDef(5.0);
		rmSetObjectDefMinDistance(startingUnits, 6.0);
		rmSetObjectDefMaxDistance(startingUnits, 10.0);

		for(i=1; <=cNumberNonGaiaPlayers)
		{
			vector TCLocation = rmGetUnitPosition(rmGetUnitPlacedOfPlayer(TownCenterID, i));
			rmPlaceObjectDefAtLoc(startingUnits, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
		}

		




		rmSetStatusText("",0.50);//读取地图进度条





		rmSetStatusText("",1.00);//读取地图进度条


					//愿神兽会保佑你不会出错。
 			/*----------------------------------------------------------------------------------------------*
			*    ┏┓   ┏┓										*
			*   ┏┛┻━━━┛┻┓									*
			*   ┃       ┃									*
			*   ┃   ━   ┃									*
			*   ┃ ┳┛ ┗┳ ┃									*
			*   ┃       ┃									*
			*   ┃   ┻   ┃									*
			*   ┃       ┃									*
			*   ┗━┓   ┏━┛     Code is far away from bug with the animal protecting		*
			*     ┃   ┃    									*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┗━━━┓									*
			*     ┃       ┣┓									*
			*     ┃       ┏┛									*
			*     ┗┓┓┏━┳┓┏┛									*
			*      ┃┫┫ ┃┫┫									*
			*      ┗┻┛ ┗┻┛									*
			*----------------------------------------------------------------------------------------------*/
	} //END




把Northwest Territory Water更换Yellow River看看:传送门
  Debug.xs - 记事本 ____ X
文件(F)  编辑(E)  格式(O)  查看(V)  帮助(H)
	include "mercenaries.xs";
	include "ypAsianInclude.xs";
	include "ypKOTHInclude.xs";

	void main(void)
	{
		// ---------------------------------------- Map Info -------------------------------------------
		int playerTilesX=13200;			//设定地图X大小
		int playerTilesZ=13200;			//设定地图Z大小(帝国3的Y是高度,Z才是我们平常所用到的Y)


		//如果玩家大于4将playerTilesX与playerTilesZ改为11500(同一个值的int只能出现1次,当你需要修改数值的时候,不能再加入int)
		if (cNumberNonGaiaPlayers >4){	playerTilesX=11500;	playerTilesZ=11500;}



		if (cNumberNonGaiaPlayers >6){	playerTilesX=10500;	playerTilesZ=10500;}		//Modify Map X&Z Size of 6,7,8 Player



		int SizeX = 2*sqrt(cNumberNonGaiaPlayers*playerTilesX);
		int SizeZ = 2*sqrt(cNumberNonGaiaPlayers*playerTilesZ);



		string MapTerrain ="Carolinas\ground_marsh3_car";	//<-------- 地图地形,自己参照剧情编辑器 <--------

		string MapLighting ="319a_Snow";			//<-------- 照明,自己参照剧情编辑器 <--------

		string PlayerTerrain ="Carolinas\ground_marsh1_car";	//<--------- 玩家范围地形 <---------




		//设定地图XZ大小,分别调用上面用int定义的SizeX与SizeZ,即为rmSetMapSize(13200,13200);如果玩家大于4将改为11500
		rmSetMapSize(SizeX, SizeZ);



		rmSetMapElevationParameters(cElevTurbulence, 0.15, 2.5, 0.35, 3.0); // type, frequency, octaves, persistence, variation 

		rmSetMapElevationHeightBlend(1.0);


		//地形初始化,设定地图初始地形,调用上面用string定义MapTerrain,即为"Carolinas\ground_marsh3_car";
		rmTerrainInitialize(MapTerrain,6);



		//设定照明,调用上面用string定义MapLighting,即为"319a_Snow"
		rmSetLightingSet(MapLighting);



		rmSetGlobalRain(0.9);		//设定下雨
		chooseMercs();
		rmSetMapType("yucatan");
		rmSetMapType("water");
		rmSetMapType("default");	//设定地图类型,地图类型影响到宝藏
		rmSetMapType("land");
		rmSetMapType("bayou");
		rmSetSeaLevel(0); // this is height of river surface compared to surrounding land. River depth is in the river XML.

		rmSetStatusText("",0.01);//读取地图进度条



		rmPlacePlayersCircular(0.35, 0.35, 0.0);   	//圆形放置玩家



		
		int River2ID = rmRiverCreate(-1, "Yellow River", 1, 1, 10, 10);
		rmRiverAddWaypoint(River2ID, 1.0, 0.0 );
		rmRiverAddWaypoint(River2ID, 0.6, 0.6 );
		rmRiverAddWaypoint(River2ID, 0.0, 1.0 );
		rmRiverSetBankNoiseParams(River2ID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(River2ID);
		


		//玩家范围
		float AreaSizePlayer = rmAreaTilesToFraction(700);
		for(i=1; <=cNumberNonGaiaPlayers)
		{
			int id=rmCreateArea("Player"+i);
			rmSetPlayerArea(i, id);
			rmSetAreaWarnFailure(id, false);
			rmSetAreaSize(id, AreaSizePlayer, AreaSizePlayer);
			rmSetAreaLocPlayer(id, i);
			rmSetAreaCoherence(id, 0.85);
			rmSetAreaSmoothDistance(id, 2);
			rmSetAreaMinBlobs(id, 1);
			rmSetAreaMaxBlobs(id, 1);
			rmSetAreaTerrainType(id,PlayerTerrain);
			rmBuildArea(id);
		}


		//定义城镇中心
		int TownCenterID = rmCreateObjectDef("player TC");
		if (rmGetNomadStart())
		{
			rmAddObjectDefItem(TownCenterID, "CoveredWagon", 1, 0.0);
		}
		else
		{
			rmAddObjectDefItem(TownCenterID, "TownCenter", 1, 0);
		}
		rmSetObjectDefMinDistance(TownCenterID, 0.0);
		rmSetObjectDefMaxDistance(TownCenterID, 20.0);
		for(i=1; <=cNumberNonGaiaPlayers)
		{	
			rmPlaceObjectDefAtLoc(TownCenterID, i, rmPlayerLocXFraction(i), rmPlayerLocZFraction(i));
		}


		//定义起始单位(civs.xml定义那些开局单位)
		int startingUnits = rmCreateStartingUnitsObjectDef(5.0);
		rmSetObjectDefMinDistance(startingUnits, 6.0);
		rmSetObjectDefMaxDistance(startingUnits, 10.0);

		for(i=1; <=cNumberNonGaiaPlayers)
		{
			vector TCLocation = rmGetUnitPosition(rmGetUnitPlacedOfPlayer(TownCenterID, i));
			rmPlaceObjectDefAtLoc(startingUnits, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
		}

		




		rmSetStatusText("",0.50);//读取地图进度条





		rmSetStatusText("",1.00);//读取地图进度条


					//愿神兽会保佑你不会出错。
 			/*----------------------------------------------------------------------------------------------*
			*    ┏┓   ┏┓										*
			*   ┏┛┻━━━┛┻┓									*
			*   ┃       ┃									*
			*   ┃   ━   ┃									*
			*   ┃ ┳┛ ┗┳ ┃									*
			*   ┃       ┃									*
			*   ┃   ┻   ┃									*
			*   ┃       ┃									*
			*   ┗━┓   ┏━┛     Code is far away from bug with the animal protecting		*
			*     ┃   ┃    									*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┗━━━┓									*
			*     ┃       ┣┓									*
			*     ┃       ┏┛									*
			*     ┗┓┓┏━┳┓┏┛									*
			*      ┃┫┫ ┃┫┫									*
			*      ┗┻┛ ┗┻┛									*
			*----------------------------------------------------------------------------------------------*/
	} //END




再改个例如Borneo Water试试看:




接下来乱改中续点(只要确保两个相邻中续点不相同就行了),顺便再把最大半径与最小半径修改下:传送门
  Debug.xs - 记事本 ____ X
文件(F)  编辑(E)  格式(O)  查看(V)  帮助(H)
	include "mercenaries.xs";
	include "ypAsianInclude.xs";
	include "ypKOTHInclude.xs";

	void main(void)
	{
		// ---------------------------------------- Map Info -------------------------------------------
		int playerTilesX=13200;			//设定地图X大小
		int playerTilesZ=13200;			//设定地图Z大小(帝国3的Y是高度,Z才是我们平常所用到的Y)


		//如果玩家大于4将playerTilesX与playerTilesZ改为11500(同一个值的int只能出现1次,当你需要修改数值的时候,不能再加入int)
		if (cNumberNonGaiaPlayers >4){	playerTilesX=11500;	playerTilesZ=11500;}



		if (cNumberNonGaiaPlayers >6){	playerTilesX=10500;	playerTilesZ=10500;}		//Modify Map X&Z Size of 6,7,8 Player



		int SizeX = 2*sqrt(cNumberNonGaiaPlayers*playerTilesX);
		int SizeZ = 2*sqrt(cNumberNonGaiaPlayers*playerTilesZ);



		string MapTerrain ="Carolinas\ground_marsh3_car";	//<-------- 地图地形,自己参照剧情编辑器 <--------

		string MapLighting ="319a_Snow";			//<-------- 照明,自己参照剧情编辑器 <--------

		string PlayerTerrain ="Carolinas\ground_marsh1_car";	//<--------- 玩家范围地形 <---------




		//设定地图XZ大小,分别调用上面用int定义的SizeX与SizeZ,即为rmSetMapSize(13200,13200);如果玩家大于4将改为11500
		rmSetMapSize(SizeX, SizeZ);



		rmSetMapElevationParameters(cElevTurbulence, 0.15, 2.5, 0.35, 3.0); // type, frequency, octaves, persistence, variation 

		rmSetMapElevationHeightBlend(1.0);


		//地形初始化,设定地图初始地形,调用上面用string定义MapTerrain,即为"Carolinas\ground_marsh3_car";
		rmTerrainInitialize(MapTerrain,6);



		//设定照明,调用上面用string定义MapLighting,即为"319a_Snow"
		rmSetLightingSet(MapLighting);



		rmSetGlobalRain(0.9);		//设定下雨
		chooseMercs();
		rmSetMapType("yucatan");
		rmSetMapType("water");
		rmSetMapType("default");	//设定地图类型,地图类型影响到宝藏
		rmSetMapType("land");
		rmSetMapType("bayou");
		rmSetSeaLevel(0); // this is height of river surface compared to surrounding land. River depth is in the river XML.

		rmSetStatusText("",0.01);//读取地图进度条



		rmPlacePlayersCircular(0.35, 0.35, 0.0);   	//圆形放置玩家



					//5是最小半径,10是最大半径
		int River2ID = rmRiverCreate(-1, "Borneo Water", 1, 1, 5, 10);
		rmRiverAddWaypoint(River2ID, 1.0, 0.0 );
		rmRiverAddWaypoint(River2ID, 0.35, 0.85 );
		rmRiverAddWaypoint(River2ID, 0.3, 0.6 );
		rmRiverAddWaypoint(River2ID, 0.1, 0.5 );
		rmRiverAddWaypoint(River2ID, 0.3, 0.5 );
		rmRiverAddWaypoint(River2ID, 0.3, 0.3 );
		rmRiverAddWaypoint(River2ID, 0.5, 0.5 );
		rmRiverAddWaypoint(River2ID, 0.3, 0.5 );
		rmRiverAddWaypoint(River2ID, 0.7, 0.5 );
		rmRiverAddWaypoint(River2ID, 0.6, 0.2 );
		rmRiverAddWaypoint(River2ID, 0.0, 1.0 );
		rmRiverSetBankNoiseParams(River2ID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(River2ID);
		


		//玩家范围
		float AreaSizePlayer = rmAreaTilesToFraction(700);
		for(i=1; <=cNumberNonGaiaPlayers)
		{
			int id=rmCreateArea("Player"+i);
			rmSetPlayerArea(i, id);
			rmSetAreaWarnFailure(id, false);
			rmSetAreaSize(id, AreaSizePlayer, AreaSizePlayer);
			rmSetAreaLocPlayer(id, i);
			rmSetAreaCoherence(id, 0.85);
			rmSetAreaSmoothDistance(id, 2);
			rmSetAreaMinBlobs(id, 1);
			rmSetAreaMaxBlobs(id, 1);
			rmSetAreaTerrainType(id,PlayerTerrain);
			rmBuildArea(id);
		}


		//定义城镇中心
		int TownCenterID = rmCreateObjectDef("player TC");
		if (rmGetNomadStart())
		{
			rmAddObjectDefItem(TownCenterID, "CoveredWagon", 1, 0.0);
		}
		else
		{
			rmAddObjectDefItem(TownCenterID, "TownCenter", 1, 0);
		}
		rmSetObjectDefMinDistance(TownCenterID, 0.0);
		rmSetObjectDefMaxDistance(TownCenterID, 20.0);
		for(i=1; <=cNumberNonGaiaPlayers)
		{	
			rmPlaceObjectDefAtLoc(TownCenterID, i, rmPlayerLocXFraction(i), rmPlayerLocZFraction(i));
		}


		//定义起始单位(civs.xml定义那些开局单位)
		int startingUnits = rmCreateStartingUnitsObjectDef(5.0);
		rmSetObjectDefMinDistance(startingUnits, 6.0);
		rmSetObjectDefMaxDistance(startingUnits, 10.0);

		for(i=1; <=cNumberNonGaiaPlayers)
		{
			vector TCLocation = rmGetUnitPosition(rmGetUnitPlacedOfPlayer(TownCenterID, i));
			rmPlaceObjectDefAtLoc(startingUnits, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
		}

		




		rmSetStatusText("",0.50);//读取地图进度条





		rmSetStatusText("",1.00);//读取地图进度条


					//愿神兽会保佑你不会出错。
 			/*----------------------------------------------------------------------------------------------*
			*    ┏┓   ┏┓										*
			*   ┏┛┻━━━┛┻┓									*
			*   ┃       ┃									*
			*   ┃   ━   ┃									*
			*   ┃ ┳┛ ┗┳ ┃									*
			*   ┃       ┃									*
			*   ┃   ┻   ┃									*
			*   ┃       ┃									*
			*   ┗━┓   ┏━┛     Code is far away from bug with the animal protecting		*
			*     ┃   ┃    									*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┗━━━┓									*
			*     ┃       ┣┓									*
			*     ┃       ┏┛									*
			*     ┗┓┓┏━┳┓┏┛									*
			*      ┃┫┫ ┃┫┫									*
			*      ┗┻┛ ┗┻┛									*
			*----------------------------------------------------------------------------------------------*/
	} //END


最大半径与最小半径可能不是很明显,但是你应该也能看见某些地方比较大,某些地方比较小。

下面这幅图就比较明显了,一段比另一端半径要小,至于控制哪一段落小哪一段落大,这是不可能的,只要最小半径与最大半径不一样,就会变成随机性质。






不知道你发现了河流有一个隐藏性质没?那就是河流的轮廓可控。
比如我曾经做过中国地图、月之湖地图就是利用河流绘制的。
如何绘制一个月亮呢?如下图所示,我就是这样对着地图坐标绘制一个月亮。

蓝色部分为月之湖,红色部分为不可建造建筑地形(你去剧情编辑器找下,有这种地形的,可以建造码头,但是不可以建造建筑),绿色部分为正常地形。地形在后面会讲到,这里不做解释。
中国地图也是这样绘制的,不过已经过去很久了,我也没有保留当时制作中国地图的坐标图片。总之就是这样一个一个点对着来做。

我绘制月之湖轮廓合计用了119个点:传送门
  Debug.xs - 记事本 ____ X
文件(F)  编辑(E)  格式(O)  查看(V)  帮助(H)
	include "mercenaries.xs";
	include "ypAsianInclude.xs";
	include "ypKOTHInclude.xs";

	void main(void)
	{
		// ---------------------------------------- Map Info -------------------------------------------
		int playerTilesX=13200;			//设定地图X大小
		int playerTilesZ=13200;			//设定地图Z大小(帝国3的Y是高度,Z才是我们平常所用到的Y)


		//如果玩家大于4将playerTilesX与playerTilesZ改为11500(同一个值的int只能出现1次,当你需要修改数值的时候,不能再加入int)
		if (cNumberNonGaiaPlayers >4){	playerTilesX=11500;	playerTilesZ=11500;}



		if (cNumberNonGaiaPlayers >6){	playerTilesX=10500;	playerTilesZ=10500;}		//Modify Map X&Z Size of 6,7,8 Player



		int SizeX = 2*sqrt(cNumberNonGaiaPlayers*playerTilesX);
		int SizeZ = 2*sqrt(cNumberNonGaiaPlayers*playerTilesZ);



		string MapTerrain ="Carolinas\ground_marsh3_car";	//<-------- 地图地形,自己参照剧情编辑器 <--------

		string MapLighting ="319a_Snow";			//<-------- 照明,自己参照剧情编辑器 <--------

		string PlayerTerrain ="Carolinas\ground_marsh1_car";	//<--------- 玩家范围地形 <---------




		//设定地图XZ大小,分别调用上面用int定义的SizeX与SizeZ,即为rmSetMapSize(13200,13200);如果玩家大于4将改为11500
		rmSetMapSize(SizeX, SizeZ);



		rmSetMapElevationParameters(cElevTurbulence, 0.15, 2.5, 0.35, 3.0); // type, frequency, octaves, persistence, variation 

		rmSetMapElevationHeightBlend(1.0);


		//地形初始化,设定地图初始地形,调用上面用string定义MapTerrain,即为"Carolinas\ground_marsh3_car";
		rmTerrainInitialize(MapTerrain,6);



		//设定照明,调用上面用string定义MapLighting,即为"319a_Snow"
		rmSetLightingSet(MapLighting);



		rmSetGlobalRain(0.9);		//设定下雨
		chooseMercs();
		rmSetMapType("yucatan");
		rmSetMapType("water");
		rmSetMapType("default");	//设定地图类型,地图类型影响到宝藏
		rmSetMapType("land");
		rmSetMapType("bayou");
		rmSetSeaLevel(0); // this is height of river surface compared to surrounding land. River depth is in the river XML.

		rmSetStatusText("",0.01);//读取地图进度条



		rmPlacePlayersCircular(0.35, 0.35, 0.0);   	//圆形放置玩家




		
		int RiverRadius = 4.5;		int RiverRadius2 = 8.5;
		if(cNumberNonGaiaPlayers>=3)	{RiverRadius = 5.4;		RiverRadius2 = 10.2;}
		if(cNumberNonGaiaPlayers>=4)	{RiverRadius = 6.2;		RiverRadius2 = 11.7;}
		if(cNumberNonGaiaPlayers>=5)	{RiverRadius = 6.8;		RiverRadius2 = 12.8;}
		if(cNumberNonGaiaPlayers>=6)	{RiverRadius = 7.4;		RiverRadius2 = 14.0;}
		if(cNumberNonGaiaPlayers>=7)	{RiverRadius = 8.0;		RiverRadius2 = 15.2;}
		if(cNumberNonGaiaPlayers>=8)	{RiverRadius = 8.5;		RiverRadius2 = 16.2;}

		rmSetStatusText("",0.08);
	// ---------------------------------------------------------------- River 1 ------------------------------------------------------------------
		string RiverType = "Northwest Territory Water";	
		int RiverID = rmRiverCreate(-1, RiverType, 1, 1, RiverRadius, RiverRadius);
		rmRiverAddWaypoint(RiverID, 0.500, 0.518 );
		rmRiverAddWaypoint(RiverID, 0.478, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.450, 0.525 );
		rmRiverAddWaypoint(RiverID, 0.420, 0.528 );
		rmRiverAddWaypoint(RiverID, 0.400, 0.530 );
		rmRiverAddWaypoint(RiverID, 0.380, 0.540 );
		rmRiverAddWaypoint(RiverID, 0.330, 0.565 );
		rmRiverAddWaypoint(RiverID, 0.300, 0.580 );
		rmRiverAddWaypoint(RiverID, 0.280, 0.590 );
		rmRiverAddWaypoint(RiverID, 0.260, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.240, 0.620 );
		rmRiverAddWaypoint(RiverID, 0.210, 0.640 );
		rmRiverAddWaypoint(RiverID, 0.200, 0.655 );
		rmRiverAddWaypoint(RiverID, 0.180, 0.680 );
		rmRiverAddWaypoint(RiverID, 0.170, 0.700 );
		rmRiverAddWaypoint(RiverID, 0.160, 0.730 );
//		rmRiverAddWaypoint(RiverID, 0.140, 0.725 );
		rmRiverAddWaypoint(RiverID, 0.130, 0.720 );
		rmRiverAddWaypoint(RiverID, 0.125, 0.670 );
		rmRiverAddWaypoint(RiverID, 0.120, 0.650 );
		rmRiverAddWaypoint(RiverID, 0.190, 0.625 );
		rmRiverAddWaypoint(RiverID, 0.195, 0.610 );
		rmRiverAddWaypoint(RiverID, 0.125, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.128, 0.560 );
		rmRiverAddWaypoint(RiverID, 0.129, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.133, 0.533 );
		rmRiverAddWaypoint(RiverID, 0.139, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.140, 0.500 );
		rmRiverAddWaypoint(RiverID, 0.145, 0.480 );
		rmRiverAddWaypoint(RiverID, 0.150, 0.461 );
		rmRiverAddWaypoint(RiverID, 0.160, 0.480 );
		rmRiverAddWaypoint(RiverID, 0.175, 0.430 );
		rmRiverAddWaypoint(RiverID, 0.195, 0.400 );
		rmRiverAddWaypoint(RiverID, 0.218, 0.370 );
		rmRiverAddWaypoint(RiverID, 0.235, 0.360 );
		rmRiverAddWaypoint(RiverID, 0.245, 0.350 );
		rmRiverAddWaypoint(RiverID, 0.265, 0.340 );
		rmRiverAddWaypoint(RiverID, 0.290, 0.310 );
		rmRiverAddWaypoint(RiverID, 0.300, 0.305 );
		rmRiverAddWaypoint(RiverID, 0.330, 0.288 );
		rmRiverAddWaypoint(RiverID, 0.300, 0.305 );
		rmRiverAddWaypoint(RiverID, 0.340, 0.275 );
		rmRiverAddWaypoint(RiverID, 0.355, 0.270 );
		rmRiverAddWaypoint(RiverID, 0.370, 0.265 );
		rmRiverAddWaypoint(RiverID, 0.380, 0.260 );
		rmRiverAddWaypoint(RiverID, 0.400, 0.265 );
		rmRiverAddWaypoint(RiverID, 0.420, 0.255 );
		rmRiverAddWaypoint(RiverID, 0.445, 0.250 );
		rmRiverAddWaypoint(RiverID, 0.450, 0.249 );
		rmRiverAddWaypoint(RiverID, 0.480, 0.248 );
		rmRiverAddWaypoint(RiverID, 0.500, 0.247 );
		rmRiverAddWaypoint(RiverID, 0.520, 0.249 );
		rmRiverAddWaypoint(RiverID, 0.530, 0.250 );
		rmRiverAddWaypoint(RiverID, 0.550, 0.255 );
		rmRiverAddWaypoint(RiverID, 0.560, 0.257 );
		rmRiverAddWaypoint(RiverID, 0.570, 0.261 );
		rmRiverAddWaypoint(RiverID, 0.590, 0.263 );
		rmRiverAddWaypoint(RiverID, 0.600, 0.267 );
		rmRiverAddWaypoint(RiverID, 0.620, 0.270 );
		rmRiverAddWaypoint(RiverID, 0.630, 0.275 );
		rmRiverAddWaypoint(RiverID, 0.650, 0.278 );
		rmRiverAddWaypoint(RiverID, 0.680, 0.288 );
		rmRiverAddWaypoint(RiverID, 0.690, 0.300 );
		rmRiverAddWaypoint(RiverID, 0.700, 0.305 );
		rmRiverAddWaypoint(RiverID, 0.730, 0.320 );
		rmRiverAddWaypoint(RiverID, 0.740, 0.333 );
		rmRiverAddWaypoint(RiverID, 0.750, 0.345 );
		rmRiverAddWaypoint(RiverID, 0.760, 0.355 );
		rmRiverAddWaypoint(RiverID, 0.770, 0.365 );
		rmRiverAddWaypoint(RiverID, 0.780, 0.375 );
		rmRiverAddWaypoint(RiverID, 0.790, 0.385 );
		rmRiverAddWaypoint(RiverID, 0.800, 0.390 );
		rmRiverAddWaypoint(RiverID, 0.810, 0.405 );
		rmRiverAddWaypoint(RiverID, 0.820, 0.420 );
		rmRiverAddWaypoint(RiverID, 0.830, 0.435 );
		rmRiverAddWaypoint(RiverID, 0.840, 0.450 );
		rmRiverAddWaypoint(RiverID, 0.850, 0.460 );
		rmRiverAddWaypoint(RiverID, 0.855, 0.500 );
		rmRiverAddWaypoint(RiverID, 0.860, 0.510 );
		rmRiverAddWaypoint(RiverID, 0.870, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.875, 0.530 );
		rmRiverAddWaypoint(RiverID, 0.878, 0.540 );
		rmRiverAddWaypoint(RiverID, 0.880, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.881, 0.560 );
		rmRiverAddWaypoint(RiverID, 0.882, 0.570 );
		rmRiverAddWaypoint(RiverID, 0.880, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.878, 0.620 );
		rmRiverAddWaypoint(RiverID, 0.875, 0.640 );
		rmRiverAddWaypoint(RiverID, 0.874, 0.660 );
		rmRiverAddWaypoint(RiverID, 0.871, 0.680 );
		rmRiverAddWaypoint(RiverID, 0.870, 0.700 );
		rmRiverAddWaypoint(RiverID, 0.860, 0.730 );
		rmRiverAddWaypoint(RiverID, 0.850, 0.740 );
		rmRiverAddWaypoint(RiverID, 0.834, 0.730 );/*rmRiverAddWaypoint(RiverID, 0.834, 0.730 );*/
		rmRiverAddWaypoint(RiverID, 0.820, 0.700 );/*rmRiverAddWaypoint(RiverID, 0.829, 0.700 );*/
		rmRiverAddWaypoint(RiverID, 0.815, 0.670 );/*rmRiverAddWaypoint(RiverID, 0.820, 0.670 );*/
		rmRiverAddWaypoint(RiverID, 0.790, 0.660 );
		rmRiverAddWaypoint(RiverID, 0.780, 0.650 );
		rmRiverAddWaypoint(RiverID, 0.760, 0.640 );
		rmRiverAddWaypoint(RiverID, 0.750, 0.620 );
		rmRiverAddWaypoint(RiverID, 0.738, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.720, 0.580 );
		rmRiverAddWaypoint(RiverID, 0.700, 0.570 );
		rmRiverAddWaypoint(RiverID, 0.680, 0.565 );
		rmRiverAddWaypoint(RiverID, 0.670, 0.560 );
		rmRiverAddWaypoint(RiverID, 0.660, 0.555 );
		rmRiverAddWaypoint(RiverID, 0.650, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.640, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.630, 0.545 );
		rmRiverAddWaypoint(RiverID, 0.620, 0.540 );
		rmRiverAddWaypoint(RiverID, 0.610, 0.535 );
		rmRiverAddWaypoint(RiverID, 0.600, 0.530 );
		rmRiverAddWaypoint(RiverID, 0.580, 0.528 );
		rmRiverAddWaypoint(RiverID, 0.560, 0.526 );
		rmRiverAddWaypoint(RiverID, 0.550, 0.525 );
		rmRiverAddWaypoint(RiverID, 0.530, 0.522 );
		rmRiverAddWaypoint(RiverID, 0.520, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.510, 0.519 );
		rmRiverAddWaypoint(RiverID, 0.500, 0.518 );
		rmRiverSetBankNoiseParams(RiverID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(RiverID);
		rmAddAreaToClass(RiverID,rmClassID("Lake"));


		//玩家范围
		float AreaSizePlayer = rmAreaTilesToFraction(700);
		for(i=1; <=cNumberNonGaiaPlayers)
		{
			int id=rmCreateArea("Player"+i);
			rmSetPlayerArea(i, id);
			rmSetAreaWarnFailure(id, false);
			rmSetAreaSize(id, AreaSizePlayer, AreaSizePlayer);
			rmSetAreaLocPlayer(id, i);
			rmSetAreaCoherence(id, 0.85);
			rmSetAreaSmoothDistance(id, 2);
			rmSetAreaMinBlobs(id, 1);
			rmSetAreaMaxBlobs(id, 1);
			rmSetAreaTerrainType(id,PlayerTerrain);
			rmBuildArea(id);
		}


		//定义城镇中心
		int TownCenterID = rmCreateObjectDef("player TC");
		if (rmGetNomadStart())
		{
			rmAddObjectDefItem(TownCenterID, "CoveredWagon", 1, 0.0);
		}
		else
		{
			rmAddObjectDefItem(TownCenterID, "TownCenter", 1, 0);
		}
		rmSetObjectDefMinDistance(TownCenterID, 0.0);
		rmSetObjectDefMaxDistance(TownCenterID, 20.0);
		for(i=1; <=cNumberNonGaiaPlayers)
		{	
			rmPlaceObjectDefAtLoc(TownCenterID, i, rmPlayerLocXFraction(i), rmPlayerLocZFraction(i));
		}


		//定义起始单位(civs.xml定义那些开局单位)
		int startingUnits = rmCreateStartingUnitsObjectDef(5.0);
		rmSetObjectDefMinDistance(startingUnits, 6.0);
		rmSetObjectDefMaxDistance(startingUnits, 10.0);

		for(i=1; <=cNumberNonGaiaPlayers)
		{
			vector TCLocation = rmGetUnitPosition(rmGetUnitPlacedOfPlayer(TownCenterID, i));
			rmPlaceObjectDefAtLoc(startingUnits, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
		}

		




		rmSetStatusText("",0.50);//读取地图进度条





		rmSetStatusText("",1.00);//读取地图进度条


					//愿神兽会保佑你不会出错。
 			/*----------------------------------------------------------------------------------------------*
			*    ┏┓   ┏┓										*
			*   ┏┛┻━━━┛┻┓									*
			*   ┃       ┃									*
			*   ┃   ━   ┃									*
			*   ┃ ┳┛ ┗┳ ┃									*
			*   ┃       ┃									*
			*   ┃   ┻   ┃									*
			*   ┃       ┃									*
			*   ┗━┓   ┏━┛     Code is far away from bug with the animal protecting		*
			*     ┃   ┃    									*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┗━━━┓									*
			*     ┃       ┣┓									*
			*     ┃       ┏┛									*
			*     ┗┓┓┏━┳┓┏┛									*
			*      ┃┫┫ ┃┫┫									*
			*      ┗┻┛ ┗┻┛									*
			*----------------------------------------------------------------------------------------------*/
	} //END




月亮轮廓已经出来了,中间的陆地怎样处理?当然继续用河流挖掉,不过可以创建一个新河流,把半径改大一点。传送门
  Debug.xs - 记事本 ____ X
文件(F)  编辑(E)  格式(O)  查看(V)  帮助(H)
	include "mercenaries.xs";
	include "ypAsianInclude.xs";
	include "ypKOTHInclude.xs";

	void main(void)
	{
		// ---------------------------------------- Map Info -------------------------------------------
		int playerTilesX=13200;			//设定地图X大小
		int playerTilesZ=13200;			//设定地图Z大小(帝国3的Y是高度,Z才是我们平常所用到的Y)


		//如果玩家大于4将playerTilesX与playerTilesZ改为11500(同一个值的int只能出现1次,当你需要修改数值的时候,不能再加入int)
		if (cNumberNonGaiaPlayers >4){	playerTilesX=11500;	playerTilesZ=11500;}



		if (cNumberNonGaiaPlayers >6){	playerTilesX=10500;	playerTilesZ=10500;}		//Modify Map X&Z Size of 6,7,8 Player



		int SizeX = 2*sqrt(cNumberNonGaiaPlayers*playerTilesX);
		int SizeZ = 2*sqrt(cNumberNonGaiaPlayers*playerTilesZ);



		string MapTerrain ="Carolinas\ground_marsh3_car";	//<-------- 地图地形,自己参照剧情编辑器 <--------

		string MapLighting ="319a_Snow";			//<-------- 照明,自己参照剧情编辑器 <--------

		string PlayerTerrain ="Carolinas\ground_marsh1_car";	//<--------- 玩家范围地形 <---------




		//设定地图XZ大小,分别调用上面用int定义的SizeX与SizeZ,即为rmSetMapSize(13200,13200);如果玩家大于4将改为11500
		rmSetMapSize(SizeX, SizeZ);



		rmSetMapElevationParameters(cElevTurbulence, 0.15, 2.5, 0.35, 3.0); // type, frequency, octaves, persistence, variation 

		rmSetMapElevationHeightBlend(1.0);


		//地形初始化,设定地图初始地形,调用上面用string定义MapTerrain,即为"Carolinas\ground_marsh3_car";
		rmTerrainInitialize(MapTerrain,6);



		//设定照明,调用上面用string定义MapLighting,即为"319a_Snow"
		rmSetLightingSet(MapLighting);



		rmSetGlobalRain(0.9);		//设定下雨
		chooseMercs();
		rmSetMapType("yucatan");
		rmSetMapType("water");
		rmSetMapType("default");	//设定地图类型,地图类型影响到宝藏
		rmSetMapType("land");
		rmSetMapType("bayou");
		rmSetSeaLevel(0); // this is height of river surface compared to surrounding land. River depth is in the river XML.

		rmSetStatusText("",0.01);//读取地图进度条



		rmPlacePlayersCircular(0.35, 0.35, 0.0);   	//圆形放置玩家



		
		int RiverRadius = 4.5;		int RiverRadius2 = 8.5;
		if(cNumberNonGaiaPlayers>=3)	{RiverRadius = 5.4;		RiverRadius2 = 10.2;}
		if(cNumberNonGaiaPlayers>=4)	{RiverRadius = 6.2;		RiverRadius2 = 11.7;}
		if(cNumberNonGaiaPlayers>=5)	{RiverRadius = 6.8;		RiverRadius2 = 12.8;}
		if(cNumberNonGaiaPlayers>=6)	{RiverRadius = 7.4;		RiverRadius2 = 14.0;}
		if(cNumberNonGaiaPlayers>=7)	{RiverRadius = 8.0;		RiverRadius2 = 15.2;}
		if(cNumberNonGaiaPlayers>=8)	{RiverRadius = 8.5;		RiverRadius2 = 16.2;}

		rmSetStatusText("",0.08);
	// ---------------------------------------------------------------- River 1 ------------------------------------------------------------------
		string RiverType = "Northwest Territory Water";	
		int RiverID = rmRiverCreate(-1, RiverType, 1, 1, RiverRadius, RiverRadius);
		rmRiverAddWaypoint(RiverID, 0.500, 0.518 );
		rmRiverAddWaypoint(RiverID, 0.478, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.450, 0.525 );
		rmRiverAddWaypoint(RiverID, 0.420, 0.528 );
		rmRiverAddWaypoint(RiverID, 0.400, 0.530 );
		rmRiverAddWaypoint(RiverID, 0.380, 0.540 );
		rmRiverAddWaypoint(RiverID, 0.330, 0.565 );
		rmRiverAddWaypoint(RiverID, 0.300, 0.580 );
		rmRiverAddWaypoint(RiverID, 0.280, 0.590 );
		rmRiverAddWaypoint(RiverID, 0.260, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.240, 0.620 );
		rmRiverAddWaypoint(RiverID, 0.210, 0.640 );
		rmRiverAddWaypoint(RiverID, 0.200, 0.655 );
		rmRiverAddWaypoint(RiverID, 0.180, 0.680 );
		rmRiverAddWaypoint(RiverID, 0.170, 0.700 );
		rmRiverAddWaypoint(RiverID, 0.160, 0.730 );
//		rmRiverAddWaypoint(RiverID, 0.140, 0.725 );
		rmRiverAddWaypoint(RiverID, 0.130, 0.720 );
		rmRiverAddWaypoint(RiverID, 0.125, 0.670 );
		rmRiverAddWaypoint(RiverID, 0.120, 0.650 );
		rmRiverAddWaypoint(RiverID, 0.190, 0.625 );
		rmRiverAddWaypoint(RiverID, 0.195, 0.610 );
		rmRiverAddWaypoint(RiverID, 0.125, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.128, 0.560 );
		rmRiverAddWaypoint(RiverID, 0.129, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.133, 0.533 );
		rmRiverAddWaypoint(RiverID, 0.139, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.140, 0.500 );
		rmRiverAddWaypoint(RiverID, 0.145, 0.480 );
		rmRiverAddWaypoint(RiverID, 0.150, 0.461 );
		rmRiverAddWaypoint(RiverID, 0.160, 0.480 );
		rmRiverAddWaypoint(RiverID, 0.175, 0.430 );
		rmRiverAddWaypoint(RiverID, 0.195, 0.400 );
		rmRiverAddWaypoint(RiverID, 0.218, 0.370 );
		rmRiverAddWaypoint(RiverID, 0.235, 0.360 );
		rmRiverAddWaypoint(RiverID, 0.245, 0.350 );
		rmRiverAddWaypoint(RiverID, 0.265, 0.340 );
		rmRiverAddWaypoint(RiverID, 0.290, 0.310 );
		rmRiverAddWaypoint(RiverID, 0.300, 0.305 );
		rmRiverAddWaypoint(RiverID, 0.330, 0.288 );
		rmRiverAddWaypoint(RiverID, 0.300, 0.305 );
		rmRiverAddWaypoint(RiverID, 0.340, 0.275 );
		rmRiverAddWaypoint(RiverID, 0.355, 0.270 );
		rmRiverAddWaypoint(RiverID, 0.370, 0.265 );
		rmRiverAddWaypoint(RiverID, 0.380, 0.260 );
		rmRiverAddWaypoint(RiverID, 0.400, 0.265 );
		rmRiverAddWaypoint(RiverID, 0.420, 0.255 );
		rmRiverAddWaypoint(RiverID, 0.445, 0.250 );
		rmRiverAddWaypoint(RiverID, 0.450, 0.249 );
		rmRiverAddWaypoint(RiverID, 0.480, 0.248 );
		rmRiverAddWaypoint(RiverID, 0.500, 0.247 );
		rmRiverAddWaypoint(RiverID, 0.520, 0.249 );
		rmRiverAddWaypoint(RiverID, 0.530, 0.250 );
		rmRiverAddWaypoint(RiverID, 0.550, 0.255 );
		rmRiverAddWaypoint(RiverID, 0.560, 0.257 );
		rmRiverAddWaypoint(RiverID, 0.570, 0.261 );
		rmRiverAddWaypoint(RiverID, 0.590, 0.263 );
		rmRiverAddWaypoint(RiverID, 0.600, 0.267 );
		rmRiverAddWaypoint(RiverID, 0.620, 0.270 );
		rmRiverAddWaypoint(RiverID, 0.630, 0.275 );
		rmRiverAddWaypoint(RiverID, 0.650, 0.278 );
		rmRiverAddWaypoint(RiverID, 0.680, 0.288 );
		rmRiverAddWaypoint(RiverID, 0.690, 0.300 );
		rmRiverAddWaypoint(RiverID, 0.700, 0.305 );
		rmRiverAddWaypoint(RiverID, 0.730, 0.320 );
		rmRiverAddWaypoint(RiverID, 0.740, 0.333 );
		rmRiverAddWaypoint(RiverID, 0.750, 0.345 );
		rmRiverAddWaypoint(RiverID, 0.760, 0.355 );
		rmRiverAddWaypoint(RiverID, 0.770, 0.365 );
		rmRiverAddWaypoint(RiverID, 0.780, 0.375 );
		rmRiverAddWaypoint(RiverID, 0.790, 0.385 );
		rmRiverAddWaypoint(RiverID, 0.800, 0.390 );
		rmRiverAddWaypoint(RiverID, 0.810, 0.405 );
		rmRiverAddWaypoint(RiverID, 0.820, 0.420 );
		rmRiverAddWaypoint(RiverID, 0.830, 0.435 );
		rmRiverAddWaypoint(RiverID, 0.840, 0.450 );
		rmRiverAddWaypoint(RiverID, 0.850, 0.460 );
		rmRiverAddWaypoint(RiverID, 0.855, 0.500 );
		rmRiverAddWaypoint(RiverID, 0.860, 0.510 );
		rmRiverAddWaypoint(RiverID, 0.870, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.875, 0.530 );
		rmRiverAddWaypoint(RiverID, 0.878, 0.540 );
		rmRiverAddWaypoint(RiverID, 0.880, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.881, 0.560 );
		rmRiverAddWaypoint(RiverID, 0.882, 0.570 );
		rmRiverAddWaypoint(RiverID, 0.880, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.878, 0.620 );
		rmRiverAddWaypoint(RiverID, 0.875, 0.640 );
		rmRiverAddWaypoint(RiverID, 0.874, 0.660 );
		rmRiverAddWaypoint(RiverID, 0.871, 0.680 );
		rmRiverAddWaypoint(RiverID, 0.870, 0.700 );
		rmRiverAddWaypoint(RiverID, 0.860, 0.730 );
		rmRiverAddWaypoint(RiverID, 0.850, 0.740 );
		rmRiverAddWaypoint(RiverID, 0.834, 0.730 );/*rmRiverAddWaypoint(RiverID, 0.834, 0.730 );*/
		rmRiverAddWaypoint(RiverID, 0.820, 0.700 );/*rmRiverAddWaypoint(RiverID, 0.829, 0.700 );*/
		rmRiverAddWaypoint(RiverID, 0.815, 0.670 );/*rmRiverAddWaypoint(RiverID, 0.820, 0.670 );*/
		rmRiverAddWaypoint(RiverID, 0.790, 0.660 );
		rmRiverAddWaypoint(RiverID, 0.780, 0.650 );
		rmRiverAddWaypoint(RiverID, 0.760, 0.640 );
		rmRiverAddWaypoint(RiverID, 0.750, 0.620 );
		rmRiverAddWaypoint(RiverID, 0.738, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.720, 0.580 );
		rmRiverAddWaypoint(RiverID, 0.700, 0.570 );
		rmRiverAddWaypoint(RiverID, 0.680, 0.565 );
		rmRiverAddWaypoint(RiverID, 0.670, 0.560 );
		rmRiverAddWaypoint(RiverID, 0.660, 0.555 );
		rmRiverAddWaypoint(RiverID, 0.650, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.640, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.630, 0.545 );
		rmRiverAddWaypoint(RiverID, 0.620, 0.540 );
		rmRiverAddWaypoint(RiverID, 0.610, 0.535 );
		rmRiverAddWaypoint(RiverID, 0.600, 0.530 );
		rmRiverAddWaypoint(RiverID, 0.580, 0.528 );
		rmRiverAddWaypoint(RiverID, 0.560, 0.526 );
		rmRiverAddWaypoint(RiverID, 0.550, 0.525 );
		rmRiverAddWaypoint(RiverID, 0.530, 0.522 );
		rmRiverAddWaypoint(RiverID, 0.520, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.510, 0.519 );
		rmRiverAddWaypoint(RiverID, 0.500, 0.518 );
		rmRiverSetBankNoiseParams(RiverID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(RiverID);
		rmAddAreaToClass(RiverID,rmClassID("Lake"));




	// ---------------------------------------------------------------- River 2 ------------------------------------------------------------------
		//这里说一下,int定义的数值是可以用加法的,所以这里半径等于8.5+2=10.5,哪里来的8.5?自己往上面搜索RiverRadius2
		int River2ID = rmRiverCreate(-1, RiverType, 1, 1, RiverRadius2+2, RiverRadius2+2);
		rmRiverAddWaypoint(River2ID, 0.18, 0.60 );
		rmRiverAddWaypoint(River2ID, 0.21, 0.50 );
		rmRiverAddWaypoint(River2ID, 0.32, 0.32 );
		rmRiverAddWaypoint(River2ID, 0.50, 0.31 );
		rmRiverAddWaypoint(River2ID, 0.60, 0.32 );
		rmRiverAddWaypoint(River2ID, 0.70, 0.38 );
		rmRiverAddWaypoint(River2ID, 0.80, 0.50 );
		rmRiverAddWaypoint(River2ID, 0.84, 0.62 );
		rmRiverAddWaypoint(River2ID, 0.77, 0.53 );
		rmRiverAddWaypoint(River2ID, 0.63, 0.47 );
		rmRiverAddWaypoint(River2ID, 0.53, 0.48 );
		rmRiverAddWaypoint(River2ID, 0.45, 0.45 );
		rmRiverAddWaypoint(River2ID, 0.33, 0.50 );
		rmRiverAddWaypoint(River2ID, 0.18, 0.60 );
		rmRiverAddWaypoint(River2ID, 0.38, 0.38 );
		rmRiverAddWaypoint(River2ID, 0.64, 0.42 );
		rmRiverSetBankNoiseParams(River2ID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(River2ID);
	// -------------------------------------------------------------------------------------------------------------------------------------------
		rmSetStatusText("",0.12);
	// ---------------------------------------------------------------- River 3 ------------------------------------------------------------------
		int River3ID = rmRiverCreate(-1, RiverType, 1, 1, RiverRadius, RiverRadius);
		rmRiverAddWaypoint(River3ID, 0.84, 0.62 );
		rmRiverAddWaypoint(River3ID, 0.795, 0.675 );
		rmRiverAddWaypoint(River3ID, 0.87, 0.68 );
		rmRiverSetBankNoiseParams(River2ID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(River3ID);

		int River4ID = rmRiverCreate(-1, RiverType, 1, 1, RiverRadius, RiverRadius);
		rmRiverAddWaypoint(River4ID, 0.18, 0.63 );
		rmRiverAddWaypoint(River4ID, 0.120, 0.635 );
		rmRiverAddWaypoint(River4ID, 0.180, 0.63 );
		rmRiverAddWaypoint(River4ID, 0.170, 0.67 );
		rmRiverSetBankNoiseParams(River4ID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(River4ID);

	// -------------------------------------------------------------------------------------------------------------------------------------------


		//玩家范围
		float AreaSizePlayer = rmAreaTilesToFraction(700);
		for(i=1; <=cNumberNonGaiaPlayers)
		{
			int id=rmCreateArea("Player"+i);
			rmSetPlayerArea(i, id);
			rmSetAreaWarnFailure(id, false);
			rmSetAreaSize(id, AreaSizePlayer, AreaSizePlayer);
			rmSetAreaLocPlayer(id, i);
			rmSetAreaCoherence(id, 0.85);
			rmSetAreaSmoothDistance(id, 2);
			rmSetAreaMinBlobs(id, 1);
			rmSetAreaMaxBlobs(id, 1);
			rmSetAreaTerrainType(id,PlayerTerrain);
			rmBuildArea(id);
		}


		//定义城镇中心
		int TownCenterID = rmCreateObjectDef("player TC");
		if (rmGetNomadStart())
		{
			rmAddObjectDefItem(TownCenterID, "CoveredWagon", 1, 0.0);
		}
		else
		{
			rmAddObjectDefItem(TownCenterID, "TownCenter", 1, 0);
		}
		rmSetObjectDefMinDistance(TownCenterID, 0.0);
		rmSetObjectDefMaxDistance(TownCenterID, 20.0);
		for(i=1; <=cNumberNonGaiaPlayers)
		{	
			rmPlaceObjectDefAtLoc(TownCenterID, i, rmPlayerLocXFraction(i), rmPlayerLocZFraction(i));
		}


		//定义起始单位(civs.xml定义那些开局单位)
		int startingUnits = rmCreateStartingUnitsObjectDef(5.0);
		rmSetObjectDefMinDistance(startingUnits, 6.0);
		rmSetObjectDefMaxDistance(startingUnits, 10.0);

		for(i=1; <=cNumberNonGaiaPlayers)
		{
			vector TCLocation = rmGetUnitPosition(rmGetUnitPlacedOfPlayer(TownCenterID, i));
			rmPlaceObjectDefAtLoc(startingUnits, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
		}

		




		rmSetStatusText("",0.50);//读取地图进度条





		rmSetStatusText("",1.00);//读取地图进度条


					//愿神兽会保佑你不会出错。
 			/*----------------------------------------------------------------------------------------------*
			*    ┏┓   ┏┓										*
			*   ┏┛┻━━━┛┻┓									*
			*   ┃       ┃									*
			*   ┃   ━   ┃									*
			*   ┃ ┳┛ ┗┳ ┃									*
			*   ┃       ┃									*
			*   ┃   ┻   ┃									*
			*   ┃       ┃									*
			*   ┗━┓   ┏━┛     Code is far away from bug with the animal protecting		*
			*     ┃   ┃    									*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┗━━━┓									*
			*     ┃       ┣┓									*
			*     ┃       ┏┛									*
			*     ┗┓┓┏━┳┓┏┛									*
			*      ┃┫┫ ┃┫┫									*
			*      ┗┻┛ ┗┻┛									*
			*----------------------------------------------------------------------------------------------*/
	} //END




接下来给水域添加鱼与海军旗帜(顺便把之前教程的资源全部补上)定义放置限制传送门      水域资源传送门
  Debug.xs - 记事本 ____ X
文件(F)  编辑(E)  格式(O)  查看(V)  帮助(H)
	include "mercenaries.xs";
	include "ypAsianInclude.xs";
	include "ypKOTHInclude.xs";

	void main(void)
	{
		// ---------------------------------------- Map Info -------------------------------------------
		int playerTilesX=13200;			//设定地图X大小
		int playerTilesZ=13200;			//设定地图Z大小(帝国3的Y是高度,Z才是我们平常所用到的Y)


		//如果玩家大于4将playerTilesX与playerTilesZ改为11500(同一个值的int只能出现1次,当你需要修改数值的时候,不能再加入int)
		if (cNumberNonGaiaPlayers >4){	playerTilesX=11500;	playerTilesZ=11500;}



		if (cNumberNonGaiaPlayers >6){	playerTilesX=10500;	playerTilesZ=10500;}		//Modify Map X&Z Size of 6,7,8 Player



		int SizeX = 2*sqrt(cNumberNonGaiaPlayers*playerTilesX);
		int SizeZ = 2*sqrt(cNumberNonGaiaPlayers*playerTilesZ);



		string MapTerrain ="Carolinas\ground_marsh3_car";	//<-------- 地图地形,自己参照剧情编辑器 <--------

		string MapLighting ="319a_Snow";			//<-------- 照明,自己参照剧情编辑器 <--------

		string PlayerTerrain ="Carolinas\ground_marsh1_car";	//<--------- 玩家范围地形 <---------




		//设定地图XZ大小,分别调用上面用int定义的SizeX与SizeZ,即为rmSetMapSize(13200,13200);如果玩家大于4将改为11500
		rmSetMapSize(SizeX, SizeZ);



		rmSetMapElevationParameters(cElevTurbulence, 0.15, 2.5, 0.35, 3.0); // type, frequency, octaves, persistence, variation 

		rmSetMapElevationHeightBlend(1.0);


		//地形初始化,设定地图初始地形,调用上面用string定义MapTerrain,即为"Carolinas\ground_marsh3_car";
		rmTerrainInitialize(MapTerrain,6);



		//设定照明,调用上面用string定义MapLighting,即为"319a_Snow"
		rmSetLightingSet(MapLighting);



		rmSetGlobalRain(0.9);		//设定下雨
		chooseMercs();
		rmSetMapType("yucatan");
		rmSetMapType("water");
		rmSetMapType("default");	//设定地图类型,地图类型影响到宝藏
		rmSetMapType("land");
		rmSetMapType("bayou");
		rmSetSeaLevel(0); // this is height of river surface compared to surrounding land. River depth is in the river XML.

		rmSetStatusText("",0.01);//读取地图进度条

		int classStartingResource = rmDefineClass("startingResource");	
		int PlayerHerd2Class = rmDefineClass("PlayerHerd2C");		
		int classGold = rmDefineClass("Gold");	

		int avoidGold = rmCreateClassDistanceConstraint ("avoid gold", rmClassID("Gold"), 50.0);
		int avoidPlayerHerd2Far = rmCreateClassDistanceConstraint("avoid Player Herd2 far", rmClassID("PlayerHerd2C"), 52.0);
		int avoidStartingResources = rmCreateClassDistanceConstraint("start resources avoid each other2", rmClassID("startingResource"), 4.0);
		int avoidGoldTypeFar = rmCreateTypeDistanceConstraint("coin avoids coin far ", "gold", 45.0);
		int avoidHerdTypeFar = rmCreateTypeDistanceConstraint("herd avoids herd far", "herd", 45.0);
		int avoidTreeType = rmCreateTypeDistanceConstraint("Tree avoids Tree  ", "Tree", 25.0);
		
		

		//设定与带有abstractFish标签的单位最小间隔距离30
		int avoidFish = rmCreateTypeDistanceConstraint("FishToFish", "abstractFish", 30.0);

		//设定与陆地最小间隔距离9
		int avoidFishLand = rmCreateTerrainDistanceConstraint("FishTOLand", "land", true, 9.0);

		int avoidLand = rmCreateTerrainDistanceConstraint("ship avoid land", "land", true, 15.0);
		int shipsVsFlag = rmCreateTypeDistanceConstraint("flag avoid ships", "HomeCityWaterSpawnFlag", 2.0);
		int flagLand = rmCreateTerrainDistanceConstraint("flag vs land", "land", true, 16.0);
		int flagVsFlag = rmCreateTypeDistanceConstraint("flag avoid same", "HomeCityWaterSpawnFlag", 8.0);


		int RiverRadius = 4.5;		int RiverRadius2 = 8.5;
		if(cNumberNonGaiaPlayers>=3)	{RiverRadius = 5.4;		RiverRadius2 = 10.2;}
		if(cNumberNonGaiaPlayers>=4)	{RiverRadius = 6.2;		RiverRadius2 = 11.7;}
		if(cNumberNonGaiaPlayers>=5)	{RiverRadius = 6.8;		RiverRadius2 = 12.8;}
		if(cNumberNonGaiaPlayers>=6)	{RiverRadius = 7.4;		RiverRadius2 = 14.0;}
		if(cNumberNonGaiaPlayers>=7)	{RiverRadius = 8.0;		RiverRadius2 = 15.2;}
		if(cNumberNonGaiaPlayers>=8)	{RiverRadius = 8.5;		RiverRadius2 = 16.2;}

		rmSetStatusText("",0.08);

	// ---------------------------------------------------------------- River 1 ------------------------------------------------------------------
		string RiverType = "Northwest Territory Water";	
		int RiverID = rmRiverCreate(-1, RiverType, 1, 1, RiverRadius, RiverRadius);
		rmRiverAddWaypoint(RiverID, 0.500, 0.518 );
		rmRiverAddWaypoint(RiverID, 0.478, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.450, 0.525 );
		rmRiverAddWaypoint(RiverID, 0.420, 0.528 );
		rmRiverAddWaypoint(RiverID, 0.400, 0.530 );
		rmRiverAddWaypoint(RiverID, 0.380, 0.540 );
		rmRiverAddWaypoint(RiverID, 0.330, 0.565 );
		rmRiverAddWaypoint(RiverID, 0.300, 0.580 );
		rmRiverAddWaypoint(RiverID, 0.280, 0.590 );
		rmRiverAddWaypoint(RiverID, 0.260, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.240, 0.620 );
		rmRiverAddWaypoint(RiverID, 0.210, 0.640 );
		rmRiverAddWaypoint(RiverID, 0.200, 0.655 );
		rmRiverAddWaypoint(RiverID, 0.180, 0.680 );
		rmRiverAddWaypoint(RiverID, 0.170, 0.700 );
		rmRiverAddWaypoint(RiverID, 0.160, 0.730 );
//		rmRiverAddWaypoint(RiverID, 0.140, 0.725 );
		rmRiverAddWaypoint(RiverID, 0.130, 0.720 );
		rmRiverAddWaypoint(RiverID, 0.125, 0.670 );
		rmRiverAddWaypoint(RiverID, 0.120, 0.650 );
		rmRiverAddWaypoint(RiverID, 0.190, 0.625 );
		rmRiverAddWaypoint(RiverID, 0.195, 0.610 );
		rmRiverAddWaypoint(RiverID, 0.125, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.128, 0.560 );
		rmRiverAddWaypoint(RiverID, 0.129, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.133, 0.533 );
		rmRiverAddWaypoint(RiverID, 0.139, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.140, 0.500 );
		rmRiverAddWaypoint(RiverID, 0.145, 0.480 );
		rmRiverAddWaypoint(RiverID, 0.150, 0.461 );
		rmRiverAddWaypoint(RiverID, 0.160, 0.480 );
		rmRiverAddWaypoint(RiverID, 0.175, 0.430 );
		rmRiverAddWaypoint(RiverID, 0.195, 0.400 );
		rmRiverAddWaypoint(RiverID, 0.218, 0.370 );
		rmRiverAddWaypoint(RiverID, 0.235, 0.360 );
		rmRiverAddWaypoint(RiverID, 0.245, 0.350 );
		rmRiverAddWaypoint(RiverID, 0.265, 0.340 );
		rmRiverAddWaypoint(RiverID, 0.290, 0.310 );
		rmRiverAddWaypoint(RiverID, 0.300, 0.305 );
		rmRiverAddWaypoint(RiverID, 0.330, 0.288 );
		rmRiverAddWaypoint(RiverID, 0.300, 0.305 );
		rmRiverAddWaypoint(RiverID, 0.340, 0.275 );
		rmRiverAddWaypoint(RiverID, 0.355, 0.270 );
		rmRiverAddWaypoint(RiverID, 0.370, 0.265 );
		rmRiverAddWaypoint(RiverID, 0.380, 0.260 );
		rmRiverAddWaypoint(RiverID, 0.400, 0.265 );
		rmRiverAddWaypoint(RiverID, 0.420, 0.255 );
		rmRiverAddWaypoint(RiverID, 0.445, 0.250 );
		rmRiverAddWaypoint(RiverID, 0.450, 0.249 );
		rmRiverAddWaypoint(RiverID, 0.480, 0.248 );
		rmRiverAddWaypoint(RiverID, 0.500, 0.247 );
		rmRiverAddWaypoint(RiverID, 0.520, 0.249 );
		rmRiverAddWaypoint(RiverID, 0.530, 0.250 );
		rmRiverAddWaypoint(RiverID, 0.550, 0.255 );
		rmRiverAddWaypoint(RiverID, 0.560, 0.257 );
		rmRiverAddWaypoint(RiverID, 0.570, 0.261 );
		rmRiverAddWaypoint(RiverID, 0.590, 0.263 );
		rmRiverAddWaypoint(RiverID, 0.600, 0.267 );
		rmRiverAddWaypoint(RiverID, 0.620, 0.270 );
		rmRiverAddWaypoint(RiverID, 0.630, 0.275 );
		rmRiverAddWaypoint(RiverID, 0.650, 0.278 );
		rmRiverAddWaypoint(RiverID, 0.680, 0.288 );
		rmRiverAddWaypoint(RiverID, 0.690, 0.300 );
		rmRiverAddWaypoint(RiverID, 0.700, 0.305 );
		rmRiverAddWaypoint(RiverID, 0.730, 0.320 );
		rmRiverAddWaypoint(RiverID, 0.740, 0.333 );
		rmRiverAddWaypoint(RiverID, 0.750, 0.345 );
		rmRiverAddWaypoint(RiverID, 0.760, 0.355 );
		rmRiverAddWaypoint(RiverID, 0.770, 0.365 );
		rmRiverAddWaypoint(RiverID, 0.780, 0.375 );
		rmRiverAddWaypoint(RiverID, 0.790, 0.385 );
		rmRiverAddWaypoint(RiverID, 0.800, 0.390 );
		rmRiverAddWaypoint(RiverID, 0.810, 0.405 );
		rmRiverAddWaypoint(RiverID, 0.820, 0.420 );
		rmRiverAddWaypoint(RiverID, 0.830, 0.435 );
		rmRiverAddWaypoint(RiverID, 0.840, 0.450 );
		rmRiverAddWaypoint(RiverID, 0.850, 0.460 );
		rmRiverAddWaypoint(RiverID, 0.855, 0.500 );
		rmRiverAddWaypoint(RiverID, 0.860, 0.510 );
		rmRiverAddWaypoint(RiverID, 0.870, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.875, 0.530 );
		rmRiverAddWaypoint(RiverID, 0.878, 0.540 );
		rmRiverAddWaypoint(RiverID, 0.880, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.881, 0.560 );
		rmRiverAddWaypoint(RiverID, 0.882, 0.570 );
		rmRiverAddWaypoint(RiverID, 0.880, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.878, 0.620 );
		rmRiverAddWaypoint(RiverID, 0.875, 0.640 );
		rmRiverAddWaypoint(RiverID, 0.874, 0.660 );
		rmRiverAddWaypoint(RiverID, 0.871, 0.680 );
		rmRiverAddWaypoint(RiverID, 0.870, 0.700 );
		rmRiverAddWaypoint(RiverID, 0.860, 0.730 );
		rmRiverAddWaypoint(RiverID, 0.850, 0.740 );
		rmRiverAddWaypoint(RiverID, 0.834, 0.730 );/*rmRiverAddWaypoint(RiverID, 0.834, 0.730 );*/
		rmRiverAddWaypoint(RiverID, 0.820, 0.700 );/*rmRiverAddWaypoint(RiverID, 0.829, 0.700 );*/
		rmRiverAddWaypoint(RiverID, 0.815, 0.670 );/*rmRiverAddWaypoint(RiverID, 0.820, 0.670 );*/
		rmRiverAddWaypoint(RiverID, 0.790, 0.660 );
		rmRiverAddWaypoint(RiverID, 0.780, 0.650 );
		rmRiverAddWaypoint(RiverID, 0.760, 0.640 );
		rmRiverAddWaypoint(RiverID, 0.750, 0.620 );
		rmRiverAddWaypoint(RiverID, 0.738, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.720, 0.580 );
		rmRiverAddWaypoint(RiverID, 0.700, 0.570 );
		rmRiverAddWaypoint(RiverID, 0.680, 0.565 );
		rmRiverAddWaypoint(RiverID, 0.670, 0.560 );
		rmRiverAddWaypoint(RiverID, 0.660, 0.555 );
		rmRiverAddWaypoint(RiverID, 0.650, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.640, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.630, 0.545 );
		rmRiverAddWaypoint(RiverID, 0.620, 0.540 );
		rmRiverAddWaypoint(RiverID, 0.610, 0.535 );
		rmRiverAddWaypoint(RiverID, 0.600, 0.530 );
		rmRiverAddWaypoint(RiverID, 0.580, 0.528 );
		rmRiverAddWaypoint(RiverID, 0.560, 0.526 );
		rmRiverAddWaypoint(RiverID, 0.550, 0.525 );
		rmRiverAddWaypoint(RiverID, 0.530, 0.522 );
		rmRiverAddWaypoint(RiverID, 0.520, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.510, 0.519 );
		rmRiverAddWaypoint(RiverID, 0.500, 0.518 );
		rmRiverSetBankNoiseParams(RiverID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(RiverID);
		rmAddAreaToClass(RiverID,rmClassID("Lake"));




	// ---------------------------------------------------------------- River 2 ------------------------------------------------------------------
		int River2ID = rmRiverCreate(-1, RiverType, 1, 1, RiverRadius2+2, RiverRadius2+2);
		rmRiverAddWaypoint(River2ID, 0.18, 0.60 );
		rmRiverAddWaypoint(River2ID, 0.21, 0.50 );
		rmRiverAddWaypoint(River2ID, 0.32, 0.32 );
		rmRiverAddWaypoint(River2ID, 0.50, 0.31 );
		rmRiverAddWaypoint(River2ID, 0.60, 0.32 );
		rmRiverAddWaypoint(River2ID, 0.70, 0.38 );
		rmRiverAddWaypoint(River2ID, 0.80, 0.50 );
		rmRiverAddWaypoint(River2ID, 0.84, 0.62 );
		rmRiverAddWaypoint(River2ID, 0.77, 0.53 );
		rmRiverAddWaypoint(River2ID, 0.63, 0.47 );
		rmRiverAddWaypoint(River2ID, 0.53, 0.48 );
		rmRiverAddWaypoint(River2ID, 0.45, 0.45 );
		rmRiverAddWaypoint(River2ID, 0.33, 0.50 );
		rmRiverAddWaypoint(River2ID, 0.18, 0.60 );
		rmRiverAddWaypoint(River2ID, 0.38, 0.38 );
		rmRiverAddWaypoint(River2ID, 0.64, 0.42 );
		rmRiverSetBankNoiseParams(River2ID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(River2ID);
	// -------------------------------------------------------------------------------------------------------------------------------------------
		rmSetStatusText("",0.12);
	// ---------------------------------------------------------------- River 3 ------------------------------------------------------------------
		int River3ID = rmRiverCreate(-1, RiverType, 1, 1, RiverRadius, RiverRadius);
		rmRiverAddWaypoint(River3ID, 0.84, 0.62 );
		rmRiverAddWaypoint(River3ID, 0.795, 0.675 );
		rmRiverAddWaypoint(River3ID, 0.87, 0.68 );
		rmRiverSetBankNoiseParams(River2ID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(River3ID);

		int River4ID = rmRiverCreate(-1, RiverType, 1, 1, RiverRadius, RiverRadius);
		rmRiverAddWaypoint(River4ID, 0.18, 0.63 );
		rmRiverAddWaypoint(River4ID, 0.120, 0.635 );
		rmRiverAddWaypoint(River4ID, 0.180, 0.63 );
		rmRiverAddWaypoint(River4ID, 0.170, 0.67 );
		rmRiverSetBankNoiseParams(River4ID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(River4ID);

	// -------------------------------------------------------------------------------------------------------------------------------------------



		rmPlacePlayersCircular(0.35, 0.35, 0.0);   	//圆形放置玩家


		//玩家范围
		float AreaSizePlayer = rmAreaTilesToFraction(700);
		for(i=1; <=cNumberNonGaiaPlayers)
		{
			int id=rmCreateArea("Player"+i);
			rmSetPlayerArea(i, id);
			rmSetAreaWarnFailure(id, false);
			rmSetAreaSize(id, AreaSizePlayer, AreaSizePlayer);
			rmSetAreaLocPlayer(id, i);
			rmSetAreaCoherence(id, 0.85);
			rmSetAreaSmoothDistance(id, 2);
			rmSetAreaMinBlobs(id, 1);
			rmSetAreaMaxBlobs(id, 1);
			rmSetAreaTerrainType(id,PlayerTerrain);
			rmBuildArea(id);
		}
		
		//定义城镇中心
		int TownCenterID = rmCreateObjectDef("player TC");
		if (rmGetNomadStart())
		{
			rmAddObjectDefItem(TownCenterID, "CoveredWagon", 1, 0.0);
		}
		else
		{
			rmAddObjectDefItem(TownCenterID, "TownCenter", 1, 0);
		}
		rmSetObjectDefMinDistance(TownCenterID, 0.0);
		rmSetObjectDefMaxDistance(TownCenterID, 20.0);
		for(i=1; <=cNumberNonGaiaPlayers)
		{	
			rmPlaceObjectDefAtLoc(TownCenterID, i, rmPlayerLocXFraction(i), rmPlayerLocZFraction(i));
		}


		//定义起始单位(civs.xml定义那些开局单位)
		int startingUnits = rmCreateStartingUnitsObjectDef(5.0);
		rmSetObjectDefMinDistance(startingUnits, 6.0);
		rmSetObjectDefMaxDistance(startingUnits, 10.0);



		int playerherdID = rmCreateObjectDef("starting herd");
		rmAddObjectDefItem(playerherdID, "ypWildElephant", 10, 6.0);
		rmSetObjectDefMinDistance(playerherdID, 8.0);
		rmSetObjectDefMaxDistance(playerherdID, 12.0);
		rmSetObjectDefCreateHerd(playerherdID, true);
		rmAddObjectDefToClass(playerherdID, classStartingResource);
		rmAddObjectDefConstraint(playerherdID, avoidStartingResources);




		int playergoldID = rmCreateObjectDef("player mine");
		rmAddObjectDefItem(playergoldID, "Minegold", 1, 6);
		rmSetObjectDefMinDistance(playergoldID, 18.0);
		rmSetObjectDefMaxDistance(playergoldID, 22.0);
		rmAddObjectDefToClass(playergoldID, rmDefineClass("startingResource"));
		rmAddObjectDefToClass(playergoldID, classGold);
		rmAddObjectDefConstraint(playergoldID, avoidStartingResources);

		string PlayerTreeType ="TreeRedwood";
		int PlayerTreeCount = 8;

		int playerTree1ID = rmCreateObjectDef("player trees");
		rmAddObjectDefItem(playerTree1ID, PlayerTreeType, PlayerTreeCount, 8.0);
		rmSetObjectDefMinDistance(playerTree1ID, 6);
		rmSetObjectDefMaxDistance(playerTree1ID, 12);
		rmAddObjectDefToClass(playerTree1ID, classStartingResource);
		rmAddObjectDefConstraint(playerTree1ID, avoidStartingResources);



		int playerBerryID=rmCreateObjectDef("player berries");
		rmAddObjectDefItem(playerBerryID, "BerryBush", rmRandInt(3,4), 3.0);
		rmSetObjectDefMinDistance(playerBerryID, 12);
		rmSetObjectDefMaxDistance(playerBerryID, 14);
		rmAddObjectDefToClass(playerBerryID, classStartingResource);
		rmAddObjectDefConstraint(playerBerryID, avoidStartingResources);
		
		
		int playerHerd2ID = rmCreateObjectDef("player Herd2");
		rmAddObjectDefItem(playerHerd2ID, "Bison", rmRandInt(10,11), 10.0);
		rmSetObjectDefMinDistance(playerHerd2ID, 36);
		rmSetObjectDefMaxDistance(playerHerd2ID, 38);
		rmSetObjectDefCreateHerd(playerHerd2ID, true);
		rmAddObjectDefToClass(playerHerd2ID, PlayerHerd2Class);



		
		int playerHerd3ID = rmCreateObjectDef("player Herd3");
		rmAddObjectDefItem(playerHerd3ID, "Turkey", rmRandInt(8,9), 8.0);
		rmSetObjectDefMinDistance(playerHerd3ID, 40);
		rmSetObjectDefMaxDistance(playerHerd3ID, 42);
		rmSetObjectDefCreateHerd(playerHerd3ID, true);
		rmAddObjectDefConstraint(playerHerd3ID, avoidPlayerHerd2Far);



		int playergold2ID = rmCreateObjectDef("player second mine");
		rmAddObjectDefItem(playergold2ID, "mine", 1, 0);
		rmSetObjectDefMinDistance(playergold2ID, 58.0);
		rmSetObjectDefMaxDistance(playergold2ID, 62.0);
		rmAddObjectDefToClass(playergold2ID, classGold);
		rmAddObjectDefConstraint(playergold2ID, avoidGold);
		

		
		int playergold3ID = rmCreateObjectDef("player third mine");
		rmAddObjectDefItem(playergold3ID, "mine", 1, 0);
		rmSetObjectDefMinDistance(playergold3ID, 68.0);
		rmSetObjectDefMaxDistance(playergold3ID, 70.0);
		rmAddObjectDefToClass(playergold3ID, classGold);
		rmAddObjectDefConstraint(playergold3ID, avoidGold);

		for(i=1; <=cNumberNonGaiaPlayers)
		{
			vector TCLocation = rmGetUnitPosition(rmGetUnitPlacedOfPlayer(TownCenterID, i));
			rmPlaceObjectDefAtLoc(startingUnits, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
			rmPlaceObjectDefAtLoc(playerherdID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
			rmPlaceObjectDefAtLoc(playerTree1ID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
			rmPlaceObjectDefAtLoc(playergoldID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
			rmPlaceObjectDefAtLoc(playerBerryID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
		
			rmPlaceObjectDefAtLoc(playerHerd2ID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
			rmPlaceObjectDefAtLoc(playerHerd3ID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
			rmPlaceObjectDefAtLoc(playergold2ID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
			rmPlaceObjectDefAtLoc(playergold3ID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
		
		}
		

			int NativeCenterID = rmCreateGrouping("Native Center ID", "native aztec village "+rmRandInt(rmRandInt(1,2),rmRandInt(3,rmRandInt(4,5))));
			rmSetGroupingMinDistance(NativeCenterID, 0.0);
			rmSetGroupingMaxDistance(NativeCenterID, rmXFractionToMeters(0.0));
			rmAddGroupingToClass(NativeCenterID, rmDefineClass("natives"));
			rmPlaceGroupingAtLoc(NativeCenterID, 0,0.50,0.50);







		int FixedGunID = rmCreateObjectDef("FixedGun");
		rmAddObjectDefItem(FixedGunID, "SPCFixedGun",1,5.0);
		rmSetObjectDefMinDistance(FixedGunID,0.0);
		rmSetObjectDefMaxDistance(FixedGunID,30.0);
		rmPlaceObjectDefAtLoc(FixedGunID,0,0.50,0.50,1);


		for(i=0; <= cNumberNonGaiaPlayers*3)
		{
			int goldID = rmCreateObjectDef("gold"+i);
			rmAddObjectDefItem(goldID, "mine", 1, 0.0);
			rmSetObjectDefMinDistance(goldID, rmXFractionToMeters(0.0));
			rmSetObjectDefMaxDistance(goldID, rmXFractionToMeters(0.5));
			rmAddObjectDefToClass(goldID, classGold);
			rmAddObjectDefConstraint(goldID, avoidGoldTypeFar);
			rmPlaceObjectDefAtLoc(goldID, 0, 0.50, 0.50);
		}





		int CenterHerdID = rmCreateObjectDef("Center Herd2");
		rmAddObjectDefItem(CenterHerdID, "BighornSheep",10, 8.0);
		rmSetObjectDefMinDistance(CenterHerdID, rmXFractionToMeters(0.0));
		rmSetObjectDefMaxDistance(CenterHerdID, rmXFractionToMeters(0.45));
		rmSetObjectDefCreateHerd(CenterHerdID, true);
		rmAddObjectDefConstraint(CenterHerdID, avoidHerdTypeFar);


		for(i=1; <= cNumberNonGaiaPlayers*3)
		{
		rmPlaceObjectDefAtLoc(CenterHerdID, 0, 0.50, 0.50);
		}


			int GreenForestTreeObjectID = rmCreateObjectDef("Object Green forest trees");
			rmAddObjectDefItem(GreenForestTreeObjectID, "TreeRedwood", 8, 15);
			rmAddObjectDefItem(GreenForestTreeObjectID, "TreeRedwood", 3, 5);
			rmAddObjectDefItem(GreenForestTreeObjectID, "UnderbrushCalifornia", 3, 10);
			rmSetObjectDefMinDistance(GreenForestTreeObjectID,  rmXFractionToMeters(0.0));
			rmSetObjectDefMaxDistance(GreenForestTreeObjectID,  rmXFractionToMeters(0.47));
			rmAddObjectDefConstraint(GreenForestTreeObjectID, avoidTreeType);
			rmPlaceObjectDefAtLoc(GreenForestTreeObjectID, 0, 0.50, 0.50, cNumberNonGaiaPlayers*20);

		rmSetStatusText("",0.50);//读取地图进度条


			int avoidNative = rmCreateClassDistanceConstraint("avoid Native", rmClassID("natives"), 52.0);
			int avoidGoldTypeMin = rmCreateTypeDistanceConstraint("coin avoids coin Min", "gold", 15.0);
			int avoidTreeTypeMin = rmCreateTypeDistanceConstraint("Tree avoids Min", "Tree", 15.0);


			int NativeCenter2ID = rmCreateGrouping("Native Center ID", "native aztec village "+rmRandInt(rmRandInt(1,2),rmRandInt(3,rmRandInt(4,5))));
			rmSetGroupingMinDistance(NativeCenter2ID, 0.0);
			rmSetGroupingMaxDistance(NativeCenter2ID, rmXFractionToMeters(0.5));
			rmAddGroupingToClass(NativeCenter2ID, rmDefineClass("natives"));

			rmAddGroupingConstraint(NativeCenter2ID, avoidNative);
			rmAddGroupingConstraint(NativeCenter2ID, avoidGoldTypeMin);
			rmAddGroupingConstraint(NativeCenter2ID, avoidTreeTypeMin);
			rmPlaceGroupingAtLoc(NativeCenter2ID, 0,0.50,0.50,3);


		



		int FountainID=rmCreateObjectDef("FountainOfYouth");		//青春之泉
		rmAddObjectDefItem(FountainID, "SPCFountainOfYouth", 1, 0.0);
		rmSetObjectDefMinDistance(FountainID, 0.0);
		rmSetObjectDefMaxDistance(FountainID, 10);
		rmAddObjectDefConstraint(FountainID, avoidFishLand);
		rmPlaceObjectDefAtLoc(FountainID, 0, 0.50, 0.45, 1);

		int Fish1count = cNumberPlayers * 3;	string Fish1Name = "FishMoonBass";
		int Fish2count = cNumberPlayers * 3;	string Fish2Name = "FishMoonBass";
		int whalecount = (cNumberNonGaiaPlayers * 3) + rmRandInt(1,2);
		int Junkcount = cNumberPlayers;
		int RandomJunk = rmRandInt(0,1);
		//蓝色文字是海军旗帜的语句
		int waterSpawnPointID = rmCreateObjectDef("Flag");
		rmAddObjectDefItem(waterSpawnPointID, "HomeCityWaterSpawnFlag", 1, 0.0);
		rmSetObjectDefMaxDistance(waterSpawnPointID, 30);
		rmAddClosestPointConstraint(flagVsFlag);
		rmAddClosestPointConstraint(flagLand);

		for(i=1; <cNumberPlayers)
		{
			int ShipsID = rmCreateObjectDef("Ships"+i);		//这个是两个玩家的情况下给每个玩家创建1只独木舟。

			//这是一种没有出现过的if判断国家方法,总之我的语句很高级就对了。你去命令章节看下国家ID应该会明白是什么。
			if (rmGetPlayerCiv(i) <= 13 && rmGetPlayerCiv(i) != 8)
			{
				rmAddObjectDefItem(ShipsID,"Canoe", 1, 10.0);
			}
			else if (rmGetPlayerCiv(i) == 8)
			{
				rmAddObjectDefItem(ShipsID,"Canoe", 1, 10.0);
			}
			else if (rmGetPlayerCiv(i) >= 14 && rmGetPlayerCiv(i) <= 17)
			{
				rmAddObjectDefItem(ShipsID,"Canoe", 1, 10.0);
			}
			else if (rmGetPlayerCiv(i) == 19 || rmGetPlayerCiv(i) == 22 || rmGetPlayerCiv(i) == 26)
			{
				rmAddObjectDefItem(ShipsID,"Canoe", 1, 10.0);
			}
			else if (rmGetPlayerCiv(i) == 20 || rmGetPlayerCiv(i) == 23)
			{
				rmAddObjectDefItem(ShipsID,"Canoe", 1, 10.0);
			}
			else
			{
				rmAddObjectDefItem(ShipsID,"Canoe", 1, 10.0);
			}
			rmSetObjectDefMaxDistance(ShipsID, 30);
			rmAddClosestPointConstraint(shipsVsFlag);
			rmAddClosestPointConstraint(flagLand);
			
			
//留意下这里的TCLocationclosestPoint,(之前已经解释过vector了,这里不再解释)一个有用vector,另一个没有使用vector,为什么TCLocation没有使用vector呢?因为在上面已经用vector定义过1次了,所以再次使用TCLocation无需加上vector,而closestPoint在此之前没有出现过就要加上vector定义。 //还有TownCenterID,这个是我设定的城镇中心,别的地图可能不是这样设定,它可能是TCID(实际上什么可能都有,反正是随便定义的),如果复制到别的地图里面去,找不到TownCenterID这个定义,那么恭喜你,你的地图打不开了,(解决办法是把TownCenterID改成那幅地图的放置城镇中心设定的定义)。这两个地方非常容易出错,不容易察觉,所以在此提醒你;如果你碰上复制后打不开地图的情况,你却怎样找也找不到原因,我保证你肯定想砸电脑。
TCLocation = rmGetUnitPosition(rmGetUnitPlacedOfPlayer(TownCenterID, i)); vector closestPoint = rmFindClosestPointVector(TCLocation, rmXFractionToMeters(1.0)); rmPlaceObjectDefAtLoc(waterSpawnPointID, i, rmXMetersToFraction(xsVectorGetX(closestPoint)), rmZMetersToFraction(xsVectorGetZ(closestPoint))); if(cNumberNonGaiaPlayers == 2) { rmPlaceObjectDefAtLoc(ShipsID, i, rmXMetersToFraction(xsVectorGetX(closestPoint)), rmZMetersToFraction(xsVectorGetZ(closestPoint))); } } rmClearClosestPointConstraints(); rmSetStatusText("",0.80); int Fisch1=rmCreateObjectDef("Fish 1"); rmAddObjectDefItem(Fisch1, Fish1Name, 1, 0.0); rmSetObjectDefMinDistance(Fisch1, 0.3); rmSetObjectDefMaxDistance(Fisch1, rmXFractionToMeters(0.5)); rmAddObjectDefConstraint(Fisch1, avoidFish); rmAddObjectDefConstraint(Fisch1, avoidFishLand); rmPlaceObjectDefAtLoc(Fisch1, 0, 0.5, 0.5, Fish1count); int Fisch2=rmCreateObjectDef("Fish 2"); rmAddObjectDefItem(Fisch2, Fish2Name, 1, 0.0); rmSetObjectDefMinDistance(Fisch2, 0.3); rmSetObjectDefMaxDistance(Fisch2, rmXFractionToMeters(0.5)); rmAddObjectDefConstraint(Fisch2, avoidFish); rmAddObjectDefConstraint(Fisch2, avoidFishLand); rmPlaceObjectDefAtLoc(Fisch2, 0, 0.5, 0.5, Fish2count);
rmSetStatusText("",1.00);//读取地图进度条 //愿神兽会保佑你不会出错。 /*----------------------------------------------------------------------------------------------* *    ┏┓   ┏┓ * *   ┏┛┻━━━┛┻┓ * *   ┃       ┃ * *   ┃   ━   ┃ * *   ┃ ┳┛ ┗┳ ┃ * *   ┃       ┃ * *   ┃   ┻   ┃ * *   ┃       ┃ * *   ┗━┓   ┏━┛ Code is far away from bug with the animal protecting * *     ┃   ┃ * *     ┃   ┃ * *     ┃   ┃ * *     ┃   ┃ * *     ┃   ┃ * *     ┃   ┗━━━┓ * *     ┃       ┣┓ * *     ┃       ┏┛ * *     ┗┓┓┏━┳┓┏┛ * *      ┃┫┫ ┃┫┫ * *      ┗┻┛ ┗┻┛ * *----------------------------------------------------------------------------------------------*/ } //END





如果嫌土著、树木、猎物离水域太近的话,可以给他们加个与水域最小间隔限制。传送门
另外,补充一点,猎物生成点离水域太近可能会导致只生成一部分,例如你设定12只鹿,只生成了2只,剩下的都被水域吃了(他们的生成点在水里面,鹿不能下水),无法放置。
  Debug.xs - 记事本 ____ X
文件(F)  编辑(E)  格式(O)  查看(V)  帮助(H)
	include "mercenaries.xs";
	include "ypAsianInclude.xs";
	include "ypKOTHInclude.xs";

	void main(void)
	{
		// ---------------------------------------- Map Info -------------------------------------------
		int playerTilesX=13200;			//设定地图X大小
		int playerTilesZ=13200;			//设定地图Z大小(帝国3的Y是高度,Z才是我们平常所用到的Y)


		//如果玩家大于4将playerTilesX与playerTilesZ改为11500(同一个值的int只能出现1次,当你需要修改数值的时候,不能再加入int)
		if (cNumberNonGaiaPlayers >4){	playerTilesX=11500;	playerTilesZ=11500;}



		if (cNumberNonGaiaPlayers >6){	playerTilesX=10500;	playerTilesZ=10500;}		//Modify Map X&Z Size of 6,7,8 Player



		int SizeX = 2*sqrt(cNumberNonGaiaPlayers*playerTilesX);
		int SizeZ = 2*sqrt(cNumberNonGaiaPlayers*playerTilesZ);



		string MapTerrain ="Carolinas\ground_marsh3_car";	//<-------- 地图地形,自己参照剧情编辑器 <--------

		string MapLighting ="319a_Snow";			//<-------- 照明,自己参照剧情编辑器 <--------

		string PlayerTerrain ="Carolinas\ground_marsh1_car";	//<--------- 玩家范围地形 <---------




		//设定地图XZ大小,分别调用上面用int定义的SizeX与SizeZ,即为rmSetMapSize(13200,13200);如果玩家大于4将改为11500
		rmSetMapSize(SizeX, SizeZ);



		rmSetMapElevationParameters(cElevTurbulence, 0.15, 2.5, 0.35, 3.0); // type, frequency, octaves, persistence, variation 

		rmSetMapElevationHeightBlend(1.0);


		//地形初始化,设定地图初始地形,调用上面用string定义MapTerrain,即为"Carolinas\ground_marsh3_car";
		rmTerrainInitialize(MapTerrain,6);



		//设定照明,调用上面用string定义MapLighting,即为"319a_Snow"
		rmSetLightingSet(MapLighting);



		rmSetGlobalRain(0.9);		//设定下雨
		chooseMercs();
		rmSetMapType("yucatan");
		rmSetMapType("water");
		rmSetMapType("default");	//设定地图类型,地图类型影响到宝藏
		rmSetMapType("land");
		rmSetMapType("bayou");
		rmSetSeaLevel(0); // this is height of river surface compared to surrounding land. River depth is in the river XML.

		rmSetStatusText("",0.01);//读取地图进度条

		int classStartingResource = rmDefineClass("startingResource");	
		int PlayerHerd2Class = rmDefineClass("PlayerHerd2C");		
		int classGold = rmDefineClass("Gold");	

		int avoidGold = rmCreateClassDistanceConstraint ("avoid gold", rmClassID("Gold"), 50.0);
		int avoidPlayerHerd2Far = rmCreateClassDistanceConstraint("avoid Player Herd2 far", rmClassID("PlayerHerd2C"), 52.0);
		int avoidStartingResources = rmCreateClassDistanceConstraint("start resources avoid each other2", rmClassID("startingResource"), 4.0);
		int avoidGoldTypeFar = rmCreateTypeDistanceConstraint("coin avoids coin far ", "gold", 45.0);
		int avoidHerdTypeFar = rmCreateTypeDistanceConstraint("herd avoids herd far", "herd", 45.0);
		int avoidTreeType = rmCreateTypeDistanceConstraint("Tree avoids Tree  ", "Tree", 25.0);
		
		

		//设定与带有abstractFish标签的单位最小间隔距离30
		int avoidFish = rmCreateTypeDistanceConstraint("FishToFish", "abstractFish", 30.0);

		//设定与陆地最小间隔距离9
		int avoidFishLand = rmCreateTerrainDistanceConstraint("FishTOLand", "land", true, 9.0);

		int avoidLand = rmCreateTerrainDistanceConstraint("ship avoid land", "land", true, 15.0);
		int shipsVsFlag = rmCreateTypeDistanceConstraint("flag avoid ships", "HomeCityWaterSpawnFlag", 2.0);
		int flagLand = rmCreateTerrainDistanceConstraint("flag vs land", "land", true, 16.0);
		int flagVsFlag = rmCreateTypeDistanceConstraint("flag avoid same", "HomeCityWaterSpawnFlag", 8.0);

		
		//与水域最小间隔距离为12
		int avoidWaterMin = rmCreateTerrainDistanceConstraint("avoid Lake Min", "water", true, 12.0);
		//数量太多了,自己按ctrl+F往下面搜索avoidWaterMin,其实就是给每一组单位都添加了这个avoidWaterMin放置限制


		int RiverRadius = 4.5;		int RiverRadius2 = 8.5;
		if(cNumberNonGaiaPlayers>=3)	{RiverRadius = 5.4;		RiverRadius2 = 10.2;}
		if(cNumberNonGaiaPlayers>=4)	{RiverRadius = 6.2;		RiverRadius2 = 11.7;}
		if(cNumberNonGaiaPlayers>=5)	{RiverRadius = 6.8;		RiverRadius2 = 12.8;}
		if(cNumberNonGaiaPlayers>=6)	{RiverRadius = 7.4;		RiverRadius2 = 14.0;}
		if(cNumberNonGaiaPlayers>=7)	{RiverRadius = 8.0;		RiverRadius2 = 15.2;}
		if(cNumberNonGaiaPlayers>=8)	{RiverRadius = 8.5;		RiverRadius2 = 16.2;}

		rmSetStatusText("",0.08);

	// ---------------------------------------------------------------- River 1 ------------------------------------------------------------------
		string RiverType = "Northwest Territory Water";	
		int RiverID = rmRiverCreate(-1, RiverType, 1, 1, RiverRadius, RiverRadius);
		rmRiverAddWaypoint(RiverID, 0.500, 0.518 );
		rmRiverAddWaypoint(RiverID, 0.478, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.450, 0.525 );
		rmRiverAddWaypoint(RiverID, 0.420, 0.528 );
		rmRiverAddWaypoint(RiverID, 0.400, 0.530 );
		rmRiverAddWaypoint(RiverID, 0.380, 0.540 );
		rmRiverAddWaypoint(RiverID, 0.330, 0.565 );
		rmRiverAddWaypoint(RiverID, 0.300, 0.580 );
		rmRiverAddWaypoint(RiverID, 0.280, 0.590 );
		rmRiverAddWaypoint(RiverID, 0.260, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.240, 0.620 );
		rmRiverAddWaypoint(RiverID, 0.210, 0.640 );
		rmRiverAddWaypoint(RiverID, 0.200, 0.655 );
		rmRiverAddWaypoint(RiverID, 0.180, 0.680 );
		rmRiverAddWaypoint(RiverID, 0.170, 0.700 );
		rmRiverAddWaypoint(RiverID, 0.160, 0.730 );
//		rmRiverAddWaypoint(RiverID, 0.140, 0.725 );
		rmRiverAddWaypoint(RiverID, 0.130, 0.720 );
		rmRiverAddWaypoint(RiverID, 0.125, 0.670 );
		rmRiverAddWaypoint(RiverID, 0.120, 0.650 );
		rmRiverAddWaypoint(RiverID, 0.190, 0.625 );
		rmRiverAddWaypoint(RiverID, 0.195, 0.610 );
		rmRiverAddWaypoint(RiverID, 0.125, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.128, 0.560 );
		rmRiverAddWaypoint(RiverID, 0.129, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.133, 0.533 );
		rmRiverAddWaypoint(RiverID, 0.139, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.140, 0.500 );
		rmRiverAddWaypoint(RiverID, 0.145, 0.480 );
		rmRiverAddWaypoint(RiverID, 0.150, 0.461 );
		rmRiverAddWaypoint(RiverID, 0.160, 0.480 );
		rmRiverAddWaypoint(RiverID, 0.175, 0.430 );
		rmRiverAddWaypoint(RiverID, 0.195, 0.400 );
		rmRiverAddWaypoint(RiverID, 0.218, 0.370 );
		rmRiverAddWaypoint(RiverID, 0.235, 0.360 );
		rmRiverAddWaypoint(RiverID, 0.245, 0.350 );
		rmRiverAddWaypoint(RiverID, 0.265, 0.340 );
		rmRiverAddWaypoint(RiverID, 0.290, 0.310 );
		rmRiverAddWaypoint(RiverID, 0.300, 0.305 );
		rmRiverAddWaypoint(RiverID, 0.330, 0.288 );
		rmRiverAddWaypoint(RiverID, 0.300, 0.305 );
		rmRiverAddWaypoint(RiverID, 0.340, 0.275 );
		rmRiverAddWaypoint(RiverID, 0.355, 0.270 );
		rmRiverAddWaypoint(RiverID, 0.370, 0.265 );
		rmRiverAddWaypoint(RiverID, 0.380, 0.260 );
		rmRiverAddWaypoint(RiverID, 0.400, 0.265 );
		rmRiverAddWaypoint(RiverID, 0.420, 0.255 );
		rmRiverAddWaypoint(RiverID, 0.445, 0.250 );
		rmRiverAddWaypoint(RiverID, 0.450, 0.249 );
		rmRiverAddWaypoint(RiverID, 0.480, 0.248 );
		rmRiverAddWaypoint(RiverID, 0.500, 0.247 );
		rmRiverAddWaypoint(RiverID, 0.520, 0.249 );
		rmRiverAddWaypoint(RiverID, 0.530, 0.250 );
		rmRiverAddWaypoint(RiverID, 0.550, 0.255 );
		rmRiverAddWaypoint(RiverID, 0.560, 0.257 );
		rmRiverAddWaypoint(RiverID, 0.570, 0.261 );
		rmRiverAddWaypoint(RiverID, 0.590, 0.263 );
		rmRiverAddWaypoint(RiverID, 0.600, 0.267 );
		rmRiverAddWaypoint(RiverID, 0.620, 0.270 );
		rmRiverAddWaypoint(RiverID, 0.630, 0.275 );
		rmRiverAddWaypoint(RiverID, 0.650, 0.278 );
		rmRiverAddWaypoint(RiverID, 0.680, 0.288 );
		rmRiverAddWaypoint(RiverID, 0.690, 0.300 );
		rmRiverAddWaypoint(RiverID, 0.700, 0.305 );
		rmRiverAddWaypoint(RiverID, 0.730, 0.320 );
		rmRiverAddWaypoint(RiverID, 0.740, 0.333 );
		rmRiverAddWaypoint(RiverID, 0.750, 0.345 );
		rmRiverAddWaypoint(RiverID, 0.760, 0.355 );
		rmRiverAddWaypoint(RiverID, 0.770, 0.365 );
		rmRiverAddWaypoint(RiverID, 0.780, 0.375 );
		rmRiverAddWaypoint(RiverID, 0.790, 0.385 );
		rmRiverAddWaypoint(RiverID, 0.800, 0.390 );
		rmRiverAddWaypoint(RiverID, 0.810, 0.405 );
		rmRiverAddWaypoint(RiverID, 0.820, 0.420 );
		rmRiverAddWaypoint(RiverID, 0.830, 0.435 );
		rmRiverAddWaypoint(RiverID, 0.840, 0.450 );
		rmRiverAddWaypoint(RiverID, 0.850, 0.460 );
		rmRiverAddWaypoint(RiverID, 0.855, 0.500 );
		rmRiverAddWaypoint(RiverID, 0.860, 0.510 );
		rmRiverAddWaypoint(RiverID, 0.870, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.875, 0.530 );
		rmRiverAddWaypoint(RiverID, 0.878, 0.540 );
		rmRiverAddWaypoint(RiverID, 0.880, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.881, 0.560 );
		rmRiverAddWaypoint(RiverID, 0.882, 0.570 );
		rmRiverAddWaypoint(RiverID, 0.880, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.878, 0.620 );
		rmRiverAddWaypoint(RiverID, 0.875, 0.640 );
		rmRiverAddWaypoint(RiverID, 0.874, 0.660 );
		rmRiverAddWaypoint(RiverID, 0.871, 0.680 );
		rmRiverAddWaypoint(RiverID, 0.870, 0.700 );
		rmRiverAddWaypoint(RiverID, 0.860, 0.730 );
		rmRiverAddWaypoint(RiverID, 0.850, 0.740 );
		rmRiverAddWaypoint(RiverID, 0.834, 0.730 );/*rmRiverAddWaypoint(RiverID, 0.834, 0.730 );*/
		rmRiverAddWaypoint(RiverID, 0.820, 0.700 );/*rmRiverAddWaypoint(RiverID, 0.829, 0.700 );*/
		rmRiverAddWaypoint(RiverID, 0.815, 0.670 );/*rmRiverAddWaypoint(RiverID, 0.820, 0.670 );*/
		rmRiverAddWaypoint(RiverID, 0.790, 0.660 );
		rmRiverAddWaypoint(RiverID, 0.780, 0.650 );
		rmRiverAddWaypoint(RiverID, 0.760, 0.640 );
		rmRiverAddWaypoint(RiverID, 0.750, 0.620 );
		rmRiverAddWaypoint(RiverID, 0.738, 0.600 );
		rmRiverAddWaypoint(RiverID, 0.720, 0.580 );
		rmRiverAddWaypoint(RiverID, 0.700, 0.570 );
		rmRiverAddWaypoint(RiverID, 0.680, 0.565 );
		rmRiverAddWaypoint(RiverID, 0.670, 0.560 );
		rmRiverAddWaypoint(RiverID, 0.660, 0.555 );
		rmRiverAddWaypoint(RiverID, 0.650, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.640, 0.550 );
		rmRiverAddWaypoint(RiverID, 0.630, 0.545 );
		rmRiverAddWaypoint(RiverID, 0.620, 0.540 );
		rmRiverAddWaypoint(RiverID, 0.610, 0.535 );
		rmRiverAddWaypoint(RiverID, 0.600, 0.530 );
		rmRiverAddWaypoint(RiverID, 0.580, 0.528 );
		rmRiverAddWaypoint(RiverID, 0.560, 0.526 );
		rmRiverAddWaypoint(RiverID, 0.550, 0.525 );
		rmRiverAddWaypoint(RiverID, 0.530, 0.522 );
		rmRiverAddWaypoint(RiverID, 0.520, 0.520 );
		rmRiverAddWaypoint(RiverID, 0.510, 0.519 );
		rmRiverAddWaypoint(RiverID, 0.500, 0.518 );
		rmRiverSetBankNoiseParams(RiverID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(RiverID);
		rmAddAreaToClass(RiverID,rmClassID("Lake"));




	// ---------------------------------------------------------------- River 2 ------------------------------------------------------------------
		int River2ID = rmRiverCreate(-1, RiverType, 1, 1, RiverRadius2+2, RiverRadius2+2);
		rmRiverAddWaypoint(River2ID, 0.18, 0.60 );
		rmRiverAddWaypoint(River2ID, 0.21, 0.50 );
		rmRiverAddWaypoint(River2ID, 0.32, 0.32 );
		rmRiverAddWaypoint(River2ID, 0.50, 0.31 );
		rmRiverAddWaypoint(River2ID, 0.60, 0.32 );
		rmRiverAddWaypoint(River2ID, 0.70, 0.38 );
		rmRiverAddWaypoint(River2ID, 0.80, 0.50 );
		rmRiverAddWaypoint(River2ID, 0.84, 0.62 );
		rmRiverAddWaypoint(River2ID, 0.77, 0.53 );
		rmRiverAddWaypoint(River2ID, 0.63, 0.47 );
		rmRiverAddWaypoint(River2ID, 0.53, 0.48 );
		rmRiverAddWaypoint(River2ID, 0.45, 0.45 );
		rmRiverAddWaypoint(River2ID, 0.33, 0.50 );
		rmRiverAddWaypoint(River2ID, 0.18, 0.60 );
		rmRiverAddWaypoint(River2ID, 0.38, 0.38 );
		rmRiverAddWaypoint(River2ID, 0.64, 0.42 );
		rmRiverSetBankNoiseParams(River2ID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(River2ID);
	// -------------------------------------------------------------------------------------------------------------------------------------------
		rmSetStatusText("",0.12);
	// ---------------------------------------------------------------- River 3 ------------------------------------------------------------------
		int River3ID = rmRiverCreate(-1, RiverType, 1, 1, RiverRadius, RiverRadius);
		rmRiverAddWaypoint(River3ID, 0.84, 0.62 );
		rmRiverAddWaypoint(River3ID, 0.795, 0.675 );
		rmRiverAddWaypoint(River3ID, 0.87, 0.68 );
		rmRiverSetBankNoiseParams(River2ID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(River3ID);

		int River4ID = rmRiverCreate(-1, RiverType, 1, 1, RiverRadius, RiverRadius);
		rmRiverAddWaypoint(River4ID, 0.18, 0.63 );
		rmRiverAddWaypoint(River4ID, 0.120, 0.635 );
		rmRiverAddWaypoint(River4ID, 0.180, 0.63 );
		rmRiverAddWaypoint(River4ID, 0.170, 0.67 );
		rmRiverSetBankNoiseParams(River4ID,0.00, 0, 0.0, 0.0, 0.0, 0.0);
		rmRiverBuild(River4ID);

	// -------------------------------------------------------------------------------------------------------------------------------------------



		rmPlacePlayersCircular(0.35, 0.35, 0.0);   	//圆形放置玩家

		//玩家范围
		float AreaSizePlayer = rmAreaTilesToFraction(700);
		for(i=1; <=cNumberNonGaiaPlayers)
		{
			int id=rmCreateArea("Player"+i);
			rmSetPlayerArea(i, id);
			rmSetAreaWarnFailure(id, false);
			rmSetAreaSize(id, AreaSizePlayer, AreaSizePlayer);
			rmSetAreaLocPlayer(id, i);
			rmSetAreaCoherence(id, 0.85);
			rmSetAreaSmoothDistance(id, 2);
			rmSetAreaMinBlobs(id, 1);
			rmSetAreaMaxBlobs(id, 1);
			rmSetAreaTerrainType(id,PlayerTerrain);
			rmBuildArea(id);
		}
		
		//定义城镇中心
		int TownCenterID = rmCreateObjectDef("player TC");
		if (rmGetNomadStart())
		{
			rmAddObjectDefItem(TownCenterID, "CoveredWagon", 1, 0.0);
		}
		else
		{
			rmAddObjectDefItem(TownCenterID, "TownCenter", 1, 0);
		}
		rmSetObjectDefMinDistance(TownCenterID, 0.0);
		rmSetObjectDefMaxDistance(TownCenterID, 20.0);
		for(i=1; <=cNumberNonGaiaPlayers)
		{	
			rmPlaceObjectDefAtLoc(TownCenterID, i, rmPlayerLocXFraction(i), rmPlayerLocZFraction(i));
		}
		rmAddObjectDefConstraint(TownCenterID, avoidWaterMin);


		//定义起始单位(civs.xml定义那些开局单位)
		int startingUnits = rmCreateStartingUnitsObjectDef(5.0);
		rmSetObjectDefMinDistance(startingUnits, 6.0);
		rmSetObjectDefMaxDistance(startingUnits, 10.0);
		rmAddObjectDefConstraint(startingUnits, avoidWaterMin);



		int playerherdID = rmCreateObjectDef("starting herd");
		rmAddObjectDefItem(playerherdID, "ypWildElephant", 10, 6.0);
		rmSetObjectDefMinDistance(playerherdID, 8.0);
		rmSetObjectDefMaxDistance(playerherdID, 12.0);
		rmSetObjectDefCreateHerd(playerherdID, true);
		rmAddObjectDefToClass(playerherdID, classStartingResource);
		rmAddObjectDefConstraint(playerherdID, avoidStartingResources);
		rmAddObjectDefConstraint(playerherdID, avoidWaterMin);




		int playergoldID = rmCreateObjectDef("player mine");
		rmAddObjectDefItem(playergoldID, "Minegold", 1, 6);
		rmSetObjectDefMinDistance(playergoldID, 18.0);
		rmSetObjectDefMaxDistance(playergoldID, 22.0);
		rmAddObjectDefToClass(playergoldID, rmDefineClass("startingResource"));
		rmAddObjectDefToClass(playergoldID, classGold);
		rmAddObjectDefConstraint(playergoldID, avoidStartingResources);
		rmAddObjectDefConstraint(playergoldID, avoidWaterMin);

		string PlayerTreeType ="TreeRedwood";
		int PlayerTreeCount = 8;

		int playerTree1ID = rmCreateObjectDef("player trees");
		rmAddObjectDefItem(playerTree1ID, PlayerTreeType, PlayerTreeCount, 8.0);
		rmSetObjectDefMinDistance(playerTree1ID, 6);
		rmSetObjectDefMaxDistance(playerTree1ID, 12);
		rmAddObjectDefToClass(playerTree1ID, classStartingResource);
		rmAddObjectDefConstraint(playerTree1ID, avoidStartingResources);
		rmAddObjectDefConstraint(playerTree1ID, avoidWaterMin);



		int playerBerryID=rmCreateObjectDef("player berries");
		rmAddObjectDefItem(playerBerryID, "BerryBush", rmRandInt(3,4), 3.0);
		rmSetObjectDefMinDistance(playerBerryID, 12);
		rmSetObjectDefMaxDistance(playerBerryID, 14);
		rmAddObjectDefToClass(playerBerryID, classStartingResource);
		rmAddObjectDefConstraint(playerBerryID, avoidStartingResources);
		rmAddObjectDefConstraint(playerBerryID, avoidWaterMin);
		
		
		int playerHerd2ID = rmCreateObjectDef("player Herd2");
		rmAddObjectDefItem(playerHerd2ID, "Bison", rmRandInt(10,11), 10.0);
		rmSetObjectDefMinDistance(playerHerd2ID, 36);
		rmSetObjectDefMaxDistance(playerHerd2ID, 38);
		rmSetObjectDefCreateHerd(playerHerd2ID, true);
		rmAddObjectDefToClass(playerHerd2ID, PlayerHerd2Class);
		rmAddObjectDefConstraint(playerHerd2ID, avoidWaterMin);



		
		int playerHerd3ID = rmCreateObjectDef("player Herd3");
		rmAddObjectDefItem(playerHerd3ID, "Turkey", rmRandInt(8,9), 8.0);
		rmSetObjectDefMinDistance(playerHerd3ID, 40);
		rmSetObjectDefMaxDistance(playerHerd3ID, 42);
		rmSetObjectDefCreateHerd(playerHerd3ID, true);
		rmAddObjectDefConstraint(playerHerd3ID, avoidPlayerHerd2Far);
		rmAddObjectDefConstraint(playerHerd3ID, avoidWaterMin);



		int playergold2ID = rmCreateObjectDef("player second mine");
		rmAddObjectDefItem(playergold2ID, "mine", 1, 0);
		rmSetObjectDefMinDistance(playergold2ID, 58.0);
		rmSetObjectDefMaxDistance(playergold2ID, 62.0);
		rmAddObjectDefToClass(playergold2ID, classGold);
		rmAddObjectDefConstraint(playergold2ID, avoidGold);
		rmAddObjectDefConstraint(playergold2ID, avoidWaterMin);
		

		
		int playergold3ID = rmCreateObjectDef("player third mine");
		rmAddObjectDefItem(playergold3ID, "mine", 1, 0);
		rmSetObjectDefMinDistance(playergold3ID, 68.0);
		rmSetObjectDefMaxDistance(playergold3ID, 70.0);
		rmAddObjectDefToClass(playergold3ID, classGold);
		rmAddObjectDefConstraint(playergold3ID, avoidGold);
		rmAddObjectDefConstraint(playergold3ID, avoidWaterMin);

		for(i=1; <=cNumberNonGaiaPlayers)
		{
			vector TCLocation = rmGetUnitPosition(rmGetUnitPlacedOfPlayer(TownCenterID, i));
			rmPlaceObjectDefAtLoc(startingUnits, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
			rmPlaceObjectDefAtLoc(playerherdID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
			rmPlaceObjectDefAtLoc(playerTree1ID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
			rmPlaceObjectDefAtLoc(playergoldID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
			rmPlaceObjectDefAtLoc(playerBerryID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
		
			rmPlaceObjectDefAtLoc(playerHerd2ID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
			rmPlaceObjectDefAtLoc(playerHerd3ID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
			rmPlaceObjectDefAtLoc(playergold2ID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
			rmPlaceObjectDefAtLoc(playergold3ID, i, rmXMetersToFraction(xsVectorGetX(TCLocation)), rmZMetersToFraction(xsVectorGetZ(TCLocation)));
		
		}
		

			int NativeCenterID = rmCreateGrouping("Native Center ID", "native aztec village "+rmRandInt(rmRandInt(1,2),rmRandInt(3,rmRandInt(4,5))));
			rmSetGroupingMinDistance(NativeCenterID, 0.0);
			rmSetGroupingMaxDistance(NativeCenterID, rmXFractionToMeters(0.1));
			rmAddGroupingToClass(NativeCenterID, rmDefineClass("natives"));
			rmAddGroupingConstraint(NativeCenterID, avoidWaterMin);	//PS:群组与单位的放置限制语句不一样哦。
			rmPlaceGroupingAtLoc(NativeCenterID, 0,0.50,0.50);







		int FixedGunID = rmCreateObjectDef("FixedGun");
		rmAddObjectDefItem(FixedGunID, "SPCFixedGun",1,5.0);
		rmSetObjectDefMinDistance(FixedGunID,0.0);
		rmSetObjectDefMaxDistance(FixedGunID,30.0);
		rmAddObjectDefConstraint(FixedGunID, avoidWaterMin);
		rmPlaceObjectDefAtLoc(FixedGunID,0,0.50,0.50,1);


		for(i=0; <= cNumberNonGaiaPlayers*3)
		{
			int goldID = rmCreateObjectDef("gold"+i);
			rmAddObjectDefItem(goldID, "mine", 1, 0.0);
			rmSetObjectDefMinDistance(goldID, rmXFractionToMeters(0.0));
			rmSetObjectDefMaxDistance(goldID, rmXFractionToMeters(0.5));
			rmAddObjectDefToClass(goldID, classGold);
			rmAddObjectDefConstraint(goldID, avoidGoldTypeFar);
		rmAddObjectDefConstraint(goldID, avoidWaterMin);
			rmPlaceObjectDefAtLoc(goldID, 0, 0.50, 0.50);
		}





		int CenterHerdID = rmCreateObjectDef("Center Herd2");
		rmAddObjectDefItem(CenterHerdID, "BighornSheep",10, 8.0);
		rmSetObjectDefMinDistance(CenterHerdID, rmXFractionToMeters(0.0));
		rmSetObjectDefMaxDistance(CenterHerdID, rmXFractionToMeters(0.45));
		rmSetObjectDefCreateHerd(CenterHerdID, true);
		rmAddObjectDefConstraint(CenterHerdID, avoidHerdTypeFar);
		rmAddObjectDefConstraint(CenterHerdID, avoidWaterMin);


		for(i=1; <= cNumberNonGaiaPlayers*3)
		{
		rmPlaceObjectDefAtLoc(CenterHerdID, 0, 0.50, 0.50);
		}


			int GreenForestTreeObjectID = rmCreateObjectDef("Object Green forest trees");
			rmAddObjectDefItem(GreenForestTreeObjectID, "TreeRedwood", 8, 15);
			rmAddObjectDefItem(GreenForestTreeObjectID, "TreeRedwood", 3, 5);
			rmAddObjectDefItem(GreenForestTreeObjectID, "UnderbrushCalifornia", 3, 10);
			rmSetObjectDefMinDistance(GreenForestTreeObjectID,  rmXFractionToMeters(0.0));
			rmSetObjectDefMaxDistance(GreenForestTreeObjectID,  rmXFractionToMeters(0.47));
			rmAddObjectDefConstraint(GreenForestTreeObjectID, avoidTreeType);
			rmAddObjectDefConstraint(GreenForestTreeObjectID, avoidWaterMin);
			rmPlaceObjectDefAtLoc(GreenForestTreeObjectID, 0, 0.50, 0.50, cNumberNonGaiaPlayers*20);

		rmSetStatusText("",0.50);//读取地图进度条


			int avoidNative = rmCreateClassDistanceConstraint("avoid Native", rmClassID("natives"), 52.0);
			int avoidGoldTypeMin = rmCreateTypeDistanceConstraint("coin avoids coin Min", "gold", 15.0);
			int avoidTreeTypeMin = rmCreateTypeDistanceConstraint("Tree avoids Min", "Tree", 15.0);


			int NativeCenter2ID = rmCreateGrouping("Native Center ID", "native aztec village "+rmRandInt(rmRandInt(1,2),rmRandInt(3,rmRandInt(4,5))));
			rmSetGroupingMinDistance(NativeCenter2ID, 0.0);
			rmSetGroupingMaxDistance(NativeCenter2ID, rmXFractionToMeters(0.5));
			rmAddGroupingToClass(NativeCenter2ID, rmDefineClass("natives"));

			rmAddGroupingConstraint(NativeCenter2ID, avoidNative);
			rmAddGroupingConstraint(NativeCenter2ID, avoidGoldTypeMin);
			rmAddGroupingConstraint(NativeCenter2ID, avoidTreeTypeMin);
			rmAddGroupingConstraint(NativeCenter2ID, avoidWaterMin);	//PS:群组与单位的放置限制语句不一样哦。
			rmPlaceGroupingAtLoc(NativeCenter2ID, 0,0.50,0.50,3);


		



		int FountainID=rmCreateObjectDef("FountainOfYouth");
		rmAddObjectDefItem(FountainID, "SPCFountainOfYouth", 1, 0.0);
		rmSetObjectDefMinDistance(FountainID, 0.0);
		rmSetObjectDefMaxDistance(FountainID, 10);
		rmAddObjectDefConstraint(FountainID, avoidFishLand);
		rmPlaceObjectDefAtLoc(FountainID, 0, 0.50, 0.45, 1);

		int Fish1count = cNumberPlayers * 3;	string Fish1Name = "FishMoonBass";
		int Fish2count = cNumberPlayers * 3;	string Fish2Name = "FishMoonBass";
		int whalecount = (cNumberNonGaiaPlayers * 3) + rmRandInt(1,2);
		int Junkcount = cNumberPlayers;
		int RandomJunk = rmRandInt(0,1);
		//蓝色文字是海军旗帜的语句
		int waterSpawnPointID = rmCreateObjectDef("Flag");
		rmAddObjectDefItem(waterSpawnPointID, "HomeCityWaterSpawnFlag", 1, 0.0);
		rmSetObjectDefMaxDistance(waterSpawnPointID, 30);
		rmAddClosestPointConstraint(flagVsFlag);
		rmAddClosestPointConstraint(flagLand);

		for(i=1; <cNumberPlayers)
		{
			int ShipsID = rmCreateObjectDef("Ships"+i);		//这个是两个玩家的情况下给每个玩家创建1只独木舟。

			//这是一种没有出现过的if判断国家方法,总之我的语句很高级就对了。你去命令章节看下国家ID应该会明白是什么。
			if (rmGetPlayerCiv(i) <= 13 && rmGetPlayerCiv(i) != 8)
			{
				rmAddObjectDefItem(ShipsID,"Canoe", 1, 10.0);
			}
			else if (rmGetPlayerCiv(i) == 8)
			{
				rmAddObjectDefItem(ShipsID,"Canoe", 1, 10.0);
			}
			else if (rmGetPlayerCiv(i) >= 14 && rmGetPlayerCiv(i) <= 17)
			{
				rmAddObjectDefItem(ShipsID,"Canoe", 1, 10.0);
			}
			else if (rmGetPlayerCiv(i) == 19 || rmGetPlayerCiv(i) == 22 || rmGetPlayerCiv(i) == 26)
			{
				rmAddObjectDefItem(ShipsID,"Canoe", 1, 10.0);
			}
			else if (rmGetPlayerCiv(i) == 20 || rmGetPlayerCiv(i) == 23)
			{
				rmAddObjectDefItem(ShipsID,"Canoe", 1, 10.0);
			}
			else
			{
				rmAddObjectDefItem(ShipsID,"Canoe", 1, 10.0);
			}
			rmSetObjectDefMaxDistance(ShipsID, 30);
			rmAddClosestPointConstraint(shipsVsFlag);
			rmAddClosestPointConstraint(flagLand);
			TCLocation = rmGetUnitPosition(rmGetUnitPlacedOfPlayer(TownCenterID, i));
			vector closestPoint = rmFindClosestPointVector(TCLocation, rmXFractionToMeters(1.0));
			rmPlaceObjectDefAtLoc(waterSpawnPointID, i, rmXMetersToFraction(xsVectorGetX(closestPoint)), rmZMetersToFraction(xsVectorGetZ(closestPoint)));
			if(cNumberNonGaiaPlayers == 2)
			{
			rmPlaceObjectDefAtLoc(ShipsID, i, rmXMetersToFraction(xsVectorGetX(closestPoint)), rmZMetersToFraction(xsVectorGetZ(closestPoint)));
			}
		}
		rmClearClosestPointConstraints();

		rmSetStatusText("",0.80);
		int Fisch1=rmCreateObjectDef("Fish 1");
		rmAddObjectDefItem(Fisch1, Fish1Name, 1, 0.0);
		rmSetObjectDefMinDistance(Fisch1, 0.3);
		rmSetObjectDefMaxDistance(Fisch1, rmXFractionToMeters(0.5));
		rmAddObjectDefConstraint(Fisch1, avoidFish);
		rmAddObjectDefConstraint(Fisch1, avoidFishLand);
		rmPlaceObjectDefAtLoc(Fisch1, 0, 0.5, 0.5, Fish1count);

		int Fisch2=rmCreateObjectDef("Fish 2");
		rmAddObjectDefItem(Fisch2, Fish2Name, 1, 0.0);
		rmSetObjectDefMinDistance(Fisch2, 0.3);
		rmSetObjectDefMaxDistance(Fisch2, rmXFractionToMeters(0.5));
		rmAddObjectDefConstraint(Fisch2, avoidFish);
		rmAddObjectDefConstraint(Fisch2, avoidFishLand);
		rmPlaceObjectDefAtLoc(Fisch2, 0, 0.5, 0.5, Fish2count);


		rmSetStatusText("",1.00);//读取地图进度条


					//愿神兽会保佑你不会出错。
 			/*----------------------------------------------------------------------------------------------*
			*    ┏┓   ┏┓										*
			*   ┏┛┻━━━┛┻┓									*
			*   ┃       ┃									*
			*   ┃   ━   ┃									*
			*   ┃ ┳┛ ┗┳ ┃									*
			*   ┃       ┃									*
			*   ┃   ┻   ┃									*
			*   ┃       ┃									*
			*   ┗━┓   ┏━┛     Code is far away from bug with the animal protecting		*
			*     ┃   ┃    									*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┃										*
			*     ┃   ┗━━━┓									*
			*     ┃       ┣┓									*
			*     ┃       ┏┛									*
			*     ┗┓┓┏━┳┓┏┛									*
			*      ┃┫┫ ┃┫┫									*
			*      ┗┻┛ ┗┻┛									*
			*----------------------------------------------------------------------------------------------*/
	} //END



可以看见树木已经远离水域了,湖边的树木我也没办法控制,那是伴随西北区域河流自动生成的,无法添加限制。至于城镇中心就别管了,我这个教程是随意做的,我用的是圆形随机放置,如果真要制作一幅好地图,里面的内容起码比这个教程复杂几十倍。



为什么这个教程要随意制作地图?动不动就关联n个地方、太过高级的教程对你没基础的来说,你会看不懂,如果你学会了这些基础自然就会懂别人是怎样制作一幅比较好的地图了。







到了这类本次教程已经达到尾声了,但是本次教程还没结束,因为河流还有一样东西,那就是浅滩。

当初我零基础搞浅滩,连命令表都不知道是什么东西,也不懂浅滩的英文是哪个,更不懂c++语法,然后花了六个小时研究浅滩,最后成功弄在地图生成器制作的地图弄出三个浅滩。真羡慕你们现在有这个教程。


添加浅滩有两种方法
方法1:在河流那里添加
		rmRiverAddShallows(riverID, count, radius);
		rmRiverAddShallows(riverID, 浅滩数量, 浅滩半径);

例如:
int River1ID = rmRiverCreate(-1, "Northwest Territory Water", 1, 1, 10, 10); rmRiverAddWaypoint(River1ID, 0.0, 0.2 ); rmRiverAddWaypoint(River1ID, 1.0, 0.2 ); rmRiverSetBankNoiseParams(River1ID,0.00, 0, 0.0, 0.0, 0.0, 0.0); rmRiverAddShallows(River1ID,5,8); rmRiverBuild(River1ID);

方法2:在河流那里添加
		rmRiverSetShallowRadius(riverID, radius); 
		rmRiverAddShallow(riverID, distancePct);


		rmRiverSetShallowRadius(riverID, 浅滩半径);//设定浅滩半径,通rmRiverAddShallow语句放置浅滩
		rmRiverAddShallow(riverID, 河流长度百分比);

例如:
int River2ID = rmRiverCreate(-1, "Northwest Territory Water", 1, 1, 10, 10); rmRiverAddWaypoint(River2ID, 0.0, 0.8 ); rmRiverAddWaypoint(River2ID, 1.0, 0.8 ); rmRiverSetBankNoiseParams(River2ID,0.00, 0, 0.0, 0.0, 0.0, 0.0); rmRiverSetShallowRadius(River2ID,16); rmRiverAddShallow(River2ID,0.20); rmRiverAddShallow(River2ID,0.50); rmRiverAddShallow(River2ID,0.80);


方法1是设定数量X,然后自动生成X个浅滩,虽然看上去有一平均分成几段的感觉,但实际上还是有一点浮动的,所以可以当做随机性质。

方法2是固定的,你设定有几个语句就有多少个浅滩。



本节教程结束。