Changeset View
Changeset View
Standalone View
Standalone View
binaries/data/mods/public/maps/random/echo_valley.js
- This file was added.
Engine.LoadLibrary("rmgen"); | |||||
Engine.LoadLibrary("rmgen-common"); | |||||
Engine.LoadLibrary("rmgen2"); | |||||
Engine.LoadLibrary("rmbiome"); | |||||
setSelectedBiome(); | |||||
var elevation = 25; | |||||
var g_Map = new RandomMap(elevation, g_Terrains.mainTerrain); | |||||
initTileClasses(); | |||||
createArea( | |||||
new MapBoundsPlacer(), | |||||
new TileClassPainter(g_TileClasses.land)); | |||||
// check if the teams are of even size | |||||
let teams = getTeamsArray(); | |||||
let evenTeams = true; | |||||
let teamLength = teams[0].length; | |||||
for (let i = 1; i < teams.length; ++i) | |||||
{ | |||||
if(teams[i].length != teamLength) | |||||
{ | |||||
evenTeams = false; | |||||
break; | |||||
} | |||||
} | |||||
// determine the valid starting placements | |||||
let validPatterns = ["radial", "line"]; | |||||
// only allow stronghold placement for 2 teams since it's not perfectly symmetrical | |||||
if (evenTeams && teams.length == 2) | |||||
validPatterns.push("stronghold"); | |||||
// limit placement to radial if there's an odd number of players on each team | |||||
if (!evenTeams) | |||||
validPatterns = ["radial"]; | |||||
// pick a valid starting placement | |||||
let pattern = g_MapSettings.TeamPlacement; | |||||
if (!validPatterns.includes(pattern)) | |||||
pattern = pickRandom(validPatterns); | |||||
let distance = g_PlayerbaseTypes[pattern].distance; | |||||
let groupedDistance = g_PlayerbaseTypes[pattern].groupedDistance; | |||||
var mapSize = g_Map.getSize(); | |||||
var mapCenter = g_Map.getCenter(); | |||||
// when there are an even number of players on each team either divide the map based on the number of players or the number of teams, and always dividing by teams if there's a stronghold or line placement to prevent inaccurately coping the player tile class to other wedges since there are multiple players placed per wedge | |||||
let groups = getNumPlayers(); | |||||
if (evenTeams) | |||||
if(randIntInclusive(0, 1) == 1 || pattern == "stronghold" || pattern == "line") | |||||
groups = teams.length; | |||||
// Get the a single player's slice of the map in radians | |||||
var playerRadians = 2 * Math.PI / groups; | |||||
// If there is an odd number we halve the slice so we stay symmetrical | |||||
if (groups % 2 != 0) | |||||
playerRadians = playerRadians / 2; | |||||
// center the starting angle on the first groups midline | |||||
g_Map.startAngle = playerRadians / 2; | |||||
// if mirroring based on teams, then center the players inside the team's wedge | |||||
if (pattern == "radial" && groups != getNumPlayers()) | |||||
g_Map.startAngle = playerRadians / getNumPlayers(); | |||||
// create a wedge area that will be our reference for copying terrain and entities onto the rest of the map | |||||
createArea( | |||||
new WedgePlacer(mapCenter, 0, playerRadians), | |||||
new TileClassPainter(g_TileClasses.wedge) | |||||
); | |||||
// mark the future base locations for resource avoidance | |||||
if (!isNomad()) | |||||
{ | |||||
let baseLocations = g_PlayerbaseTypes[pattern].getPosition(distance, groupedDistance, g_Map.startAngle); | |||||
for (let i = 0; i < baseLocations[1].length; ++i) | |||||
addCivicCenterAreaToClass(baseLocations[1][i], g_TileClasses.player) | |||||
} | |||||
Engine.SetProgress(20); | |||||
var features = [ | |||||
{ | |||||
"func": addHills, | |||||
"avoid": [ | |||||
g_TileClasses.bluff, 5, | |||||
g_TileClasses.hill, 15, | |||||
g_TileClasses.mountain, 2, | |||||
g_TileClasses.plateau, 15, | |||||
g_TileClasses.player, 20, | |||||
g_TileClasses.valley, 2, | |||||
g_TileClasses.water, 2 | |||||
], | |||||
"stay": [ | |||||
g_TileClasses.wedge, 2 | |||||
], | |||||
"sizes": ["tiny"], | |||||
"mixes": g_AllMixes, | |||||
"amounts": ["normal"] | |||||
}, | |||||
{ | |||||
"func": addMountains, | |||||
"avoid": [ | |||||
g_TileClasses.bluff, 15, | |||||
g_TileClasses.hill, 5, | |||||
g_TileClasses.mountain, 15, | |||||
g_TileClasses.plateau, 15, | |||||
g_TileClasses.player, 20, | |||||
g_TileClasses.valley, 5, | |||||
g_TileClasses.water, 2 | |||||
], | |||||
"stay": [ | |||||
g_TileClasses.wedge, 6 | |||||
], | |||||
"sizes": ["tiny"], | |||||
"mixes": g_AllMixes, | |||||
"amounts": ["normal"] | |||||
}, | |||||
{ | |||||
"func": addPlateaus, | |||||
"avoid": [ | |||||
g_TileClasses.bluff, 15, | |||||
g_TileClasses.hill, 5, | |||||
g_TileClasses.mountain, 15, | |||||
g_TileClasses.plateau, 15, | |||||
g_TileClasses.player, 20, | |||||
g_TileClasses.valley, 5, | |||||
g_TileClasses.water, 2 | |||||
], | |||||
"stay": [ | |||||
g_TileClasses.wedge, 8 | |||||
], | |||||
"sizes": ["tiny"], | |||||
"mixes": ["normal"], | |||||
"amounts": ["normal"] | |||||
} | |||||
]; | |||||
addElements(shuffleArray(features)); | |||||
Engine.SetProgress(30); | |||||
addElements([ | |||||
{ | |||||
"func": addLayeredPatches, | |||||
"avoid": [ | |||||
g_TileClasses.bluff, 2, | |||||
g_TileClasses.dirt, 5, | |||||
g_TileClasses.forest, 2, | |||||
g_TileClasses.mountain, 2, | |||||
g_TileClasses.plateau, 2, | |||||
g_TileClasses.player, 12, | |||||
g_TileClasses.water, 2 | |||||
], | |||||
"stay": [ | |||||
g_TileClasses.wedge, 1 | |||||
], | |||||
"sizes": ["normal"], | |||||
"mixes": ["normal"], | |||||
"amounts": ["normal"] | |||||
}, | |||||
{ | |||||
"func": addDecoration, | |||||
"avoid": [ | |||||
g_TileClasses.bluff, 1, | |||||
g_TileClasses.forest, 1, | |||||
g_TileClasses.mountain, 1, | |||||
g_TileClasses.plateau, 1, | |||||
g_TileClasses.player, 12, | |||||
g_TileClasses.water, 1 | |||||
], | |||||
"stay": [ | |||||
g_TileClasses.wedge, 1 | |||||
], | |||||
"sizes": ["normal"], | |||||
"mixes": ["normal"], | |||||
"amounts": ["normal"] | |||||
} | |||||
]); | |||||
Engine.SetProgress(40); | |||||
addElements(shuffleArray([ | |||||
{ | |||||
"func": addMetal, | |||||
"avoid": [ | |||||
g_TileClasses.berries, 3, | |||||
g_TileClasses.bluff, 2, | |||||
g_TileClasses.forest, 2, | |||||
g_TileClasses.mountain, 3, | |||||
g_TileClasses.plateau, 3, | |||||
g_TileClasses.player, 30, | |||||
g_TileClasses.rock, 5, | |||||
g_TileClasses.metal, 15, | |||||
g_TileClasses.water, 2 | |||||
], | |||||
"stay": [ | |||||
g_TileClasses.wedge, 1 | |||||
], | |||||
"sizes": ["normal"], | |||||
"mixes": ["similar"], | |||||
"amounts": ["normal", "many"] | |||||
}, | |||||
{ | |||||
"func": addStone, | |||||
"avoid": [ | |||||
g_TileClasses.berries, 3, | |||||
g_TileClasses.bluff, 2, | |||||
g_TileClasses.forest, 3, | |||||
g_TileClasses.mountain, 4, | |||||
g_TileClasses.plateau, 4, | |||||
g_TileClasses.player, 30, | |||||
g_TileClasses.rock, 15, | |||||
g_TileClasses.metal, 5, | |||||
g_TileClasses.water, 2 | |||||
], | |||||
"stay": [ | |||||
g_TileClasses.wedge, 1 | |||||
], | |||||
"sizes": ["normal"], | |||||
"mixes": ["normal"], | |||||
"amounts": ["scarce", "few", "normal"] | |||||
}, | |||||
{ | |||||
"func": addForests, | |||||
"avoid": [ | |||||
g_TileClasses.berries, 3, | |||||
g_TileClasses.bluff, 2, | |||||
g_TileClasses.forest, 15, | |||||
g_TileClasses.metal, 2, | |||||
g_TileClasses.mountain, 4, | |||||
g_TileClasses.plateau, 4, | |||||
g_TileClasses.player, 20, | |||||
g_TileClasses.rock, 2, | |||||
g_TileClasses.water, 2 | |||||
], | |||||
"stay": [ | |||||
g_TileClasses.wedge, 1 | |||||
], | |||||
"sizes": ["normal"], | |||||
"mixes": g_AllMixes, | |||||
"amounts": ["normal", "many"] | |||||
} | |||||
])); | |||||
Engine.SetProgress(50); | |||||
addElements(shuffleArray([ | |||||
{ | |||||
"func": addBerries, | |||||
"avoid": [ | |||||
g_TileClasses.berries, 15, | |||||
g_TileClasses.bluff, 2, | |||||
g_TileClasses.forest, 3, | |||||
g_TileClasses.metal, 5, | |||||
g_TileClasses.mountain, 4, | |||||
g_TileClasses.plateau, 4, | |||||
g_TileClasses.player, 20, | |||||
g_TileClasses.rock, 5, | |||||
g_TileClasses.water, 2 | |||||
], | |||||
"stay": [ | |||||
g_TileClasses.wedge, 1 | |||||
], | |||||
"sizes": ["normal"], | |||||
"mixes": g_AllMixes, | |||||
"amounts": ["normal"] | |||||
}, | |||||
{ | |||||
"func": addAnimals, | |||||
"avoid": [ | |||||
g_TileClasses.animals, 15, | |||||
g_TileClasses.bluff, 2, | |||||
g_TileClasses.forest, 2, | |||||
g_TileClasses.metal, 2, | |||||
g_TileClasses.mountain, 4, | |||||
g_TileClasses.plateau, 4, | |||||
g_TileClasses.player, 20, | |||||
g_TileClasses.rock, 2, | |||||
g_TileClasses.water, 2 | |||||
], | |||||
"stay": [ | |||||
g_TileClasses.wedge, 1 | |||||
], | |||||
"sizes": ["normal"], | |||||
"mixes": g_AllMixes, | |||||
"amounts": ["normal"] | |||||
}, | |||||
{ | |||||
"func": addStragglerTrees, | |||||
"avoid": [ | |||||
g_TileClasses.berries, 2, | |||||
g_TileClasses.bluff, 2, | |||||
g_TileClasses.forest, 4, | |||||
g_TileClasses.metal, 2, | |||||
g_TileClasses.mountain, 2, | |||||
g_TileClasses.plateau, 2, | |||||
g_TileClasses.player, 12, | |||||
g_TileClasses.rock, 2, | |||||
g_TileClasses.water, 2 | |||||
], | |||||
"stay": [ | |||||
g_TileClasses.wedge, 1 | |||||
], | |||||
"sizes": ["normal"], | |||||
"mixes": g_AllMixes, | |||||
"amounts": ["normal"] | |||||
} | |||||
])); | |||||
Engine.SetProgress(60); | |||||
// create a 2d array of all gaia | |||||
var gaiaEntities = [...Array(mapSize)].map(e => Array(mapSize)); | |||||
for (let i = 0; i < g_Map.entities.length; ++i) | |||||
{ | |||||
var ent = g_Map.entities[i]; | |||||
if (ent.player != 0) | |||||
continue; | |||||
gaiaEntities[Math.floor(ent.position.x)][Math.floor(ent.position.z)] = ent; | |||||
} | |||||
// Cycle through each tile | |||||
for (let x = 0; x < mapSize; ++x) | |||||
{ | |||||
for (let y = 0; y < mapSize; ++y) | |||||
{ | |||||
var point = new Vector2D(x, y); | |||||
if(g_Map.validHeight(point)) | |||||
{ | |||||
// Find the angle in radians from the current point to the center of the map | |||||
let radians = Math.atan2(y - mapCenter.y, x - mapCenter.x); | |||||
// Check if we're outside of the reference wedge | |||||
if (radians < 0 || radians > playerRadians) | |||||
{ | |||||
// determine which direction we're replicating in | |||||
let flips = Math.floor(Math.abs(radians) / playerRadians); | |||||
var relRadians = playerRadians - Math.abs(radians) % playerRadians; | |||||
if (flips % 2 == 0) | |||||
relRadians = Math.abs(radians) % playerRadians; | |||||
// find the distance from the current tile to the center | |||||
let dist = Math.sqrt(Math.pow((mapCenter.x - x),2) + Math.pow((mapCenter.y - y),2)); | |||||
// match the distance to a similar angle in the reference wedge | |||||
let relX = Math.round(dist * Math.cos(relRadians)) + mapCenter.x; | |||||
lyv: Unnecessary when `te` is declared right here.
`!te` would be fine here and L350. `ent` would… | |||||
let relY = Math.round(dist * Math.sin(relRadians)) + mapCenter.y; | |||||
let relPoint = new Vector2D(relX, relY); | |||||
// copy the contents of the reference tile to the ne tile | |||||
if(g_Map.validTile(relPoint) && g_Map.validTilePassable(relPoint) && g_Map.validTile(point) && g_Map.validTilePassable(point)) | |||||
{ | |||||
// set the height, texture, terrain entities and gaia entities based on the reference point | |||||
g_Map.setHeight(point, g_Map.getHeight(relPoint)); | |||||
g_Map.setTexture(point, g_Map.getTexture(relPoint)); | |||||
var te = g_Map.getTerrainEntity(relPoint); | |||||
if (typeof te !== "undefined") | |||||
g_Map.setTerrainEntity(te.templateName, te.player, point, te.rotation); | |||||
var ent = gaiaEntities[relX][relY]; | |||||
if (ent === undefined) | |||||
continue; | |||||
g_Map.placeEntityAnywhere(ent.templateName, ent.player, point, ent.rotation); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
Done Inline ActionsForgot to remove debug code? Imarok: Forgot to remove debug code? | |||||
Done Inline ActionsYes! How do I fix it? Do I have to upload a new diff with all of the original changes minus these comments? Or is there a way to create a 2nd diff on top of this 1st one? kalimaps: Yes! How do I fix it? Do I have to upload a new diff with all of the original changes minus… | |||||
Done Inline ActionsOn the top right of this page you have an update diff button :) Stan: On the top right of this page you have an update diff button :)
| |||||
Done Inline ActionsAwesome, thanks! kalimaps: Awesome, thanks! | |||||
Done Inline ActionsYou can also mark comments as done so you can hide them later on :) Stan: You can also mark comments as done so you can hide them later on :) | |||||
Engine.SetProgress(90); | |||||
// add back the bases | |||||
if (!isNomad()) | |||||
{ | |||||
createBasesByPattern( | |||||
pattern, | |||||
distance, | |||||
groupedDistance, | |||||
g_Map.startAngle); | |||||
} | |||||
// place Nomad players | |||||
placePlayersNomad( | |||||
g_TileClasses.player, | |||||
avoidClasses( | |||||
g_TileClasses.bluff, 4, | |||||
g_TileClasses.water, 4, | |||||
g_TileClasses.forest, 1, | |||||
g_TileClasses.metal, 4, | |||||
g_TileClasses.rock, 4, | |||||
g_TileClasses.mountain, 4, | |||||
g_TileClasses.plateau, 4, | |||||
g_TileClasses.animals, 2)); | |||||
g_Map.ExportMap(); | |||||
No newline at end of file | |||||
StanUnsubmitted Not Done Inline ActionsAlways add a blank newline at the end of files. It's expected by most linux editors. You can configure yours to add it :) Stan: Always add a blank newline at the end of files. It's expected by most linux editors. You can… |
Wildfire Games · Phabricator
Unnecessary when te is declared right here.
!te would be fine here and L350. ent would not have any other falsy value.