Changeset View
Standalone View
binaries/data/mods/public/maps/random/extinct_volcano.js
- This file was added.
//ungatherable trees, initial trees stuck too | |||||
//zoom restriction | |||||
//lakes too small | |||||
//countdown timer for water | |||||
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) | |||||
// little actor stones | |||||
// volcano dust cloud | |||||
// bush_temple_underbrush | |||||
// grass_field_flowering_tall | |||||
// plant_tropic_large | |||||
// pond_lillies_large | |||||
// reeds_pond_lush_b | |||||
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… | |||||
// shrub_spikes | |||||
// shrub_tropic_plant_flower | |||||
/* | |||||
tons of lag when rising the water the first time, fix by greater tree min dist | |||||
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) | |||||
Cc hills might be higher | |||||
giant maps never ever load | |||||
paint terrain based on height | |||||
keep ways for ships to travel between players | |||||
mines should be rather on hills | |||||
few supermountains? | |||||
*/ | |||||
RMS.LoadLibrary("rmgen"); | |||||
const tHillDark = "cliff volcanic light"; | |||||
const tCliff = tHillDark; | |||||
const tHillMedium1 = "ocean_rock_a"; | |||||
const tHillMedium2 = "ocean_rock_b"; | |||||
const tHillVeryDark = ["cliff volcanic coarse", "cave_walls"]; | |||||
const tRoad = "road1"; | |||||
const tRoadWild = "road1"; | |||||
const tForestFloor1 = tHillMedium1; //"temp_forestfloor_a"; | |||||
const tForestFloor2 = tHillMedium2; //"temp_grass"; | |||||
const tGrass3 = "temp_grass_plants"; | |||||
const tGrassPatchBlend = "temp_grass_long_b"; | |||||
const tGrassPatch = ["temp_grass_d", "temp_grass_clovers"]; | |||||
const tLava1 = "cliff volcanic light"; // TODO: | |||||
const tLava2 = "cliff volcanic light"; | |||||
const tLava3 = "cliff volcanic light"; | |||||
const tShoreBlend = "cliff volcanic light"; | |||||
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"; | |||||
Done Inline Actions]; on next line, below too bb: `];` on next line, below too | |||||
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 oDeer = "gaia/fauna_deer"; | |||||
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"; | |||||
// 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]; | |||||
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… | |||||
const pForestP = [ | |||||
tForestFloor1 + TERRAIN_SEPARATOR + oTree3, | |||||
tForestFloor2 + TERRAIN_SEPARATOR + oTree4, | |||||
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… | |||||
tForestFloor1]; | |||||
const pForestM = [ | |||||
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. | |||||
tForestFloor1 + TERRAIN_SEPARATOR + oTree, | |||||
tForestFloor2 + TERRAIN_SEPARATOR + oTree2, | |||||
tForestFloor2 + TERRAIN_SEPARATOR + oTree3, | |||||
tForestFloor1 + TERRAIN_SEPARATOR + oTree4, | |||||
tForestFloor1]; | |||||
log("Initializing map..."); | |||||
Done Inline Actionslet bb: let | |||||
InitMap(); | |||||
var numPlayers = getNumPlayers(); | |||||
var mapSize = getMapSize(); | |||||
var mapArea = mapSize * mapSize; | |||||
// create tile classes | |||||
var clPlayer = createTileClass(); | |||||
var clHill = createTileClass(); | |||||
Done Inline Actions2 * PI bb: 2 * PI | |||||
var clFood = createTileClass(); | |||||
var clForest = createTileClass(); | |||||
var clWater = createTileClass(); | |||||
Done Inline Actions2 * PI and spaces bb: 2 * PI and spaces | |||||
var clDirt = createTileClass(); | |||||
var clGrass = createTileClass(); | |||||
Done Inline ActionsMath. bb: Math. | |||||
var clRock = createTileClass(); | |||||
var clMetal = createTileClass(); | |||||
var clBaseResource = createTileClass(); | |||||
Done Inline Actionsisn't that global? => move to top bb: isn't that global? => move to top | |||||
var clBumps = createTileClass(); | |||||
// randomize player order | |||||
var playerIDs = []; | |||||
for (var i = 0; i < numPlayers; i++) | |||||
playerIDs.push(i+1); | |||||
playerIDs = sortPlayers(playerIDs); | |||||
Done Inline Actionsunneeded comment bb: unneeded comment | |||||
// place players | |||||
var playerX = new Array(numPlayers); | |||||
var playerZ = new Array(numPlayers); | |||||
var playerAngle = new Array(numPlayers); | |||||
Done Inline ActionsMath. bb: Math. | |||||
var startAngle = randFloat(0, TWO_PI); | |||||
for (var i = 0; i < numPlayers; i++) | |||||
{ | |||||
playerAngle[i] = startAngle + i*TWO_PI/numPlayers; | |||||
playerX[i] = 0.5 + 0.35*cos(playerAngle[i]); | |||||
playerZ[i] = 0.5 + 0.35*sin(playerAngle[i]); | |||||
} | |||||
var ccMountainHeight = 25; | |||||
for (var i = 0; i < numPlayers; i++) | |||||
{ | |||||
var id = playerIDs[i]; | |||||
log("Creating base for player " + id + "..."); | |||||
var radius = scaleByMapSize(15,25); | |||||
// get the x and z in tiles | |||||
var fx = fractionToTiles(playerX[i]); | |||||
var fz = fractionToTiles(playerZ[i]); | |||||
var ix = round(fx); | |||||
var iz = 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)), | |||||
avoidClasses(), | |||||
ix, | |||||
iz, | |||||
tHillDark, | |||||
clPlayer, | |||||
14 | |||||
Done Inline Actions2 * PI bb: 2 * PI | |||||
); | |||||
Done Inline Actionsunused bb: unused | |||||
// Flatten the initial CC area | |||||
Done Inline ActionsMath. bb: Math. | |||||
var hillSize = PI * radius * radius; | |||||
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… | |||||
createArea( | |||||
new ClumpPlacer(hillSize, 0.95, 0.6, 10, ix, iz), | |||||
[ | |||||
new LayeredPainter([tHillVeryDark, tHillMedium1], [radius]), | |||||
Done Inline ActionsMath. and inline bb: Math. and inline | |||||
new SmoothElevationPainter(ELEVATION_SET, ccMountainHeight, radius), | |||||
paintClass(clPlayer) | |||||
], | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
null); | |||||
// create the city patch | |||||
var cityRadius = radius/3; | |||||
var placer = new ClumpPlacer(PI*cityRadius*cityRadius, 0.6, 0.3, 10, ix, iz); | |||||
var painter = new LayeredPainter([tRoadWild, tRoad], [1]); | |||||
createArea(placer, painter, null); | |||||
Done Inline Actionsinline and Math. bb: inline and Math. | |||||
placeCivDefaultEntities(fx, fz, id, { 'iberWall': 'towers' }); | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
// create metal mine | |||||
var bbAngle = randFloat(0, TWO_PI); | |||||
var bbDist = 10; | |||||
var mAngle = bbAngle; | |||||
while(abs(mAngle - bbAngle) < PI/3) | |||||
mAngle = randFloat(0, TWO_PI); | |||||
var mDist = 12; | |||||
var mX = round(fx + mDist * cos(mAngle)); | |||||
var mZ = round(fz + mDist * sin(mAngle)); | |||||
Done Inline ActionsMath. and inline bb: Math. and inline | |||||
var group = new SimpleGroup( | |||||
[new SimpleObject(oMetalLarge, 1,1, 0,0)], | |||||
true, clBaseResource, mX, mZ | |||||
); | |||||
createObjectGroup(group, 0); | |||||
// create stone mines | |||||
mAngle += randFloat(PI/4, PI/3); | |||||
mX = round(fx + mDist * cos(mAngle)); | |||||
mZ = round(fz + mDist * sin(mAngle)); | |||||
group = new SimpleGroup( | |||||
[new SimpleObject(oStoneLarge, 1,1, 0,2)], | |||||
true, clBaseResource, mX, mZ | |||||
); | |||||
createObjectGroup(group, 0); | |||||
Done Inline ActionsMath. and inline bb: Math. and inline | |||||
placeDefaultChicken(fx, fz, clBaseResource); | |||||
// create berry bushes | |||||
mAngle += randFloat(PI/4, PI/2); | |||||
var bbDist = 12; | |||||
var bbX = round(fx + bbDist * Math.cos(mAngle)); | |||||
var bbZ = round(fz + bbDist * Math.sin(mAngle)); | |||||
createObjectGroup( | |||||
new SimpleGroup( | |||||
[new SimpleObject(oFruitBush, 5, 5, 0, 3)], | |||||
true, clBaseResource, bbX, bbZ), | |||||
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 | |||||
0); | |||||
// create starting trees | |||||
var num = Math.floor(hillSize / 60); | |||||
var tries = 10; | |||||
for (var x = 0; x < tries; ++x) | |||||
{ | |||||
var tAngle = mAngle + randFloat(PI/3, PI/4); | |||||
var tDist = randFloat(10, 12); | |||||
var tX = round(fx + tDist * cos(tAngle)); | |||||
var tZ = round(fz + tDist * sin(tAngle)); | |||||
group = new SimpleGroup( | |||||
[new SimpleObject(oTree2, num, num, 0, 3)], | |||||
false, clBaseResource, tX, tZ | |||||
); | |||||
if (createObjectGroup(group, 0, avoidClasses(clBaseResource, 2))) | |||||
break; | |||||
} | |||||
} | |||||
RMS.SetProgress(15); | |||||
createVolcano(0.5, 0.5, clHill, tHillVeryDark, ELEVATION_SET, false); | |||||
RMS.SetProgress(45); | |||||
log("Creating lakes..."); | |||||
createAreas( | |||||
new ChainPlacer(1, Math.floor(scaleByMapSize(5, 7)), Math.floor(scaleByMapSize(15, 20)), 0.1), | |||||
[ | |||||
new LayeredPainter([tShoreBlend, tShore, tWater], [1,1]), | |||||
new SmoothElevationPainter(ELEVATION_SET, -4, 3), | |||||
paintClass(clWater) | |||||
], | |||||
avoidClasses(clPlayer, 0, clHill, 2, clWater, 12), | |||||
Not Done Inline Actionsglobal? bb: global? | |||||
Math.round(scaleByMapSize(4, 12)) | |||||
); | |||||
Done Inline Actionsnuke .0 bb: nuke .0 | |||||
createBumps(avoidClasses(clPlayer, 0, clHill, 0), scaleByMapSize(50, 300), 1, 10, 3, 0, 8, 500); | |||||
paintTileClassBasedOnHeight(10, 100, 0, clBumps); | |||||
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… | |||||
log("Creating hills..."); | |||||
createAreas( | |||||
new ClumpPlacer(scaleByMapSize(20, 150), 0.2, 0.1, 1), | |||||
[ | |||||
new LayeredPainter([tHillDark, tHillMedium1, tHillMedium1], [2, 2]), | |||||
new SmoothElevationPainter(ELEVATION_SET, 18, 2), | |||||
paintClass(clHill) | |||||
], | |||||
avoidClasses(clPlayer, 0, clHill, 15, clWater, 2, clBaseResource, 2), | |||||
Done Inline ActionsMath. bb: Math. | |||||
scaleByMapSize(2, 8) * numPlayers | |||||
); | |||||
log("Creating forests..."); | |||||
var MIN_TREES = 800; | |||||
var MAX_TREES = 2000; | |||||
var P_FOREST = 0.7; | |||||
var totalTrees = scaleByMapSize(MIN_TREES, MAX_TREES); | |||||
var numForest = totalTrees * P_FOREST; | |||||
var numStragglers = totalTrees * (1.0 - P_FOREST); | |||||
var tGrass = ["cliff volcanic light", "ocean_rock_a", "ocean_rock_b"]; | |||||
var tGrassA = "cliff volcanic light"; | |||||
var tGrassB = "ocean_rock_a"; | |||||
log("Creating forests..."); | |||||
var types = [ | |||||
[[tGrassB, tGrassA, pForestD], [tGrassB, pForestD]], | |||||
[[tGrassB, tGrassA, pForestP], [tGrassB, pForestP]] | |||||
]; | |||||
var size = numForest / (scaleByMapSize(2,8) * numPlayers); | |||||
var num = floor(size / types.length); | |||||
for (var i = 0; i < types.length; ++i) | |||||
createAreas( | |||||
new ClumpPlacer(numForest / num, 0.1, 0.1, 1), | |||||
[ | |||||
new LayeredPainter(types[i], [2]), | |||||
paintClass(clForest) | |||||
], | |||||
avoidClasses(clPlayer, 12, clForest, 10, clHill, 0), | |||||
num | |||||
); | |||||
RMS.SetProgress(45); | |||||
log("Creating hill patches..."); | |||||
for (let size of [scaleByMapSize(3, 48), scaleByMapSize(5, 84), scaleByMapSize(8, 128)]) | |||||
for (let type of [[tHillMedium1, tHillDark], [tHillDark, tHillVeryDark], [tHillMedium1, tHillVeryDark]]) | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
createAreas( | |||||
new ClumpPlacer(size, 0.3, 0.06, 0.5), | |||||
[ | |||||
new LayeredPainter(type, [1]), | |||||
paintClass(clGrass) | |||||
], | |||||
avoidClasses(clWater, 3, clForest, 0, clHill, 0, clBumps, 0, clPlayer, 0), | |||||
scaleByMapSize(20, 80) | |||||
); | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
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) | |||||
); | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
log("Creating stone mines..."); | |||||
group = new SimpleGroup([new SimpleObject(oStoneSmall, 0,2, 0,4), new SimpleObject(oStoneLarge, 1,1, 0,4)], true, clRock); | |||||
createObjectGroups(group, 0, | |||||
[stayClasses(clBumps, 1), avoidClasses(clWater, 3, clForest, 1, clPlayer, 0, clRock, 10, clHill, 4)], | |||||
scaleByMapSize(4,16), 100 | |||||
); | |||||
log("Creating small stone quarries..."); | |||||
createObjectGroups( | |||||
new SimpleGroup([new SimpleObject(oStoneSmall, 2,5, 1,3)], true, clRock), | |||||
0, | |||||
[stayClasses(clBumps, 1), avoidClasses(clWater, 3, clForest, 1, clPlayer, 0, clRock, 10, clHill, 4)], | |||||
scaleByMapSize(4,16), 100 | |||||
); | |||||
log("Creating metal mines..."); | |||||
group = new SimpleGroup([new SimpleObject(oMetalLarge, 1,1, 0,4)], true, clMetal); | |||||
createObjectGroups(group, 0, | |||||
[stayClasses(clBumps, 1), avoidClasses(clWater, 3, clForest, 1, clPlayer, 0, clMetal, 10, clRock, 5, clHill, 4)], | |||||
scaleByMapSize(4,16), 100 | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
); | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
RMS.SetProgress(90); | |||||
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)] | |||||
], | |||||
[ | |||||
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 | |||||
); | |||||
createDecoration( | |||||
[ | |||||
[new SimpleObject(aRockMedium, 1, 3, 0, 1)], | |||||
[new SimpleObject(aRockLarge, 1, 2, 0, 1), new SimpleObject(aRockMedium, 1,3, 0,2)] | |||||
], | |||||
Done Inline ActionsIndentation bb: Indentation | |||||
[ | |||||
scaleByMapSize(15, 250), | |||||
scaleByMapSize(15, 150) | |||||
], | |||||
avoidClasses(clWater, 0, clForest, 0, clPlayer, 0, clHill, 0) | |||||
); | |||||
createFood( | |||||
[ | |||||
[new SimpleObject(oRabbit, 5,7, 0,4)], | |||||
[new SimpleObject(oDeer, 2,3, 0,2)] | |||||
], | |||||
[ | |||||
3 * numPlayers, | |||||
3 * numPlayers | |||||
], | |||||
[avoidClasses(clWater, 1, clForest, 0, clPlayer, 0, clHill, 1, clFood, 20)] | |||||
); | |||||
Done Inline Actionswhitespaces and trailing comma bb: whitespaces and trailing comma | |||||
createFood( | |||||
[ | |||||
[new SimpleObject(oBear, 1,1, 0,2)], | |||||
], | |||||
[ | |||||
3 * numPlayers | |||||
], | |||||
[avoidClasses(clWater, 1, clForest, 0, clPlayer, 0, clHill, 1, clFood, 20), stayClasses(clForest, 2)] | |||||
); | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
createFood( | |||||
[ | |||||
[new SimpleObject(oFruitBush, 1,2, 0,4)] | |||||
], | |||||
[ | |||||
3 * numPlayers | |||||
], | |||||
[stayClasses(clGrass, 1), avoidClasses(clWater, 1, clForest, 0, clPlayer, 0, clHill, 1, clFood, 10)] | |||||
); | |||||
RMS.SetProgress(95); | |||||
Done Inline ActionsMath. bb: Math. | |||||
log("Creating straggler trees and bushes..."); | |||||
var types = [oTree, oTree2, oTree3, oTree4, oBush]; | |||||
var num = 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 | |||||
); | |||||
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… | |||||
log("Creating straggler bushes..."); | |||||
Done Inline ActionsMath. bb: Math. | |||||
var types = [oBush]; | |||||
var num = floor(numStragglers / types.length); | |||||
for (let type of types) | |||||
createObjectGroups( | |||||
Done Inline Actionswhitespaces bb: whitespaces | |||||
new SimpleGroup( | |||||
[new SimpleObject(type, 1,3, 0,3)], | |||||
true, clForest | |||||
), | |||||
0, | |||||
[avoidClasses(clWater, 1, clForest, 1, clPlayer, 0, clMetal, 1, clRock, 1), stayClasses(clGrass, 3)], | |||||
num | |||||
); | |||||
ExportMap(); | |||||
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… |
Why we have these duplicate consts? more of them below