Advertisement
Guest User

Untitled

a guest
Jan 5th, 2012
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. RMS.LoadLibrary("rmgen");
  2.  
  3. TILE_CENTERED_HEIGHT_MAP = true;
  4.  
  5. const tCity = "medit_city_pavement";
  6. const tCityPlaza = "medit_city_pavement";
  7. const tHill = ["medit_grass_shrubs", "medit_rocks_grass_shrubs", "medit_rocks_shrubs", "medit_rocks_grass", "medit_shrubs"];
  8. const tMainDirt = "medit_dirt";
  9. const tCliff = "medit_cliff_aegean";
  10. const tForestFloor = "medit_grass_shrubs";
  11. const tGrass = "medit_grass_field";
  12. const tGrassSand50 = "medit_grass_field_a";
  13. const tGrassSand25 = "medit_grass_field_b";
  14. const tDirt = "medit_dirt_b";
  15. const tDirtCracks = "medit_dirt_c";
  16. const tShore = "medit_sand";
  17. const tWater = "medit_sand_wet";
  18.  
  19. // gaia entities
  20. const oBerryBush = "gaia/flora_bush_berry";
  21. const oChicken = "gaia/fauna_chicken";
  22. const oDeer = "gaia/fauna_deer";
  23. const oFish = "gaia/fauna_fish";
  24. const oSheep = "gaia/fauna_sheep";
  25. const oGoat = "gaia/fauna_goat";
  26. const oStoneLarge = "gaia/geology_stonemine_medit_quarry";
  27. const oStoneSmall = "gaia/geology_stone_mediterranean";
  28. const oMetalLarge = "gaia/geology_metal_mediterranean_slabs";
  29. const oDatePalm = "gaia/flora_tree_cretan_date_palm_short";
  30. const oSDatePalm = "gaia/flora_tree_cretan_date_palm_tall";
  31. const oCarob = "gaia/flora_tree_carob";
  32. const oFanPalm = "gaia/flora_tree_medit_fan_palm";
  33. const oPoplar = "gaia/flora_tree_poplar_lombardy";
  34. const oCypress = "gaia/flora_tree_cypress";
  35.  
  36. // decorative props
  37. const aBush1 = "actor|props/flora/bush_medit_sm.xml";
  38. const aBush2 = "actor|props/flora/bush_medit_me.xml";
  39. const aBush3 = "actor|props/flora/bush_medit_la.xml";
  40. const aBush4 = "actor|props/flora/bush_medit_me.xml";
  41. const aBushes = [aBush1, aBush2, aBush3, aBush4];
  42. const aDecorativeRock = "actor|geology/stone_granite_med.xml";
  43.  
  44. // terrain + entity (for painting)
  45. var pForest = [tForestFloor + TERRAIN_SEPARATOR + oDatePalm, tForestFloor + TERRAIN_SEPARATOR + oSDatePalm, tForestFloor];
  46.  
  47. const BUILDING_ANGlE = 0.75*PI;
  48.  
  49. log("Initializing map...");
  50.  
  51. InitMap();
  52.  
  53. var numPlayers = getNumPlayers();
  54. var mapSize = getMapSize();
  55. var mapArea = mapSize*mapSize;
  56.  
  57. // create tile classes
  58.  
  59. var clPlayer = createTileClass();
  60. var clForest = createTileClass();
  61. var clWater = createTileClass();
  62. var clDirt = createTileClass();
  63. var clRock = createTileClass();
  64. var clMetal = createTileClass();
  65. var clFood = createTileClass();
  66. var clBaseResource = createTileClass();
  67. var clSettlement = createTileClass();
  68. var clGrass = createTileClass();
  69. var clHill = createTileClass();
  70. var clIsland = createTileClass();
  71.  
  72. // randomize player order
  73. var playerIDs = [];
  74. for (var i = 0; i < numPlayers; i++)
  75. {
  76.     playerIDs.push(i+1);
  77. }
  78. playerIDs = shuffleArray(playerIDs);
  79.  
  80. // place players
  81.  
  82. var playerX = new Array(numPlayers);
  83. var playerZ = new Array(numPlayers);
  84. var playerAngle = new Array(numPlayers);
  85. var playerPos = new Array(numPlayers);
  86. var iop = 0;
  87. for (var i = 0; i < numPlayers; i++)
  88. {
  89.     iop = i - 1;
  90.     if (!(numPlayers%2)){
  91.         playerPos[i] = ((iop + abs(iop%2))/2 + 1) / ((numPlayers / 2) + 1);
  92.     }
  93.     else
  94.     {
  95.         if (iop%2)
  96.         {
  97.             playerPos[i] = ((iop + abs(iop%2))/2 + 1) / (((numPlayers + 1) / 2) + 1);
  98.         }
  99.         else
  100.         {
  101.             playerPos[i] = ((iop)/2 + 1) / ((((numPlayers - 1)) / 2) + 1);
  102.         }
  103.     }
  104.     playerZ[i] = playerPos[i];
  105.     playerX[i] = 0.2 + 0.6*(i%2);
  106. }
  107.  
  108. for (var i = 0; i < numPlayers; i++)
  109. {
  110.     var id = playerIDs[i];
  111.     log("Creating base for player " + id + "...");
  112.    
  113.     // some constants
  114.     var radius = scaleByMapSize(15,25);
  115.     var cliffRadius = 2;
  116.     var elevation = 20;
  117.    
  118.     // get the x and z in tiles
  119.     var fx = fractionToTiles(playerX[i]);
  120.     var fz = fractionToTiles(playerZ[i]);
  121.     var ix = floor(fx);
  122.     var iz = floor(fz);
  123.     addToClass(ix, iz, clPlayer);
  124.    
  125.     // create the city patch
  126.     var cityRadius = radius/3;
  127.     var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz);
  128.     var painter = new LayeredPainter([tCityPlaza, tCity], [1]);
  129.     createArea(placer, painter, null);
  130.    
  131.     // get civ specific starting entities
  132.     var civEntities = getStartingEntities(id-1);
  133.    
  134.     // create the TC
  135.     var group = new SimpleGroup(    // elements (type, min/max count, min/max distance, min/max angle)
  136.         [new SimpleObject(civEntities[0].Template, 1,1, 0,0, BUILDING_ANGlE, BUILDING_ANGlE)],
  137.         true, null, ix, iz
  138.     );
  139.     createObjectGroup(group, id);
  140.    
  141.     // create starting units
  142.     var uDist = 8;
  143.     var uAngle = -BUILDING_ANGlE + randFloat(-PI/8, PI/8);
  144.     for (var j = 1; j < civEntities.length; ++j)
  145.     {
  146.         var count = (civEntities[j].Count !== undefined ? civEntities[j].Count : 1);
  147.         var ux = round(fx + uDist * cos(uAngle));
  148.         var uz = round(fz + uDist * sin(uAngle));
  149.         group = new SimpleGroup(    // elements (type, min/max count, min/max distance)
  150.             [new SimpleObject(civEntities[j].Template, count,count, 1,ceil(count/2))],
  151.             true, null, ux, uz
  152.         );
  153.         createObjectGroup(group, id);
  154.         uAngle += PI/4;
  155.     }
  156.    
  157.     // create animals
  158.     for (var j = 0; j < 2; ++j)
  159.     {
  160.         var aAngle = randFloat(0, TWO_PI);
  161.         var aDist = 7;
  162.         var aX = round(fx + aDist * cos(aAngle));
  163.         var aZ = round(fz + aDist * sin(aAngle));
  164.         group = new SimpleGroup(
  165.             [new SimpleObject(oChicken, 5,5, 0,3)],
  166.             true, clBaseResource, aX, aZ
  167.         );
  168.         createObjectGroup(group, 0);
  169.     }
  170.    
  171.     // create berry bushes
  172.     var bbAngle = randFloat(0, TWO_PI);
  173.     var bbDist = 12;
  174.     var bbX = round(fx + bbDist * cos(bbAngle));
  175.     var bbZ = round(fz + bbDist * sin(bbAngle));
  176.     group = new SimpleGroup(
  177.         [new SimpleObject(oBerryBush, 5,5, 0,3)],
  178.         true, clBaseResource, bbX, bbZ
  179.     );
  180.     createObjectGroup(group, 0);
  181.    
  182.     // create metal mine
  183.     var mAngle = bbAngle;
  184.     while(abs(mAngle - bbAngle) < PI/3)
  185.     {
  186.         mAngle = randFloat(0, TWO_PI);
  187.     }
  188.     var mDist = radius - 4;
  189.     var mX = round(fx + mDist * cos(mAngle));
  190.     var mZ = round(fz + mDist * sin(mAngle));
  191.     group = new SimpleGroup(
  192.         [new SimpleObject(oMetalLarge, 1,1, 0,0)],
  193.         true, clBaseResource, mX, mZ
  194.     );
  195.     createObjectGroup(group, 0);
  196.    
  197.     // create stone mines
  198.     mAngle += randFloat(PI/8, PI/4);
  199.     mX = round(fx + mDist * cos(mAngle));
  200.     mZ = round(fz + mDist * sin(mAngle));
  201.     group = new SimpleGroup(
  202.         [new SimpleObject(oStoneLarge, 1,1, 0,2)],
  203.         true, clBaseResource, mX, mZ
  204.     );
  205.     createObjectGroup(group, 0);
  206.     var hillSize = PI * radius * radius;
  207.     // create starting straggler trees
  208.     var num = hillSize / 100;
  209.    
  210.     for (var j = 0; j < num; j++)
  211.     {
  212.         var tAngle = randFloat(0, TWO_PI);
  213.         var tDist = randFloat(6, radius - 2);
  214.         var tX = round(fx + tDist * cos(tAngle));
  215.         var tZ = round(fz + tDist * sin(tAngle));
  216.         group = new SimpleGroup(
  217.             [new SimpleObject(oSDatePalm, 1,3, 0,2)],
  218.             false, clBaseResource, tX, tZ
  219.         );
  220.         createObjectGroup(group, 0, avoidClasses(clBaseResource,2));
  221.     }
  222.    
  223.     // create grass tufts
  224.     var num = hillSize / 250;
  225.     for (var j = 0; j < num; j++)
  226.     {
  227.         var gAngle = randFloat(0, TWO_PI);
  228.         var gDist = radius - (5 + randInt(7));
  229.         var gX = round(fx + gDist * cos(gAngle));
  230.         var gZ = round(fz + gDist * sin(gAngle));
  231.         group = new SimpleGroup(
  232.             [new SimpleObject(aBush1, 2,5, 0,1, -PI/8,PI/8)],
  233.             false, clBaseResource, gX, gZ
  234.         );
  235.         createObjectGroup(group, 0);
  236.     }
  237. }
  238.  
  239. RMS.SetProgress(30);
  240.  
  241. const WATER_WIDTH = 0.35;
  242. log("Creating sea");
  243. var theta = randFloat(0, TWO_PI);
  244. var theta2 = randFloat(0, TWO_PI);
  245. for (ix = 0; ix < mapSize; ix++)
  246. {
  247.     for (iz = 0; iz < mapSize; iz++)
  248.     {
  249.         var x = ix / (mapSize + 1.0);
  250.         var z = iz / (mapSize + 1.0);
  251.        
  252.         // add the rough shape of the water
  253.         var km = 1/scaleByMapSize(35, 160);
  254.         var cu = km*sin(theta+z*PI*(mapSize/64));
  255.         var cu2 = km*sin(theta+z*PI*(mapSize/64));
  256.        
  257.         var fadeDist = 0.05;
  258.        
  259.         if ((x > cu + 0.5 - WATER_WIDTH/2) && (x < cu + 0.5 + WATER_WIDTH/2))
  260.         {
  261.             var h;
  262.             if (x < (cu + 0.5 + fadeDist - WATER_WIDTH/2))
  263.             {
  264.                 h = 1 - 4.0 * (1 - ((cu + 0.5 + fadeDist - WATER_WIDTH/2) - x)/fadeDist);
  265.             }
  266.             else if (x > (cu2 + 0.5 - fadeDist + WATER_WIDTH/2))
  267.             {
  268.                 h = 1 - 4.0 * (1 - (x - (cu2 + 0.5 - fadeDist + WATER_WIDTH/2))/fadeDist);
  269.             }
  270.             else
  271.             {
  272.                 h = -3.0;
  273.             }
  274.            
  275.             if (h < -1.5)
  276.             {
  277.                 placeTerrain(ix, iz, tWater);
  278.             }
  279.             else
  280.             {
  281.                 placeTerrain(ix, iz, tShore);
  282.             }
  283.            
  284.             setHeight(ix, iz, h);
  285.             if (h < 0){
  286.                 addToClass(ix, iz, clWater);
  287.             }
  288.         }
  289.     }
  290. }
  291.  
  292. RMS.SetProgress(40);
  293. // create bumps
  294. log("Creating bumps...");
  295. placer = new ClumpPlacer(scaleByMapSize(20, 50), 0.3, 0.06, 1);
  296. painter = new SmoothElevationPainter(ELEVATION_MODIFY, 2, 2);
  297. createAreas(
  298.     placer,
  299.     painter,
  300.     avoidClasses(clWater, 2, clPlayer, 6),
  301.     scaleByMapSize(100, 200)
  302. );
  303.  
  304.  
  305.  
  306. // calculate desired number of trees for map (based on size)
  307. const MIN_TREES = 500;
  308. const MAX_TREES = 2500;
  309. const P_FOREST = 0.5;
  310.  
  311. var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES);
  312. var numForest = totalTrees * P_FOREST;
  313. var numStragglers = totalTrees * (1.0 - P_FOREST);
  314.  
  315. // create forests
  316. log("Creating forests...");
  317. var num = scaleByMapSize(10,30);
  318. placer = new ClumpPlacer(numForest / num, 0.15, 0.1, 0.5);
  319. painter = new TerrainPainter([tForestFloor, pForest]);
  320. createAreas(placer, [painter, paintClass(clForest)],
  321.     avoidClasses(clPlayer, 8, clForest, 10, clWater, 1),
  322.     num, 50
  323. );
  324.  
  325. RMS.SetProgress(50);
  326.  
  327.  
  328. // create hills
  329. log("Creating hills...");
  330. placer = new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1);
  331. var terrainPainter = new LayeredPainter(
  332.     [tCliff, tHill],        // terrains
  333.     [2]                             // widths
  334. );
  335. var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 12, 2);
  336. createAreas(
  337.     placer,
  338.     [terrainPainter, elevationPainter, paintClass(clHill)],
  339.     avoidClasses(clPlayer, 16, clForest, 1, clHill, 15, clWater, 3),
  340.     scaleByMapSize(1, 4) * numPlayers
  341. );
  342.  
  343.  
  344.  
  345. // create grass patches
  346.  
  347. log("Creating grass patches...");
  348. var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)];
  349. for (var i = 0; i < sizes.length; i++)
  350. {
  351.     placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
  352.     painter = new LayeredPainter(
  353.         [[tGrass,tGrassSand50],[tGrassSand50,tGrassSand25], [tGrassSand25,tGrass]],         // terrains
  354.         [1,1]                                                           // widths
  355.     );
  356.     createAreas(
  357.         placer,
  358.         [painter, paintClass(clDirt)],
  359.         avoidClasses(clForest, 0, clGrass, 5, clPlayer, 10, clWater, 1, clDirt, 5, clHill, 1),
  360.         scaleByMapSize(15, 45)
  361.     );
  362. }
  363.  
  364. RMS.SetProgress(55);
  365.  
  366. // create dirt patches
  367. log("Creating dirt patches...");
  368. var sizes = [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)];
  369. for (var i = 0; i < sizes.length; i++)
  370. {
  371.     placer = new ClumpPlacer(sizes[i], 0.3, 0.06, 0.5);
  372.     painter = new LayeredPainter(
  373.         [[tDirt,tDirtCracks],[tDirt,tMainDirt], [tDirtCracks,tMainDirt]],       // terrains
  374.         [1,1]                                                           // widths
  375.     );
  376.     createAreas(
  377.         placer,
  378.         [painter, paintClass(clDirt)],
  379.         avoidClasses(clForest, 0, clDirt, 5, clPlayer, 10, clWater, 1, clGrass, 5, clHill, 1),
  380.         scaleByMapSize(15, 45)
  381.     );
  382. }
  383.  
  384.  
  385.  
  386. RMS.SetProgress(60);
  387.  
  388. // create islands
  389. log("Creating islands...");
  390. placer = new ClumpPlacer(scaleByMapSize(40, 240), 0.2, 0.1, 1);
  391. var terrainPainter = new LayeredPainter(
  392.     [tShore, tHill],        // terrains
  393.     [2]                             // widths
  394. );
  395. var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 6, 4);
  396. createAreas(
  397.     placer,
  398.     [terrainPainter, elevationPainter, paintClass(clIsland)],
  399.     [avoidClasses(clPlayer, 8, clForest, 1, clIsland, 15), stayClasses (clWater, 4)],
  400.     scaleByMapSize(1, 4) * numPlayers
  401. );
  402.  
  403. log("Creating stone mines...");
  404. // create large stone quarries
  405. group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
  406. createObjectGroups(group, 0,
  407.     stayClasses(clIsland, 4),
  408.     scaleByMapSize(4,16), 100
  409. );
  410.  
  411. // create small stone quarries
  412. group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
  413. createObjectGroups(group, 0,
  414.     stayClasses(clIsland, 4),
  415.     scaleByMapSize(4,16), 100
  416. );
  417.  
  418. log("Creating metal mines...");
  419. // create large metal quarries
  420. group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
  421. createObjectGroups(group, 0,
  422.     stayClasses(clIsland, 4),
  423.     scaleByMapSize(4,16), 100
  424. );
  425.  
  426. log("Creating stone mines...");
  427. // create large stone quarries
  428. group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock);
  429. createObjectGroups(group, 0,
  430.     avoidClasses(clForest, 1, clPlayer, 12, clRock, 10, clWater, 1, clHill, 1),
  431.     scaleByMapSize(4,16), 100
  432. );
  433.  
  434. // create small stone quarries
  435. group = new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock);
  436. createObjectGroups(group, 0,
  437.     avoidClasses(clForest, 1, clPlayer, 12, clRock, 10, clWater, 1, clHill, 1),
  438.     scaleByMapSize(4,16), 100
  439. );
  440.  
  441. log("Creating metal mines...");
  442. // create large metal quarries
  443. group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal);
  444. createObjectGroups(group, 0,
  445.     avoidClasses(clForest, 1, clPlayer, 12, clMetal, 10, clRock, 5, clWater, 1, clHill, 1),
  446.     scaleByMapSize(4,16), 100
  447. );
  448.  
  449. RMS.SetProgress(65);
  450.  
  451. // create small decorative rocks
  452. log("Creating small decorative rocks...");
  453. group = new SimpleGroup(
  454.     [new SimpleObject(aDecorativeRock, 1,3, 0,1)],
  455.     true
  456. );
  457. createObjectGroups(
  458.     group, 0,
  459.     avoidClasses(clWater, 1, clForest, 0, clPlayer, 0, clHill, 1),
  460.     scaleByMapSize(16, 262), 50
  461. );
  462.  
  463.  
  464. // create shrubs
  465. log("Creating shrubs...");
  466. group = new SimpleGroup(
  467.     [new SimpleObject(aBush2, 1,2, 0,1), new SimpleObject(aBush1, 1,3, 0,2), new SimpleObject(aBush4, 1,2, 0,1), new SimpleObject(aBush3, 1,3, 0,2)],
  468.     true
  469. );
  470. createObjectGroups(
  471.     group, 0,
  472.     avoidClasses(clWater, 1, clPlayer, 0, clHill, 1),
  473.     scaleByMapSize(40, 360), 50
  474. );
  475.  
  476. RMS.SetProgress(70);
  477.  
  478. // create fish
  479. log("Creating fish...");
  480. group = new SimpleGroup([new SimpleObject(oFish, 1,3, 2,6)], true, clFood);
  481. createObjectGroups(group, 0,
  482.     [avoidClasses(clIsland, 2, clFood, 10), stayClasses(clWater, 5)],
  483.     3*scaleByMapSize(5,20), 50
  484. );
  485.  
  486. // create sheeps
  487. log("Creating sheeps...");
  488. group = new SimpleGroup([new SimpleObject(oSheep, 5,7, 0,4)], true, clFood);
  489. createObjectGroups(group, 0,
  490.     avoidClasses(clForest, 0, clPlayer, 7, clWater, 1, clFood, 10, clHill, 1),
  491.     scaleByMapSize(5,20), 50
  492. );
  493.  
  494. // create goats
  495. log("Creating goats...");
  496. group = new SimpleGroup([new SimpleObject(oGoat, 2,4, 0,3)], true, clFood);
  497. createObjectGroups(group, 0,
  498.     avoidClasses(clForest, 0, clPlayer, 7, clWater, 1, clFood, 10, clHill, 1),
  499.     scaleByMapSize(5,20), 50
  500. );
  501.  
  502. // create deers
  503. log("Creating deers...");
  504. group = new SimpleGroup([new SimpleObject(oDeer, 2,4, 0,2)], true, clFood);
  505. createObjectGroups(group, 0,
  506.     avoidClasses(clForest, 0, clPlayer, 7, clWater, 1, clFood, 10, clHill, 1),
  507.     scaleByMapSize(5,20), 50
  508. );
  509.  
  510. RMS.SetProgress(90);
  511.  
  512. // create straggler trees
  513. log("Creating straggler trees...");
  514. var types = [oDatePalm, oSDatePalm, oCarob, oFanPalm, oPoplar, oCypress];   // some variation
  515. var num = floor(numStragglers / types.length);
  516. for (var i = 0; i < types.length; ++i)
  517. {
  518.     group = new SimpleGroup([new SimpleObject(types[i], 1,1, 0,0)], true);
  519.     createObjectGroups(group, 0,
  520.         avoidClasses(clForest, 0, clWater, 1, clPlayer, 8, clMetal, 1, clHill, 1),
  521.         num
  522.     );
  523. }
  524.  
  525. log("Creating straggler trees...");
  526. var types = [oDatePalm, oSDatePalm, oCarob, oFanPalm, oPoplar, oCypress];   // some variation
  527. var num = 10*floor(numStragglers / types.length);
  528. for (var i = 0; i < types.length; ++i)
  529. {
  530.     group = new SimpleGroup([new SimpleObject(types[i], 1,1, 0,0)], true);
  531.     createObjectGroups(group, 0,
  532.         stayClasses(clIsland, 4),
  533.         num
  534.     );
  535. }
  536.  
  537. // Set environment
  538. setSkySet("sunny");
  539. setSunColour(0.917, 0.828, 0.734); 
  540. setWaterColour(0.292, 0.347, 0.691);       
  541.  
  542. // Export map data
  543. ExportMap();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement