Changeset View
Standalone View
binaries/data/mods/public/maps/random/extinct_volcano.js
- This file was added.
RMS.LoadLibrary("rmgen"); | |||||
const tHillDark = "cliff volcanic light"; | |||||
const tHillMedium1 = "ocean_rock_a"; | |||||
const tHillMedium2 = "ocean_rock_b"; | |||||
bb: Why we have these duplicate consts? more of them below | |||||
Not Done Inline Actions(Leftover. Did change the textures back an forth) elexis: (Leftover. Did change the textures back an forth) | |||||
const tHillVeryDark = ["cliff volcanic coarse", "cave_walls"]; | |||||
const tRoad = "road1"; | |||||
const tRoadWild = "road1"; | |||||
const tForestFloor1 = tHillMedium1; | |||||
const tForestFloor2 = tHillMedium2; | |||||
const tGrassA = "cliff volcanic light"; | |||||
const tGrassB = "ocean_rock_a"; | |||||
Not Done Inline ActionsThese actually seem useful to me, since you can insert a texture here and have that texture appear right below the forests. If we'd replace all forest floor occurances with the hill textures, we'd have to start looking. And it's not unlikely that someone will want to add a forest floor texture. It's just that I was completely unable to find one that fits. elexis: These actually seem useful to me, since you can insert a texture here and have that texture… | |||||
const tGrass3 = "temp_grass_plants"; | |||||
const tGrassPatchBlend = "temp_grass_long_b"; | |||||
const tGrassPatch = ["temp_grass_d", "temp_grass_clovers"]; | |||||
const tShoreBlend = "cliff volcanic light"; | |||||
Done Inline Actionsempty todo? bb: empty todo? | |||||
Not Done Inline Actions(Leftover; we don't have Lava on this map, so TODO was nuke after fixing the volcano) elexis: (Leftover; we don't have Lava on this map, so TODO was nuke after fixing the volcano) | |||||
const tShore = "ocean_rock_a"; | |||||
const tWater = "ocean_rock_b"; | |||||
// Gaia entities | |||||
const oTree = "gaia/flora_tree_dead"; | |||||
const oTree2 = "gaia/flora_tree_euro_beech"; | |||||
const oTree3 = "gaia/flora_tree_oak"; | |||||
const oTree4 = "gaia/flora_tree_oak_dead"; | |||||
const oBush = "gaia/flora_bush_temperate"; | |||||
const oFruitBush = "gaia/flora_bush_berry"; | |||||
const oRabbit = "gaia/fauna_rabbit"; | |||||
const oGoat = "gaia/fauna_goat"; | |||||
const oBear = "gaia/fauna_bear"; | |||||
const oStoneLarge = "gaia/geology_stonemine_temperate_quarry"; | |||||
const oStoneSmall = "gaia/geology_stone_temperate"; | |||||
const oMetalLarge = "gaia/geology_metal_temperate_slabs"; | |||||
const oTower = "other/palisades_rocks_fort"; | |||||
// Decorative props | |||||
const aRockLarge = "actor|geology/stone_granite_med.xml"; | |||||
const aRockMedium = "actor|geology/stone_granite_med.xml"; | |||||
const aBushMedium = "actor|props/flora/bush_tempe_me.xml"; | |||||
const aBushSmall = "actor|props/flora/bush_tempe_sm.xml"; | |||||
const aGrass = "actor|props/flora/grass_soft_large_tall.xml"; | |||||
const aGrassShort = "actor|props/flora/grass_soft_large.xml"; | |||||
const pForestD = [ | |||||
tForestFloor1 + TERRAIN_SEPARATOR + oTree, | |||||
tForestFloor2 + TERRAIN_SEPARATOR + oTree2, | |||||
tForestFloor1 | |||||
]; | |||||
const pForestP = [ | |||||
Done Inline Actions]; on next line, below too bb: `];` on next line, below too | |||||
tForestFloor1 + TERRAIN_SEPARATOR + oTree3, | |||||
tForestFloor2 + TERRAIN_SEPARATOR + oTree4, | |||||
tForestFloor1 | |||||
]; | |||||
log("Initializing map..."); | |||||
InitMap(); | |||||
var P_FOREST = 0.7; | |||||
var totalTrees = scaleByMapSize(1200, 3000); | |||||
var numForest = totalTrees * P_FOREST; | |||||
var numStragglers = totalTrees * (1.0 - P_FOREST); | |||||
var numPlayers = getNumPlayers(); | |||||
var mapSize = getMapSize(); | |||||
var mapArea = mapSize * mapSize; | |||||
// create tile classes | |||||
var clPlayer = createTileClass(); | |||||
var clHill = createTileClass(); | |||||
var clFood = createTileClass(); | |||||
var clForest = createTileClass(); | |||||
var clWater = createTileClass(); | |||||
var clDirt = createTileClass(); | |||||
Done Inline Actionsever written too? bb: ever written too? | |||||
Not Done Inline ActionsSame story as on survival and many others - its the createFood function which grossly takes that as a default. But I'll pass it explicitly to make it more obvious, good point. elexis: Same story as on survival and many others - its the createFood function which grossly takes… | |||||
var clGrass = createTileClass(); | |||||
var clRock = createTileClass(); | |||||
var clMetal = createTileClass(); | |||||
Done Inline Actionsunused? bb: unused? | |||||
Not Done Inline ActionscreateLayeredPatches. Passing explicitly now. Actually wondering whether they look artistically good enough, or whether that map would be better off being more monotonous. elexis: createLayeredPatches. Passing explicitly now. Actually wondering whether they look artistically… | |||||
var clBaseResource = createTileClass(); | |||||
var clBumps = createTileClass(); | |||||
var clTower = createTileClass(); | |||||
Done Inline Actionsisn't this empty the first few usages? bb: isn't this empty the first few usages? | |||||
Not Done Inline ActionsIs. Removing the two misleading entries. elexis: Is. Removing the two misleading entries. | |||||
var ccMountainHeight = 25; | |||||
// randomize player order | |||||
var playerIDs = []; | |||||
for (let i = 0; i < numPlayers; ++i) | |||||
playerIDs.push(i+1); | |||||
Done Inline Actionslet bb: let | |||||
playerIDs = sortPlayers(playerIDs); | |||||
// Place players | |||||
var startAngle = randFloat(0, 2 * PI); | |||||
for (let i = 0; i < numPlayers; ++i) | |||||
{ | |||||
let playerAngle = startAngle + i * 2 * PI / numPlayers; | |||||
let playerX = 0.5 + 0.35 * Math.cos(playerAngle); | |||||
let playerZ = 0.5 + 0.35 * Math.sin(playerAngle); | |||||
Done Inline Actions2 * PI bb: 2 * PI | |||||
let id = playerIDs[i]; | |||||
log("Creating base for player " + id + "..."); | |||||
Done Inline Actions2 * PI and spaces bb: 2 * PI and spaces | |||||
let radius = scaleByMapSize(15, 25); | |||||
Done Inline ActionsMath. bb: Math. | |||||
let fx = fractionToTiles(playerX); | |||||
let fz = fractionToTiles(playerZ); | |||||
let ix = Math.round(fx); | |||||
Done Inline Actionsisn't that global? => move to top bb: isn't that global? => move to top | |||||
let iz = Math.round(fz); | |||||
// This one consists of many bumps, creating an omnidirectional ramp | |||||
createMountain( | |||||
ccMountainHeight, | |||||
Math.floor(scaleByMapSize(15, 15)), | |||||
Math.floor(scaleByMapSize(15, 15)), | |||||
Math.floor(scaleByMapSize(4, 10)), | |||||
Done Inline Actionsunneeded comment bb: unneeded comment | |||||
avoidClasses(), | |||||
ix, | |||||
iz, | |||||
tHillDark, | |||||
Done Inline ActionsMath. bb: Math. | |||||
clPlayer, | |||||
14); | |||||
// Flatten the initial CC area | |||||
let hillSize = PI * radius * radius; | |||||
createArea( | |||||
new ClumpPlacer(hillSize, 0.95, 0.6, 10, ix, iz), | |||||
[ | |||||
new LayeredPainter([tHillVeryDark, tHillMedium1], [radius]), | |||||
new SmoothElevationPainter(ELEVATION_SET, ccMountainHeight, radius), | |||||
paintClass(clPlayer) | |||||
], | |||||
null); | |||||
// Create the city patch | |||||
let cityRadius = radius / 3; | |||||
createArea( | |||||
new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz), | |||||
new LayeredPainter([tRoadWild, tRoad], [1]), | |||||
null); | |||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' }); | |||||
// Create metal mine | |||||
let mAngle = randFloat(0, 2 * PI); | |||||
let mDist = 12; | |||||
createObjectGroup( | |||||
new SimpleGroup( | |||||
[new SimpleObject(oMetalLarge, 1, 1, 0, 0)], | |||||
true, | |||||
clBaseResource, | |||||
Math.round(fx + mDist * Math.cos(mAngle)), | |||||
Math.round(fz + mDist * Math.sin(mAngle))), | |||||
0); | |||||
// Create stone mines | |||||
Done Inline Actions2 * PI bb: 2 * PI | |||||
mAngle += randFloat(PI/4, PI/3); | |||||
Done Inline Actionsunused bb: unused | |||||
createObjectGroup( | |||||
new SimpleGroup( | |||||
Done Inline ActionsMath. bb: Math. | |||||
[new SimpleObject(oStoneLarge, 1, 1, 0, 2)], | |||||
Done Inline Actions2 * Pi bb: 2 * Pi | |||||
Done Inline ActionsWas thinking if we could skip the while, but meh bb: Was thinking if we could skip the while, but meh | |||||
Not Done Inline Actionslet mAngle = bbAngle; pointless, entire loop pointless (since the intention is to keep a distance < x but > y to the berries, but those arent placed first here. elexis: let mAngle = bbAngle; pointless, entire loop pointless (since the intention is to keep a… | |||||
true, | |||||
clBaseResource, | |||||
Math.round(fx + mDist * Math.cos(mAngle)), | |||||
Math.round(fz + mDist * Math.sin(mAngle))), | |||||
Done Inline ActionsMath. and inline bb: Math. and inline | |||||
0); | |||||
placeDefaultChicken(fx, fz, clBaseResource); | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
// Create berry bushes | |||||
mAngle += randFloat(PI/4, PI/2); | |||||
let bbDist = 12; | |||||
createObjectGroup( | |||||
new SimpleGroup( | |||||
[new SimpleObject(oFruitBush, 5, 5, 0, 3)], | |||||
Done Inline Actionsinline and Math. bb: inline and Math. | |||||
true, | |||||
clBaseResource, | |||||
Math.round(fx + bbDist * Math.cos(mAngle)), | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
Math.round(fz + bbDist * Math.sin(mAngle))), | |||||
0); | |||||
// Create starting trees | |||||
let num = Math.floor(hillSize / 60); | |||||
let tries = 10; | |||||
for (let x = 0; x < tries; ++x) | |||||
{ | |||||
let tAngle = mAngle + randFloat(PI/3, PI/4); | |||||
let tDist = randFloat(10, 12); | |||||
Done Inline ActionsMath. and inline bb: Math. and inline | |||||
if (createObjectGroup( | |||||
new SimpleGroup( | |||||
[new SimpleObject(oTree2, num, num, 0, 3)], | |||||
false, | |||||
clBaseResource, | |||||
Math.round(fx + tDist * Math.cos(tAngle)), | |||||
Math.round(fz + tDist * Math.sin(tAngle))), | |||||
0, | |||||
avoidClasses(clBaseResource, 3))) | |||||
{ | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
RMS.SetProgress(15); | |||||
Done Inline ActionsMath. and inline bb: Math. and inline | |||||
createVolcano(0.5, 0.5, clHill, tHillVeryDark, undefined, false, ELEVATION_SET); | |||||
RMS.SetProgress(20); | |||||
log("Creating lakes..."); | |||||
createAreas( | |||||
new ChainPlacer(5, 6, Math.floor(scaleByMapSize(10, 14)), 0.1), | |||||
[ | |||||
new LayeredPainter([tShoreBlend, tShore, tWater], [1, 1]), | |||||
new SmoothElevationPainter(ELEVATION_SET, -4, 3), | |||||
paintClass(clWater) | |||||
], | |||||
Done Inline Actionshmmmpfff 15 => 45 => 20 lolz bb: hmmmpfff 15 => 45 => 20 lolz | |||||
Not Done Inline ActionsThis just reflects the coding process elexis: This just reflects the coding process | |||||
avoidClasses(clPlayer, 0, clHill, 2, clWater, 12), | |||||
Math.round(scaleByMapSize(6, 12))); | |||||
RMS.SetProgress(25); | |||||
createBumps(avoidClasses(clPlayer, 0, clHill, 0), scaleByMapSize(50, 300), 1, 10, 3, 0, scaleByMapSize(4, 10)); | |||||
paintTileClassBasedOnHeight(10, 100, 0, clBumps); | |||||
RMS.SetProgress(30); | |||||
log("Creating hills..."); | |||||
createAreas( | |||||
new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1), | |||||
[ | |||||
new LayeredPainter([tHillDark, tHillDark, tHillDark], [2, 2]), | |||||
new SmoothElevationPainter(ELEVATION_SET, 18, 2), | |||||
paintClass(clHill) | |||||
], | |||||
avoidClasses(clPlayer, 0, clHill, 15, clWater, 2, clBaseResource, 2), | |||||
scaleByMapSize(2, 8) * numPlayers); | |||||
RMS.SetProgress(35); | |||||
log("Creating forests..."); | |||||
var types = [ | |||||
[[tGrassB, tGrassA, pForestD], [tGrassB, pForestD]], | |||||
[[tGrassB, tGrassA, pForestP], [tGrassB, pForestP]] | |||||
]; | |||||
var size = numForest / (scaleByMapSize(4, 12) * numPlayers); | |||||
var num = Math.floor(size / types.length); | |||||
for (let i = 0; i < types.length; ++i) | |||||
createAreas( | |||||
new ClumpPlacer(numForest / num, 0.1, 0.1, 1), | |||||
[ | |||||
new LayeredPainter(types[i], [2]), | |||||
paintClass(clForest) | |||||
Not Done Inline Actionsglobal? bb: global? | |||||
], | |||||
avoidClasses( | |||||
clPlayer, 4, | |||||
Done Inline Actionsnuke .0 bb: nuke .0 | |||||
clForest, 10, | |||||
clHill, 0, | |||||
clWater, 2), | |||||
Done Inline Actionsglobals to top? bb: globals to top? | |||||
Not Done Inline ActionsYes sir (this was a leftover from rewriting 4 different forest methods, since all of them had some weird issues which I luckily don't recall) elexis: Yes sir (this was a leftover from rewriting 4 different forest methods, since all of them had… | |||||
num); | |||||
RMS.SetProgress(40); | |||||
log("Creating hill patches..."); | |||||
for (let size of [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]) | |||||
for (let type of [[tHillMedium1, tHillDark], [tHillDark, tHillMedium2], [tHillMedium1, tHillMedium2]]) | |||||
createAreas( | |||||
new ClumpPlacer(size, 0.3, 0.06, 0.5), | |||||
[ | |||||
Done Inline ActionsMath. bb: Math. | |||||
new LayeredPainter(type, [1]), | |||||
paintClass(clGrass) | |||||
], | |||||
avoidClasses( | |||||
clWater, 3, | |||||
clForest, 0, | |||||
clHill, 0, | |||||
clBumps, 0, | |||||
clPlayer, 0), | |||||
scaleByMapSize(20, 80)); | |||||
RMS.SetProgress(45); | |||||
log("Creating grass patches..."); | |||||
createLayeredPatches( | |||||
[scaleByMapSize(2, 4), scaleByMapSize(3, 7), scaleByMapSize(5, 15)], | |||||
[tGrassPatchBlend, tGrassPatch], | |||||
[1], | |||||
avoidClasses( | |||||
clWater, 1, | |||||
clForest, 0, | |||||
clHill, 0, | |||||
clGrass, 5, | |||||
clBumps, 0, | |||||
clPlayer, 0), | |||||
clDirt); | |||||
RMS.SetProgress(50); | |||||
log("Creating stone mines..."); | |||||
createObjectGroups( | |||||
new SimpleGroup( | |||||
[ | |||||
new SimpleObject(oStoneSmall, 0, 2, 0, 4), | |||||
new SimpleObject(oStoneLarge, 1, 1, 0, 4) | |||||
], | |||||
true, | |||||
clRock), | |||||
0, | |||||
[ | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
stayClasses(clBumps, 1), | |||||
avoidClasses( | |||||
clWater, 3, | |||||
clForest, 1, | |||||
clPlayer, 0, | |||||
clRock, 15, | |||||
clHill, 0) | |||||
], | |||||
100, | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
100); | |||||
RMS.SetProgress(55); | |||||
log("Creating small stone quarries..."); | |||||
createObjectGroups( | |||||
new SimpleGroup([new SimpleObject(oStoneSmall, 2, 5, 1, 3)], true, clRock), | |||||
0, | |||||
[ | |||||
stayClasses(clBumps, 1), | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
avoidClasses( | |||||
clWater, 3, | |||||
clForest, 1, | |||||
clPlayer, 0, | |||||
clRock, 15, | |||||
clHill, 0) | |||||
], | |||||
100, | |||||
100); | |||||
RMS.SetProgress(60); | |||||
log("Creating metal mines..."); | |||||
createObjectGroups( | |||||
new SimpleGroup([new SimpleObject(oMetalLarge, 1, 1, 0, 4)], true, clMetal), | |||||
0, | |||||
[ | |||||
stayClasses(clBumps, 1), | |||||
avoidClasses( | |||||
clWater, 3, | |||||
clForest, 1, | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
clPlayer, 0, | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
clMetal, 15, | |||||
clRock, 10, | |||||
clHill, 0) | |||||
], | |||||
100, | |||||
100); | |||||
RMS.SetProgress(65); | |||||
log("Creating towers..."); | |||||
createObjectGroups( | |||||
new SimpleGroup([new SimpleObject(oTower, 1, 1, 0, 4)], true, clTower), | |||||
0, | |||||
[ | |||||
stayClasses(clBumps, 3), | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
avoidClasses( | |||||
clMetal, 5, | |||||
clRock, 5, | |||||
clHill, 0, | |||||
clTower, 60, | |||||
clPlayer, 10, | |||||
clForest, 2) | |||||
Done Inline ActionsIndentation bb: Indentation | |||||
], | |||||
500, | |||||
1); | |||||
RMS.SetProgress(67); | |||||
createDecoration( | |||||
[ | |||||
[new SimpleObject(aGrassShort, 1, 2, 0, 1)], | |||||
[ | |||||
new SimpleObject(aGrass, 2, 4, 0, 1.8), | |||||
new SimpleObject(aGrassShort, 3, 6, 1.2, 2.5) | |||||
], | |||||
[ | |||||
new SimpleObject(aBushMedium, 1, 2, 0, 2), | |||||
new SimpleObject(aBushSmall, 2, 4, 0, 2) | |||||
] | |||||
], | |||||
[ | |||||
Done Inline Actionswhitespaces and trailing comma bb: whitespaces and trailing comma | |||||
scaleByMapSize(15, 200), | |||||
scaleByMapSize(15, 200), | |||||
scaleByMapSize(15, 200) | |||||
], | |||||
[ | |||||
stayClasses(clGrass, 0), | |||||
avoidClasses( | |||||
clWater, 0, | |||||
clForest, 0, | |||||
clPlayer, 0, | |||||
clHill, 0) | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
]); | |||||
RMS.SetProgress(70); | |||||
createDecoration( | |||||
[ | |||||
[ | |||||
new SimpleObject(aRockMedium, 1, 3, 0, 1) | |||||
], | |||||
[ | |||||
new SimpleObject(aRockLarge, 1, 2, 0, 1), | |||||
new SimpleObject(aRockMedium, 1, 3, 0, 2) | |||||
Done Inline ActionsMath. bb: Math. | |||||
] | |||||
], | |||||
[ | |||||
scaleByMapSize(15, 250), | |||||
scaleByMapSize(15, 150) | |||||
], | |||||
avoidClasses( | |||||
clWater, 0, | |||||
clForest, 0, | |||||
clPlayer, 0, | |||||
clHill, 0 | |||||
)); | |||||
RMS.SetProgress(75); | |||||
Done Inline Actionsok, we create an array of 1 element ask for its length and loop over it : nucular bb: ok, we create an array of 1 element ask for its length and loop over it : nucular | |||||
Not Done Inline ActionsLooked for other bush models, but that only other one seems to be a dupe. elexis: Looked for other bush models, but that only other one seems to be a dupe.
Also reusing… | |||||
createFood( | |||||
Done Inline ActionsMath. bb: Math. | |||||
[ | |||||
[new SimpleObject(oRabbit, 5, 7, 2, 4)], | |||||
[new SimpleObject(oGoat, 3, 5, 2, 4)] | |||||
], | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
[ | |||||
scaleByMapSize(1, 6) * numPlayers, | |||||
scaleByMapSize(3, 10) * numPlayers | |||||
], | |||||
[ | |||||
avoidClasses( | |||||
clWater, 1, | |||||
clForest, 0, | |||||
clPlayer, 0, | |||||
clHill, 1, | |||||
Done Inline ActionsMy suggestion (which I said at the chat to @elexis): setWaterColor(0.035, 0.047, 0.05); setWaterTint(0.058, 0.05, 0.035); P.S. Water shaders should be fixed too, also a water transparent param should be added there too. vladislavbelov: My suggestion (which I said at the chat to @elexis):
```lang=javascript
setWaterColor(0.035, 0. | |||||
Done Inline ActionsAlso I suggest to add murkiness: setWaterMurkiness(0.9); vladislavbelov: Also I suggest to add murkiness:
```lang=javascript
setWaterMurkiness(0.9);
``` | |||||
Not Done Inline ActionsThanks! Also misses water waviness, since those puddles shouldn't have ocean waves elexis: Thanks! Also misses water waviness, since those puddles shouldn't have ocean waves | |||||
Not Done Inline ActionsActually the color was equivalent to black, which was only noticeable when using the worst ugliest water settings possible. So keeping the hueness and saturation, just increasing the value of the water color a bit. elexis: Actually the color was equivalent to black, which was only noticeable when using the worst… | |||||
clFood, 20) | |||||
], | |||||
clFood); | |||||
RMS.SetProgress(78); | |||||
createFood( | |||||
[ | |||||
[new SimpleObject(oBear, 1, 1, 0, 2)] | |||||
], | |||||
[ | |||||
3 * numPlayers | |||||
], | |||||
[ | |||||
avoidClasses( | |||||
clWater, 1, | |||||
clForest, 0, | |||||
clPlayer, 0, | |||||
clHill, 1, | |||||
clFood, 20 | |||||
), | |||||
stayClasses(clForest, 2) | |||||
], | |||||
clFood); | |||||
RMS.SetProgress(81); | |||||
createFood( | |||||
[ | |||||
[new SimpleObject(oFruitBush, 1, 2, 0, 4)] | |||||
], | |||||
[ | |||||
3 * numPlayers | |||||
], | |||||
[stayClasses(clGrass, 1), avoidClasses(clWater, 1, clForest, 0, clPlayer, 0, clHill, 1, clFood, 10)], | |||||
clFood); | |||||
RMS.SetProgress(85); | |||||
log("Creating straggler trees and bushes..."); | |||||
var types = [oTree, oTree2, oTree3, oTree4, oBush]; | |||||
var num = Math.floor(numStragglers / types.length); | |||||
for (let type of types) | |||||
createObjectGroups( | |||||
new SimpleGroup( | |||||
[new SimpleObject(type, 1, 1, 0, 3)], | |||||
true, | |||||
clForest), | |||||
0, | |||||
[ | |||||
stayClasses(clGrass, 1), | |||||
avoidClasses( | |||||
clWater, 5, | |||||
clForest, 1, | |||||
clHill, 1, | |||||
clPlayer, 0, | |||||
clMetal, 1, | |||||
clRock, 1) | |||||
], | |||||
num); | |||||
RMS.SetProgress(90); | |||||
log("Creating straggler bushes..."); | |||||
createObjectGroups( | |||||
new SimpleGroup( | |||||
[new SimpleObject(oBush, 1, 3, 0, 3)], | |||||
true, | |||||
clForest | |||||
), | |||||
0, | |||||
[ | |||||
stayClasses(clGrass, 3), | |||||
avoidClasses( | |||||
clWater, 1, | |||||
clForest, 1, | |||||
clPlayer, 0, | |||||
clMetal, 1, | |||||
clRock, 1) | |||||
], | |||||
numStragglers); | |||||
RMS.SetProgress(95); | |||||
setWaterType("lake"); | |||||
setWaterWaviness(2); | |||||
setWaterColor(0.035, 0.047, 0.05); | |||||
setWaterTint(0.058, 0.05, 0.035); | |||||
setWaterMurkiness(0.9); | |||||
setPPEffect("hdr"); | |||||
ExportMap(); |
Why we have these duplicate consts? more of them below