Include some new random maps by kali! Style updates by elexis and map previews by niektb.
Refs #3455 This was SVN commit r17903.
This commit is contained in:
parent
94f9100ba1
commit
6d52a71d4a
BIN
binaries/data/mods/public/art/textures/ui/session/icons/mappreview/ambush.png
(Stored with Git LFS)
Normal file
BIN
binaries/data/mods/public/art/textures/ui/session/icons/mappreview/ambush.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
binaries/data/mods/public/art/textures/ui/session/icons/mappreview/empire.png
(Stored with Git LFS)
Normal file
BIN
binaries/data/mods/public/art/textures/ui/session/icons/mappreview/empire.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
binaries/data/mods/public/art/textures/ui/session/icons/mappreview/frontier.png
(Stored with Git LFS)
Normal file
BIN
binaries/data/mods/public/art/textures/ui/session/icons/mappreview/frontier.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
binaries/data/mods/public/art/textures/ui/session/icons/mappreview/hells_pass.png
(Stored with Git LFS)
Normal file
BIN
binaries/data/mods/public/art/textures/ui/session/icons/mappreview/hells_pass.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
binaries/data/mods/public/art/textures/ui/session/icons/mappreview/lions_den.png
(Stored with Git LFS)
Normal file
BIN
binaries/data/mods/public/art/textures/ui/session/icons/mappreview/lions_den.png
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
binaries/data/mods/public/art/textures/ui/session/icons/mappreview/stronghold.png
(Stored with Git LFS)
Normal file
BIN
binaries/data/mods/public/art/textures/ui/session/icons/mappreview/stronghold.png
(Stored with Git LFS)
Normal file
Binary file not shown.
172
binaries/data/mods/public/maps/random/ambush.js
Normal file
172
binaries/data/mods/public/maps/random/ambush.js
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
RMS.LoadLibrary("rmgen");
|
||||||
|
|
||||||
|
InitMap();
|
||||||
|
|
||||||
|
randomizeBiome();
|
||||||
|
initMapSettings();
|
||||||
|
initTileClasses();
|
||||||
|
|
||||||
|
resetTerrain(g_Terrains.mainTerrain, g_TileClasses.land, 2);
|
||||||
|
RMS.SetProgress(10);
|
||||||
|
|
||||||
|
var pos = randomStartingPositionPattern();
|
||||||
|
addBases(pos.setup, pos.distance, pos.separation);
|
||||||
|
RMS.SetProgress(20);
|
||||||
|
|
||||||
|
addElements([
|
||||||
|
{
|
||||||
|
"func": addBluffs,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 12,
|
||||||
|
g_TileClasses.hill, 5,
|
||||||
|
g_TileClasses.player, 35
|
||||||
|
],
|
||||||
|
"sizes": ["normal", "big", "huge"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": ["tons"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addHills,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.hill, 15,
|
||||||
|
g_TileClasses.player, 20
|
||||||
|
],
|
||||||
|
"sizes": ["normal", "big"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["tons"]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
RMS.SetProgress(30);
|
||||||
|
|
||||||
|
addElements([
|
||||||
|
{
|
||||||
|
"func": addLayeredPatches,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 2,
|
||||||
|
g_TileClasses.dirt, 5,
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.player, 12,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addDecoration,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 2,
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.player, 12,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
RMS.SetProgress(50);
|
||||||
|
|
||||||
|
addElements(shuffleArray([
|
||||||
|
{
|
||||||
|
"func": addMetal,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.forest, 3,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.player, 30,
|
||||||
|
g_TileClasses.rock, 10,
|
||||||
|
g_TileClasses.metal, 20,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.bluff, 5],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": ["tons"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addStone,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.forest, 3,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.player, 30,
|
||||||
|
g_TileClasses.rock, 20,
|
||||||
|
g_TileClasses.metal, 10,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.bluff, 5],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": ["tons"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addForests,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.metal, 3,
|
||||||
|
g_TileClasses.mountain, 5,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 3,
|
||||||
|
g_TileClasses.water, 2
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.bluff, 5],
|
||||||
|
"sizes": ["big", "huge"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["tons"]
|
||||||
|
}
|
||||||
|
]));
|
||||||
|
RMS.SetProgress(70);
|
||||||
|
|
||||||
|
addElements(shuffleArray([
|
||||||
|
{
|
||||||
|
"func": addBerries,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 5, g_TileClasses.forest, 5,
|
||||||
|
g_TileClasses.metal, 10,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 10,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["tiny"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": ["scarce"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addAnimals,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.metal, 2,
|
||||||
|
g_TileClasses.mountain, 1,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 2,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["tiny"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": ["scarce"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addStragglerTrees,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 7,
|
||||||
|
g_TileClasses.metal, 2,
|
||||||
|
g_TileClasses.mountain, 1,
|
||||||
|
g_TileClasses.player, 12,
|
||||||
|
g_TileClasses.rock, 2,
|
||||||
|
g_TileClasses.water, 5
|
||||||
|
],
|
||||||
|
"sizes": ["tiny"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": ["many"]
|
||||||
|
}
|
||||||
|
]));
|
||||||
|
RMS.SetProgress(90);
|
||||||
|
|
||||||
|
ExportMap();
|
11
binaries/data/mods/public/maps/random/ambush.json
Normal file
11
binaries/data/mods/public/maps/random/ambush.json
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"settings" : {
|
||||||
|
"Name" : "Ambush",
|
||||||
|
"Script" : "ambush.js",
|
||||||
|
"Description" : "High bluffs overlook the terrain below. Bountiful resources await on the cliffs, but beware of enemies planning an ambush.",
|
||||||
|
"BaseTerrain" : ["medit_sea_depths"],
|
||||||
|
"BaseHeight" : 2,
|
||||||
|
"Preview" : "ambush.png",
|
||||||
|
"CircularMap" : true
|
||||||
|
}
|
||||||
|
}
|
217
binaries/data/mods/public/maps/random/empire.js
Normal file
217
binaries/data/mods/public/maps/random/empire.js
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
RMS.LoadLibrary("rmgen");
|
||||||
|
InitMap();
|
||||||
|
|
||||||
|
randomizeBiome();
|
||||||
|
initMapSettings();
|
||||||
|
initTileClasses();
|
||||||
|
|
||||||
|
resetTerrain(g_Terrains.mainTerrain, g_TileClasses.land, randInt(5));
|
||||||
|
RMS.SetProgress(10);
|
||||||
|
|
||||||
|
addBases("stronghold", 0.37, 0.04);
|
||||||
|
RMS.SetProgress(20);
|
||||||
|
|
||||||
|
// Change the starting angle and add the players again
|
||||||
|
var rotation = PI;
|
||||||
|
|
||||||
|
if (g_MapInfo.teams.length == 2)
|
||||||
|
rotation = PI / 2;
|
||||||
|
|
||||||
|
if (g_MapInfo.teams.length == 4)
|
||||||
|
rotation = PI + PI / 4;
|
||||||
|
|
||||||
|
g_MapInfo.startAngle = g_MapInfo.startAngle + rotation;
|
||||||
|
|
||||||
|
addBases("stronghold", 0.15, 0.04);
|
||||||
|
RMS.SetProgress(40);
|
||||||
|
|
||||||
|
addElements(shuffleArray([
|
||||||
|
{
|
||||||
|
"func": addHills,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.hill, 15,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 5,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.valley, 2,
|
||||||
|
g_TileClasses.water, 2
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": ["tons"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addMountains,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 20,
|
||||||
|
g_TileClasses.mountain, 25,
|
||||||
|
g_TileClasses.plateau, 20,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.valley, 10,
|
||||||
|
g_TileClasses.water, 15
|
||||||
|
],
|
||||||
|
"sizes": ["huge"],
|
||||||
|
"mixes": ["same", "similar"],
|
||||||
|
"amounts": ["tons"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addPlateaus,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 20,
|
||||||
|
g_TileClasses.mountain, 25,
|
||||||
|
g_TileClasses.plateau, 20,
|
||||||
|
g_TileClasses.player, 40,
|
||||||
|
g_TileClasses.valley, 10,
|
||||||
|
g_TileClasses.water, 15
|
||||||
|
],
|
||||||
|
"sizes": ["huge"],
|
||||||
|
"mixes": ["same", "similar"],
|
||||||
|
"amounts": ["tons"]
|
||||||
|
}
|
||||||
|
]));
|
||||||
|
RMS.SetProgress(50);
|
||||||
|
|
||||||
|
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, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addDecoration,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 2,
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 12,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
RMS.SetProgress(60);
|
||||||
|
|
||||||
|
addElements(shuffleArray([
|
||||||
|
{
|
||||||
|
"func": addMetal,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 3,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.player, 30,
|
||||||
|
g_TileClasses.rock, 10,
|
||||||
|
g_TileClasses.metal, 20,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addStone,
|
||||||
|
"avoid": [g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 3,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.player, 30,
|
||||||
|
g_TileClasses.rock, 20,
|
||||||
|
g_TileClasses.metal, 10,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addForests,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 18,
|
||||||
|
g_TileClasses.metal, 3,
|
||||||
|
g_TileClasses.mountain, 5,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 3,
|
||||||
|
g_TileClasses.water, 2
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": ["few", "normal", "many", "tons"]
|
||||||
|
}
|
||||||
|
]));
|
||||||
|
RMS.SetProgress(80);
|
||||||
|
|
||||||
|
addElements(shuffleArray([
|
||||||
|
{
|
||||||
|
"func": addBerries,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 30,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 5,
|
||||||
|
g_TileClasses.metal, 10,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 10,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addAnimals,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.animals, 20,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.metal, 2,
|
||||||
|
g_TileClasses.mountain, 1,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 2,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addStragglerTrees,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 7,
|
||||||
|
g_TileClasses.metal, 2,
|
||||||
|
g_TileClasses.mountain, 1,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 12,
|
||||||
|
g_TileClasses.rock, 2,
|
||||||
|
g_TileClasses.water, 5
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
}
|
||||||
|
]));
|
||||||
|
RMS.SetProgress(90);
|
||||||
|
|
||||||
|
ExportMap();
|
12
binaries/data/mods/public/maps/random/empire.json
Normal file
12
binaries/data/mods/public/maps/random/empire.json
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"settings" : {
|
||||||
|
"Name" : "Empire",
|
||||||
|
"Script" : "empire.js",
|
||||||
|
"Description" : "A neighboring province has pledged alegiance to your rule. It's up to you to command them to victory.",
|
||||||
|
"BaseTerrain" : ["medit_sea_depths"],
|
||||||
|
"BaseHeight" : 2,
|
||||||
|
"Keywords": ["demo"],
|
||||||
|
"Preview" : "empire.png",
|
||||||
|
"CircularMap" : true
|
||||||
|
}
|
||||||
|
}
|
267
binaries/data/mods/public/maps/random/frontier.js
Normal file
267
binaries/data/mods/public/maps/random/frontier.js
Normal file
@ -0,0 +1,267 @@
|
|||||||
|
RMS.LoadLibrary("rmgen");
|
||||||
|
InitMap();
|
||||||
|
|
||||||
|
randomizeBiome();
|
||||||
|
initMapSettings();
|
||||||
|
initTileClasses();
|
||||||
|
|
||||||
|
RMS.SetProgress(10);
|
||||||
|
|
||||||
|
// Pick a random elevation with a bias towards lower elevations
|
||||||
|
var randElevation = randInt(30);
|
||||||
|
if (randElevation < 25)
|
||||||
|
randElevation = 1 + randInt(4);
|
||||||
|
|
||||||
|
resetTerrain(g_Terrains.mainTerrain, g_TileClasses.land, randElevation);
|
||||||
|
RMS.SetProgress(20);
|
||||||
|
|
||||||
|
var pos = randomStartingPositionPattern();
|
||||||
|
addBases(pos.setup, pos.distance, pos.separation);
|
||||||
|
RMS.SetProgress(40);
|
||||||
|
|
||||||
|
var features = [
|
||||||
|
{
|
||||||
|
"func": addBluffs,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 20,
|
||||||
|
g_TileClasses.hill, 10,
|
||||||
|
g_TileClasses.mountain, 20,
|
||||||
|
g_TileClasses.plateau, 15,
|
||||||
|
g_TileClasses.player, 30,
|
||||||
|
g_TileClasses.valley, 5,
|
||||||
|
g_TileClasses.water, 7
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addMountains,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 20,
|
||||||
|
g_TileClasses.mountain, 25,
|
||||||
|
g_TileClasses.plateau, 15,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.valley, 10,
|
||||||
|
g_TileClasses.water, 15
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addPlateaus,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 20,
|
||||||
|
g_TileClasses.mountain, 25,
|
||||||
|
g_TileClasses.plateau, 25,
|
||||||
|
g_TileClasses.plateau, 25,
|
||||||
|
g_TileClasses.player, 40,
|
||||||
|
g_TileClasses.valley, 10,
|
||||||
|
g_TileClasses.water, 15
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
if (randElevation < 4)
|
||||||
|
features = features.push(
|
||||||
|
{
|
||||||
|
"func": addLakes,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 7,
|
||||||
|
g_TileClasses.hill, 2,
|
||||||
|
g_TileClasses.mountain, 15,
|
||||||
|
g_TileClasses.plateau, 10,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.valley, 10,
|
||||||
|
g_TileClasses.water, 25
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (randElevation > 20)
|
||||||
|
features = features.push(
|
||||||
|
{
|
||||||
|
"func": addValleys,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.hill, 5,
|
||||||
|
g_TileClasses.mountain, 25,
|
||||||
|
g_TileClasses.plateau, 20,
|
||||||
|
g_TileClasses.player, 40,
|
||||||
|
g_TileClasses.valley, 15,
|
||||||
|
g_TileClasses.water, 10
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
addElements(shuffleArray(features));
|
||||||
|
RMS.SetProgress(50);
|
||||||
|
|
||||||
|
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, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addDecoration,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 2,
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 12,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
RMS.SetProgress(60);
|
||||||
|
|
||||||
|
addElements(shuffleArray([
|
||||||
|
{
|
||||||
|
"func": addMetal,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 3,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 30,
|
||||||
|
g_TileClasses.rock, 10,
|
||||||
|
g_TileClasses.metal, 20,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addStone,
|
||||||
|
"avoid": [g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 3,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 30,
|
||||||
|
g_TileClasses.rock, 20,
|
||||||
|
g_TileClasses.metal, 10,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addForests,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 18,
|
||||||
|
g_TileClasses.metal, 3,
|
||||||
|
g_TileClasses.mountain, 5,
|
||||||
|
g_TileClasses.plateau, 5,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 3,
|
||||||
|
g_TileClasses.water, 2
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": ["few", "normal", "many", "tons"]
|
||||||
|
}
|
||||||
|
]));
|
||||||
|
RMS.SetProgress(70);
|
||||||
|
|
||||||
|
addElements(shuffleArray([
|
||||||
|
{
|
||||||
|
"func": addBerries,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 30,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 5,
|
||||||
|
g_TileClasses.metal, 10,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 10,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addAnimals,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.animals, 20,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.metal, 2,
|
||||||
|
g_TileClasses.mountain, 1,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 2,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addStragglerTrees,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 7,
|
||||||
|
g_TileClasses.metal, 2,
|
||||||
|
g_TileClasses.mountain, 1,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 12,
|
||||||
|
g_TileClasses.rock, 2,
|
||||||
|
g_TileClasses.water, 5
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
}
|
||||||
|
]));
|
||||||
|
RMS.SetProgress(90);
|
||||||
|
|
||||||
|
ExportMap();
|
11
binaries/data/mods/public/maps/random/frontier.json
Normal file
11
binaries/data/mods/public/maps/random/frontier.json
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"settings" : {
|
||||||
|
"Name" : "Frontier",
|
||||||
|
"Script" : "frontier.js",
|
||||||
|
"Description" : "A wild, unknown landscape awaits rival explorers.",
|
||||||
|
"BaseTerrain" : ["medit_sea_depths"],
|
||||||
|
"Preview" : "frontier.png",
|
||||||
|
"BaseHeight" : 2,
|
||||||
|
"CircularMap" : true
|
||||||
|
}
|
||||||
|
}
|
303
binaries/data/mods/public/maps/random/hells_pass.js
Normal file
303
binaries/data/mods/public/maps/random/hells_pass.js
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
RMS.LoadLibrary("rmgen");
|
||||||
|
InitMap();
|
||||||
|
|
||||||
|
randomizeBiome();
|
||||||
|
initMapSettings();
|
||||||
|
initTileClasses();
|
||||||
|
|
||||||
|
resetTerrain(g_Terrains.mainTerrain, g_TileClasses.land, 1);
|
||||||
|
RMS.SetProgress(10);
|
||||||
|
|
||||||
|
addBases("line", 0.2, 0.08);
|
||||||
|
RMS.SetProgress(20);
|
||||||
|
|
||||||
|
placeBarriers();
|
||||||
|
RMS.SetProgress(40);
|
||||||
|
|
||||||
|
addElements(shuffleArray([
|
||||||
|
{
|
||||||
|
"func": addBluffs,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 20,
|
||||||
|
g_TileClasses.hill, 5,
|
||||||
|
g_TileClasses.mountain, 20,
|
||||||
|
g_TileClasses.plateau, 20,
|
||||||
|
g_TileClasses.player, 30,
|
||||||
|
g_TileClasses.spine, 15,
|
||||||
|
g_TileClasses.valley, 5,
|
||||||
|
g_TileClasses.water, 7
|
||||||
|
],
|
||||||
|
"sizes": ["normal", "big"],
|
||||||
|
"mixes": ["varied"],
|
||||||
|
"amounts": ["few"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addHills,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.hill, 15,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 5,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.spine, 15,
|
||||||
|
g_TileClasses.valley, 2,
|
||||||
|
g_TileClasses.water, 2
|
||||||
|
],
|
||||||
|
"sizes": ["normal", "big"],
|
||||||
|
"mixes": ["varied"],
|
||||||
|
"amounts": ["few"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addLakes,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 7,
|
||||||
|
g_TileClasses.hill, 2,
|
||||||
|
g_TileClasses.mountain, 15,
|
||||||
|
g_TileClasses.plateau, 10,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.spine, 15,
|
||||||
|
g_TileClasses.valley, 10,
|
||||||
|
g_TileClasses.water, 25
|
||||||
|
],
|
||||||
|
"sizes": ["big", "huge"],
|
||||||
|
"mixes": ["varied", "unique"],
|
||||||
|
"amounts": ["few"]
|
||||||
|
}
|
||||||
|
]));
|
||||||
|
RMS.SetProgress(50);
|
||||||
|
|
||||||
|
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.spine, 5,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addDecoration,
|
||||||
|
"avoid": [g_TileClasses.bluff, 2,
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 12,
|
||||||
|
g_TileClasses.spine, 5,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
RMS.SetProgress(60);
|
||||||
|
|
||||||
|
addElements(shuffleArray([
|
||||||
|
{
|
||||||
|
"func": addMetal,
|
||||||
|
"avoid": [g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 3,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 30,
|
||||||
|
g_TileClasses.rock, 10,
|
||||||
|
g_TileClasses.metal, 20,
|
||||||
|
g_TileClasses.spine, 5,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addStone,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 3,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 30,
|
||||||
|
g_TileClasses.rock, 20,
|
||||||
|
g_TileClasses.metal, 10,
|
||||||
|
g_TileClasses.spine, 5,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addForests,
|
||||||
|
"avoid": [g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 18,
|
||||||
|
g_TileClasses.metal, 3,
|
||||||
|
g_TileClasses.mountain, 5,
|
||||||
|
g_TileClasses.plateau, 5,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 3,
|
||||||
|
g_TileClasses.spine, 5,
|
||||||
|
g_TileClasses.water, 2
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": ["few", "normal", "many", "tons"]
|
||||||
|
}
|
||||||
|
]));
|
||||||
|
RMS.SetProgress(80);
|
||||||
|
|
||||||
|
addElements(shuffleArray([
|
||||||
|
{
|
||||||
|
"func": addBerries,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 30,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 5,
|
||||||
|
g_TileClasses.metal, 10,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 10,
|
||||||
|
g_TileClasses.spine, 2,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addAnimals,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.animals, 20,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.metal, 2,
|
||||||
|
g_TileClasses.mountain, 1,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 2,
|
||||||
|
g_TileClasses.spine, 2,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addStragglerTrees,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 7,
|
||||||
|
g_TileClasses.metal, 2,
|
||||||
|
g_TileClasses.mountain, 1,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 12,
|
||||||
|
g_TileClasses.rock, 2,
|
||||||
|
g_TileClasses.spine, 2,
|
||||||
|
g_TileClasses.water, 5
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
}
|
||||||
|
]));
|
||||||
|
RMS.SetProgress(90);
|
||||||
|
|
||||||
|
ExportMap();
|
||||||
|
|
||||||
|
// place the mountainous barriers between the teams
|
||||||
|
function placeBarriers()
|
||||||
|
{
|
||||||
|
var spineTerrain = g_Terrains.dirt;
|
||||||
|
|
||||||
|
if (g_MapInfo.biome == 2)
|
||||||
|
spineTerrain = g_Terrains.tier1Terrain;
|
||||||
|
|
||||||
|
if (g_MapInfo.biome == 4 || g_MapInfo.biome == 6)
|
||||||
|
spineTerrain = g_Terrains.tier2Terrain;
|
||||||
|
|
||||||
|
if (g_MapInfo.biome == 8)
|
||||||
|
spineTerrain = g_Terrains.tier4Terrain;
|
||||||
|
|
||||||
|
// create mountain ranges
|
||||||
|
for (var i = 0; i < g_MapInfo.teams.length; ++i)
|
||||||
|
{
|
||||||
|
var tang = g_MapInfo.startAngle + (i + 0.5) * TWO_PI / g_MapInfo.teams.length;
|
||||||
|
|
||||||
|
var fx = fractionToTiles(0.5);
|
||||||
|
var fz = fractionToTiles(0.5);
|
||||||
|
var ix = round(fx);
|
||||||
|
var iz = round(fz);
|
||||||
|
|
||||||
|
var mStartCo = 0.07;
|
||||||
|
var mStopCo = 0.42;
|
||||||
|
var mSize = 8;
|
||||||
|
var mWaviness = 0.6;
|
||||||
|
var mOffset = 0.5;
|
||||||
|
var mTaper = -1.5;
|
||||||
|
|
||||||
|
if (g_MapInfo.teams.length > 3 || g_MapInfo.mapSize <= 192)
|
||||||
|
{
|
||||||
|
mWaviness = 0.2;
|
||||||
|
mOffset = 0.2;
|
||||||
|
mTaper = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_MapInfo.teams.length >= 5)
|
||||||
|
{
|
||||||
|
mSize = 4;
|
||||||
|
mWaviness = 0.2;
|
||||||
|
mOffset = 0.2;
|
||||||
|
mTaper = -0.7;
|
||||||
|
}
|
||||||
|
|
||||||
|
// place barrier
|
||||||
|
var placer = new PathPlacer(fractionToTiles(0.5 + mStartCo * cos(tang)), fractionToTiles(0.5 + mStartCo * sin(tang)), fractionToTiles(0.5 + mStopCo * cos(tang)), fractionToTiles(0.5 + mStopCo * sin(tang)), scaleByMapSize(14, mSize), mWaviness, 0.1, mOffset, mTaper);
|
||||||
|
var terrainPainter = new LayeredPainter([g_Terrains.cliff, spineTerrain], [2]);
|
||||||
|
var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 30, 2);
|
||||||
|
createArea(placer, [terrainPainter, elevationPainter, paintClass(g_TileClasses.spine)], avoidClasses(g_TileClasses.player, 5, g_TileClasses.baseResource, 5));
|
||||||
|
}
|
||||||
|
|
||||||
|
addElements([
|
||||||
|
{
|
||||||
|
"func": addDecoration,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 2,
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.player, 12,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.spine, 5],
|
||||||
|
"sizes": ["huge"],
|
||||||
|
"mixes": ["unique"],
|
||||||
|
"amounts": ["tons"]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
|
addElements([
|
||||||
|
{
|
||||||
|
"func": addProps,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.player, 2,
|
||||||
|
g_TileClasses.prop, 20,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.spine, 8],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["scarce"]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
}
|
11
binaries/data/mods/public/maps/random/hells_pass.json
Normal file
11
binaries/data/mods/public/maps/random/hells_pass.json
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"settings" : {
|
||||||
|
"Name" : "Hell's Pass",
|
||||||
|
"Script" : "hells_pass.js",
|
||||||
|
"Description" : "A narrow pass between steep mountains promotes tight, defensive combat. With bountiful resources far from the front lines, teams may choose to support their exposed teammates financially, or retreat to more fertile, but less defensible ground.",
|
||||||
|
"BaseTerrain" : ["medit_sea_depths"],
|
||||||
|
"BaseHeight" : 1,
|
||||||
|
"Preview" : "hells_pass.png",
|
||||||
|
"CircularMap" : true
|
||||||
|
}
|
||||||
|
}
|
501
binaries/data/mods/public/maps/random/lions_den.js
Normal file
501
binaries/data/mods/public/maps/random/lions_den.js
Normal file
@ -0,0 +1,501 @@
|
|||||||
|
RMS.LoadLibrary("rmgen");
|
||||||
|
InitMap();
|
||||||
|
|
||||||
|
randomizeBiome();
|
||||||
|
initMapSettings();
|
||||||
|
initTileClasses(["step"]);
|
||||||
|
|
||||||
|
var topTerrain = g_Terrains.tier2Terrain;
|
||||||
|
|
||||||
|
resetTerrain(topTerrain, g_TileClasses.land, 50);
|
||||||
|
RMS.SetProgress(10);
|
||||||
|
|
||||||
|
var players = addBases("radial", 0.4, randFloat(0.05, 0.1));
|
||||||
|
RMS.SetProgress(20);
|
||||||
|
|
||||||
|
createSunkenTerrain(players);
|
||||||
|
RMS.SetProgress(30);
|
||||||
|
|
||||||
|
addElements([
|
||||||
|
{
|
||||||
|
"func": addLayeredPatches,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.dirt, 5,
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.player, 12,
|
||||||
|
g_TileClasses.step, 5
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.valley, 7],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addLayeredPatches,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.dirt, 5,
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.player, 12
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.settlement, 7],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addLayeredPatches,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.dirt, 5,
|
||||||
|
g_TileClasses.forest, 2
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.player, 1],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addDecoration,
|
||||||
|
"avoid": [g_TileClasses.forest, 2],
|
||||||
|
"stay": [g_TileClasses.player, 1],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addDecoration,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.player, 12,
|
||||||
|
g_TileClasses.step, 2
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.valley, 7],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addDecoration,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.player, 12
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.settlement, 7],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addDecoration,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.player, 12
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.step, 7],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["scarce"]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
RMS.SetProgress(40);
|
||||||
|
|
||||||
|
addElements(shuffleArray([
|
||||||
|
{
|
||||||
|
"func": addMetal,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.forest, 3,
|
||||||
|
g_TileClasses.player, 30,
|
||||||
|
g_TileClasses.rock, 10,
|
||||||
|
g_TileClasses.metal, 20
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.settlement, 7],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": ["tons"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addMetal,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.forest, 3,
|
||||||
|
g_TileClasses.player, 10,
|
||||||
|
g_TileClasses.rock, 10,
|
||||||
|
g_TileClasses.metal, 20,
|
||||||
|
g_TileClasses.mountain, 5,
|
||||||
|
g_TileClasses.step, 5
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.valley, 7],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addStone,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.forest, 3,
|
||||||
|
g_TileClasses.player, 30,
|
||||||
|
g_TileClasses.rock, 20,
|
||||||
|
g_TileClasses.metal, 10
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.settlement, 7],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": ["tons"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addStone,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.forest, 3,
|
||||||
|
g_TileClasses.player, 10,
|
||||||
|
g_TileClasses.rock, 20,
|
||||||
|
g_TileClasses.metal, 10,
|
||||||
|
g_TileClasses.mountain, 5,
|
||||||
|
g_TileClasses.step, 5
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.valley, 7],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addForests,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.forest, 18,
|
||||||
|
g_TileClasses.metal, 3,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 3
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.settlement, 7],
|
||||||
|
"sizes": ["normal", "big"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": ["tons"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addForests,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 3,
|
||||||
|
g_TileClasses.forest, 18,
|
||||||
|
g_TileClasses.metal, 3,
|
||||||
|
g_TileClasses.mountain, 5,
|
||||||
|
g_TileClasses.player, 5,
|
||||||
|
g_TileClasses.rock, 3,
|
||||||
|
g_TileClasses.step, 1
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.valley, 7],
|
||||||
|
"sizes": ["normal", "big"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": ["tons"]
|
||||||
|
}
|
||||||
|
]));
|
||||||
|
RMS.SetProgress(60);
|
||||||
|
|
||||||
|
addElements(shuffleArray([
|
||||||
|
{
|
||||||
|
"func": addBerries,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 30,
|
||||||
|
g_TileClasses.forest, 5,
|
||||||
|
g_TileClasses.metal, 10,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 10
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.settlement, 7],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": ["tons"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addBerries,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 30,
|
||||||
|
g_TileClasses.forest, 5,
|
||||||
|
g_TileClasses.metal, 10,
|
||||||
|
g_TileClasses.mountain, 5,
|
||||||
|
g_TileClasses.player, 10,
|
||||||
|
g_TileClasses.rock, 10,
|
||||||
|
g_TileClasses.step, 5
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.valley, 7],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addAnimals,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.animals, 20,
|
||||||
|
g_TileClasses.forest, 0,
|
||||||
|
g_TileClasses.metal, 1,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 1
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.settlement, 7],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": ["tons"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addAnimals,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.animals, 20,
|
||||||
|
g_TileClasses.forest, 0,
|
||||||
|
g_TileClasses.metal, 1,
|
||||||
|
g_TileClasses.mountain, 5,
|
||||||
|
g_TileClasses.player, 10,
|
||||||
|
g_TileClasses.rock, 1,
|
||||||
|
g_TileClasses.step, 5
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.valley, 7],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addStragglerTrees,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.forest, 7,
|
||||||
|
g_TileClasses.metal, 3,
|
||||||
|
g_TileClasses.player, 12,
|
||||||
|
g_TileClasses.rock, 3
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.settlement, 7],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": ["tons"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addStragglerTrees,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.forest, 7,
|
||||||
|
g_TileClasses.metal, 3,
|
||||||
|
g_TileClasses.mountain, 5,
|
||||||
|
g_TileClasses.player, 10,
|
||||||
|
g_TileClasses.rock, 3,
|
||||||
|
g_TileClasses.step, 5
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.valley, 7],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": ["normal", "many", "tons"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addStragglerTrees,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.forest, 3,
|
||||||
|
g_TileClasses.metal, 5,
|
||||||
|
g_TileClasses.rock, 5
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.player, 1],
|
||||||
|
"sizes": ["huge"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": ["tons"]
|
||||||
|
}
|
||||||
|
]));
|
||||||
|
RMS.SetProgress(75);
|
||||||
|
|
||||||
|
addElements([
|
||||||
|
{
|
||||||
|
"func": addDecoration,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.valley, 4,
|
||||||
|
g_TileClasses.player, 4,
|
||||||
|
g_TileClasses.settlement, 4,
|
||||||
|
g_TileClasses.step, 4
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.land, 2],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["tons"]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
RMS.SetProgress(80);
|
||||||
|
|
||||||
|
addElements([
|
||||||
|
{
|
||||||
|
"func": addProps,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.valley, 4,
|
||||||
|
g_TileClasses.player, 4,
|
||||||
|
g_TileClasses.settlement, 4,
|
||||||
|
g_TileClasses.step, 4
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.land, 2],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["scarce"]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
RMS.SetProgress(85);
|
||||||
|
|
||||||
|
addElements([
|
||||||
|
{
|
||||||
|
"func": addDecoration,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.player, 4,
|
||||||
|
g_TileClasses.settlement, 4,
|
||||||
|
g_TileClasses.step, 4
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.mountain, 2],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["tons"]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
RMS.SetProgress(90);
|
||||||
|
|
||||||
|
addElements([
|
||||||
|
{
|
||||||
|
"func": addProps,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.player, 4,
|
||||||
|
g_TileClasses.settlement, 4,
|
||||||
|
g_TileClasses.step, 4
|
||||||
|
],
|
||||||
|
"stay": [g_TileClasses.mountain, 2],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["scarce"]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
RMS.SetProgress(95);
|
||||||
|
|
||||||
|
ExportMap();
|
||||||
|
|
||||||
|
// Create the sunken terrain
|
||||||
|
function createSunkenTerrain(players)
|
||||||
|
{
|
||||||
|
var base = g_Terrains.mainTerrain;
|
||||||
|
var middle = g_Terrains.dirt;
|
||||||
|
var lower = g_Terrains.tier2Terrain;
|
||||||
|
var road = g_Terrains.road;
|
||||||
|
|
||||||
|
if (g_MapInfo.biome == 2)
|
||||||
|
{
|
||||||
|
middle = g_Terrains.tier2Terrain;
|
||||||
|
lower = g_Terrains.tier1Terrain;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_MapInfo.biome == 4)
|
||||||
|
{
|
||||||
|
middle = g_Terrains.shore;
|
||||||
|
lower = g_Terrains.tier4Terrain;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_MapInfo.biome == 5)
|
||||||
|
{
|
||||||
|
middle = g_Terrains.tier1Terrain;
|
||||||
|
lower = g_Terrains.forestFloor1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_MapInfo.biome == 6)
|
||||||
|
{
|
||||||
|
middle = g_Terrains.tier2Terrain;
|
||||||
|
lower = g_Terrains.tier4Terrain;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_MapInfo.biome == 7 || g_MapInfo.biome == 8)
|
||||||
|
road = g_Terrains.roadWild;
|
||||||
|
|
||||||
|
if (g_MapInfo.biome == 8)
|
||||||
|
middle = g_Terrains.shore;
|
||||||
|
|
||||||
|
var expSize = g_MapInfo.mapArea * 0.015 / (g_MapInfo.numPlayers / 4);
|
||||||
|
var expDist = 0.1 + (g_MapInfo.numPlayers / 200);
|
||||||
|
if (g_MapInfo.numPlayers == 2)
|
||||||
|
expSize = g_MapInfo.mapArea * 0.015 / 0.7;
|
||||||
|
|
||||||
|
var nRoad = 0.44;
|
||||||
|
var nExp = 0.425;
|
||||||
|
|
||||||
|
if (g_MapInfo.numPlayers < 4)
|
||||||
|
{
|
||||||
|
nRoad = 0.42;
|
||||||
|
nExp = 0.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create central valley
|
||||||
|
var placer = new ClumpPlacer(g_MapInfo.mapArea * 0.26, 1, 1, 1, g_MapInfo.centerOfMap, g_MapInfo.centerOfMap);
|
||||||
|
var terrainPainter = new LayeredPainter([g_Terrains.cliff, lower], [3]);
|
||||||
|
var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 0, 3);
|
||||||
|
createArea(placer, [terrainPainter, elevationPainter, paintClass(g_TileClasses.valley)]);
|
||||||
|
|
||||||
|
// Create the center hill
|
||||||
|
var placer = new ClumpPlacer(g_MapInfo.mapArea * 0.14, 1, 1, 1, g_MapInfo.centerOfMap, g_MapInfo.centerOfMap);
|
||||||
|
var terrainPainter = new LayeredPainter([g_Terrains.cliff, topTerrain], [3]);
|
||||||
|
var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, g_MapInfo.mapHeight, 3);
|
||||||
|
createArea(placer, [terrainPainter, elevationPainter, paintClass(g_TileClasses.mountain)]);
|
||||||
|
|
||||||
|
for(var i = 0; i < players.length; ++i)
|
||||||
|
{
|
||||||
|
var playerAngle = g_MapInfo.startAngle + i * TWO_PI / g_MapInfo.numPlayers;
|
||||||
|
var pX = round(fractionToTiles(0.5 + 0.4 * cos(playerAngle)));
|
||||||
|
var pZ = round(fractionToTiles(0.5 + 0.4 * sin(playerAngle)));
|
||||||
|
var expX = round(fractionToTiles(0.5 + expDist * cos(g_MapInfo.startAngle + (i + 0.75) * TWO_PI / g_MapInfo.numPlayers)));
|
||||||
|
var expZ = round(fractionToTiles(0.5 + expDist * sin(g_MapInfo.startAngle + (i + 0.75) * TWO_PI / g_MapInfo.numPlayers)));
|
||||||
|
var rearX = round(fractionToTiles(0.5 + 0.47 * cos(playerAngle)));
|
||||||
|
var rearZ = round(fractionToTiles(0.5 + 0.47 * sin(playerAngle)));
|
||||||
|
var prePlayerAngle = g_MapInfo.startAngle + (i - 0.5) * TWO_PI / g_MapInfo.numPlayers;
|
||||||
|
var preX = round(fractionToTiles(0.5 + nRoad * cos(prePlayerAngle)));
|
||||||
|
var preZ = round(fractionToTiles(0.5 + nRoad * sin(prePlayerAngle)));
|
||||||
|
var nextPlayerAngle = g_MapInfo.startAngle + (i + 0.5) * TWO_PI / g_MapInfo.numPlayers;
|
||||||
|
var nextX = round(fractionToTiles(0.5 + nRoad * cos(nextPlayerAngle)));
|
||||||
|
var nextZ = round(fractionToTiles(0.5 + nRoad * sin(nextPlayerAngle)));
|
||||||
|
|
||||||
|
// Create path to expansion
|
||||||
|
var placer = new PathPlacer(pX, pZ, expX, expZ, scaleByMapSize(12, 12), 0.7, 0.5, 0.1, -1);
|
||||||
|
var terrainPainter = new LayeredPainter([g_Terrains.cliff, middle, road], [3, 4]);
|
||||||
|
var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 10, 3);
|
||||||
|
createArea(placer, [terrainPainter, elevationPainter, paintClass(g_TileClasses.step)]);
|
||||||
|
|
||||||
|
// Create path to neighbor
|
||||||
|
var placer = new PathPlacer(rearX, rearZ, nextX, nextZ, scaleByMapSize(19, 19), 0.4, 0.5, 0.1, -0.6);
|
||||||
|
var terrainPainter = new LayeredPainter([g_Terrains.cliff, middle, road], [3, 6]);
|
||||||
|
var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 10, 3);
|
||||||
|
createArea(placer, [terrainPainter, elevationPainter, paintClass(g_TileClasses.step)]);
|
||||||
|
|
||||||
|
// Create path to neighbor
|
||||||
|
var placer = new PathPlacer(rearX, rearZ, preX, preZ, scaleByMapSize(19, 19), 0.4, 0.5, 0.1, -0.6);
|
||||||
|
var terrainPainter = new LayeredPainter([g_Terrains.cliff, middle, road], [3, 6]);
|
||||||
|
var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 10, 3);
|
||||||
|
createArea(placer, [terrainPainter, elevationPainter, paintClass(g_TileClasses.step)]);
|
||||||
|
|
||||||
|
// Create the den
|
||||||
|
var placer = new ClumpPlacer(g_MapInfo.mapArea * 0.03, 0.9, 0.3, 1, pX, pZ);
|
||||||
|
var terrainPainter = new LayeredPainter([g_Terrains.cliff, base], [3]);
|
||||||
|
var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 15, 3);
|
||||||
|
createArea(placer, [terrainPainter, elevationPainter, paintClass(g_TileClasses.valley)]);
|
||||||
|
|
||||||
|
// Create the expansion
|
||||||
|
var placer = new ClumpPlacer(expSize, 0.9, 0.3, 1, expX, expZ);
|
||||||
|
var terrainPainter = new LayeredPainter([g_Terrains.cliff, base], [3]);
|
||||||
|
var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 15, 3);
|
||||||
|
var area = createArea(placer, [terrainPainter, elevationPainter, paintClass(g_TileClasses.settlement)], [avoidClasses(g_TileClasses.settlement, 2)]);
|
||||||
|
var unpainter = new TileClassUnPainter(new TileClass(g_MapInfo.mapSize, g_TileClasses.mountain));
|
||||||
|
unpainter.paint(area);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the neighbor expansions
|
||||||
|
for (var i = 0; i < g_MapInfo.numPlayers; ++i)
|
||||||
|
{
|
||||||
|
var nextPlayerAngle = g_MapInfo.startAngle + (i + 0.5) * TWO_PI / g_MapInfo.numPlayers;
|
||||||
|
var nextX = round(fractionToTiles(0.5 + nExp * cos(nextPlayerAngle)));
|
||||||
|
var nextZ = round(fractionToTiles(0.5 + nExp * sin(nextPlayerAngle)));
|
||||||
|
|
||||||
|
// Create the neightbor expansion
|
||||||
|
var placer = new ClumpPlacer(expSize, 0.9, 0.3, 1, nextX, nextZ);
|
||||||
|
var terrainPainter = new LayeredPainter([g_Terrains.cliff, lower], [3]);
|
||||||
|
var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, 0, 3);
|
||||||
|
var area = createArea(placer, [terrainPainter, elevationPainter, paintClass(g_TileClasses.settlement)]);
|
||||||
|
}
|
||||||
|
}
|
12
binaries/data/mods/public/maps/random/lions_den.json
Normal file
12
binaries/data/mods/public/maps/random/lions_den.json
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"settings" : {
|
||||||
|
"Name" : "Lion's Den",
|
||||||
|
"Script" : "lions_den.js",
|
||||||
|
"Description" : "High cliffs protect each player's main base. Venturing into the unknown can be risky, but necessary.",
|
||||||
|
"BaseTerrain" : ["medit_sea_depths"],
|
||||||
|
"BaseHeight" : 50,
|
||||||
|
"Preview" : "lions_den.png",
|
||||||
|
"Keywords": ["demo"],
|
||||||
|
"CircularMap" : true
|
||||||
|
}
|
||||||
|
}
|
1295
binaries/data/mods/public/maps/random/rmgen/gaia.js
Normal file
1295
binaries/data/mods/public/maps/random/rmgen/gaia.js
Normal file
File diff suppressed because it is too large
Load Diff
627
binaries/data/mods/public/maps/random/rmgen/setup.js
Normal file
627
binaries/data/mods/public/maps/random/rmgen/setup.js
Normal file
@ -0,0 +1,627 @@
|
|||||||
|
const g_Amounts = {
|
||||||
|
"scarce": 0.2,
|
||||||
|
"few": 0.5,
|
||||||
|
"normal": 1,
|
||||||
|
"many": 1.75,
|
||||||
|
"tons": 3
|
||||||
|
};
|
||||||
|
|
||||||
|
const g_Mixes = {
|
||||||
|
"same": 0,
|
||||||
|
"similar": 0.1,
|
||||||
|
"normal": 0.25,
|
||||||
|
"varied": 0.5,
|
||||||
|
"unique": 0.75
|
||||||
|
};
|
||||||
|
|
||||||
|
const g_Sizes = {
|
||||||
|
"tiny": 0.5,
|
||||||
|
"small": 0.75,
|
||||||
|
"normal": 1,
|
||||||
|
"big": 1.25,
|
||||||
|
"huge": 1.5,
|
||||||
|
};
|
||||||
|
|
||||||
|
const g_AllAmounts = Object.keys(g_Amounts);
|
||||||
|
const g_AllMixes = Object.keys(g_Mixes);
|
||||||
|
const g_AllSizes = Object.keys(g_Sizes);
|
||||||
|
|
||||||
|
const g_DefaultTileClasses = [
|
||||||
|
"animals",
|
||||||
|
"baseResource",
|
||||||
|
"berries",
|
||||||
|
"bluff",
|
||||||
|
"bluffSlope",
|
||||||
|
"dirt",
|
||||||
|
"fish",
|
||||||
|
"food",
|
||||||
|
"forest",
|
||||||
|
"hill",
|
||||||
|
"land",
|
||||||
|
"map",
|
||||||
|
"metal",
|
||||||
|
"mountain",
|
||||||
|
"plateau",
|
||||||
|
"player",
|
||||||
|
"prop",
|
||||||
|
"ramp",
|
||||||
|
"rock",
|
||||||
|
"settlement",
|
||||||
|
"spine",
|
||||||
|
"valley",
|
||||||
|
"water"
|
||||||
|
];
|
||||||
|
|
||||||
|
var g_MapInfo;
|
||||||
|
var g_TileClasses;
|
||||||
|
|
||||||
|
var g_Terrains;
|
||||||
|
var g_Gaia;
|
||||||
|
var g_Decoratives;
|
||||||
|
var g_Forests;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an array of elements to the map.
|
||||||
|
*/
|
||||||
|
function addElements(els)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < els.length; ++i)
|
||||||
|
{
|
||||||
|
var stay = null;
|
||||||
|
if (els[i].stay !== undefined)
|
||||||
|
stay = els[i].stay;
|
||||||
|
|
||||||
|
els[i].func(
|
||||||
|
[avoidClasses.apply(null, els[i].avoid), stayClasses.apply(null, stay)],
|
||||||
|
pickSize(els[i].sizes),
|
||||||
|
pickMix(els[i].mixes),
|
||||||
|
pickAmount(els[i].amounts)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts "amount" terms to numbers.
|
||||||
|
*/
|
||||||
|
function pickAmount(amounts)
|
||||||
|
{
|
||||||
|
var amount = amounts[randInt(amounts.length)];
|
||||||
|
|
||||||
|
if (amount in g_Amounts)
|
||||||
|
return g_Amounts[amount];
|
||||||
|
|
||||||
|
return g_Mixes.normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts "mix" terms to numbers.
|
||||||
|
*/
|
||||||
|
function pickMix(mixes)
|
||||||
|
{
|
||||||
|
var mix = mixes[randInt(mixes.length)];
|
||||||
|
|
||||||
|
if (mix in g_Mixes)
|
||||||
|
return g_Mixes[mix];
|
||||||
|
|
||||||
|
return g_Mixes.normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts "size" terms to numbers.
|
||||||
|
*/
|
||||||
|
function pickSize(sizes)
|
||||||
|
{
|
||||||
|
var size = sizes[randInt(sizes.length)];
|
||||||
|
|
||||||
|
if (size in g_Sizes)
|
||||||
|
return g_Sizes[size];
|
||||||
|
|
||||||
|
return g_Sizes.normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Paints the entire map with a single tile type.
|
||||||
|
*/
|
||||||
|
function resetTerrain(terrain, tc, elevation)
|
||||||
|
{
|
||||||
|
g_MapInfo.mapSize = getMapSize();
|
||||||
|
g_MapInfo.mapArea = g_MapInfo.mapSize * g_MapInfo.mapSize;
|
||||||
|
g_MapInfo.centerOfMap = Math.floor(g_MapInfo.mapSize / 2);
|
||||||
|
g_MapInfo.mapRadius = -PI / 4;
|
||||||
|
|
||||||
|
var placer = new ClumpPlacer(g_MapInfo.mapArea, 1, 1, 1, g_MapInfo.centerOfMap, g_MapInfo.centerOfMap);
|
||||||
|
var terrainPainter = new LayeredPainter([terrain], []);
|
||||||
|
var elevationPainter = new SmoothElevationPainter(ELEVATION_SET, elevation, 1);
|
||||||
|
createArea(placer, [terrainPainter, elevationPainter, paintClass(tc)], null);
|
||||||
|
|
||||||
|
g_MapInfo.mapHeight = elevation;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Euclidian distance between two points.
|
||||||
|
*/
|
||||||
|
function euclid_distance(x1, z1, x2, z2)
|
||||||
|
{
|
||||||
|
return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(z2 - z1, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chose starting locations for the given players.
|
||||||
|
*
|
||||||
|
* @param {string} type - "radial", "stacked", "stronghold", "random"
|
||||||
|
* @param {number} distance - radial distance from the center of the map
|
||||||
|
*/
|
||||||
|
function addBases(type, distance, groupedDistance)
|
||||||
|
{
|
||||||
|
type = type || "radial";
|
||||||
|
distance = distance || 0.3;
|
||||||
|
groupedDistance = groupedDistance || 0.05;
|
||||||
|
|
||||||
|
var playerIDs = randomizePlayers();
|
||||||
|
var players = {};
|
||||||
|
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case "line":
|
||||||
|
players = placeLine(playerIDs, distance, groupedDistance);
|
||||||
|
break;
|
||||||
|
case "radial":
|
||||||
|
players = placeRadial(playerIDs, distance);
|
||||||
|
break;
|
||||||
|
case "random":
|
||||||
|
players = placeRandom(playerIDs);
|
||||||
|
break;
|
||||||
|
case "stronghold":
|
||||||
|
players = placeStronghold(playerIDs, distance, groupedDistance);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return players;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the base for a single player.
|
||||||
|
*
|
||||||
|
* @param {Object} - contains id, angle, x, z
|
||||||
|
* @param {boolean} - Whether or not iberian gets starting walls
|
||||||
|
*/
|
||||||
|
function createBase(player, walls)
|
||||||
|
{
|
||||||
|
// Get the x and z in tiles
|
||||||
|
var fx = fractionToTiles(player.x);
|
||||||
|
var fz = fractionToTiles(player.z);
|
||||||
|
var ix = round(fx);
|
||||||
|
var iz = round(fz);
|
||||||
|
addToClass(ix, iz, g_TileClasses.player);
|
||||||
|
addToClass(ix + 5, iz, g_TileClasses.player);
|
||||||
|
addToClass(ix, iz + 5, g_TileClasses.player);
|
||||||
|
addToClass(ix - 5, iz, g_TileClasses.player);
|
||||||
|
addToClass(ix, iz - 5, g_TileClasses.player);
|
||||||
|
|
||||||
|
// Create starting units
|
||||||
|
if ((walls || walls === undefined) && g_MapInfo.mapSize > 192)
|
||||||
|
placeCivDefaultEntities(fx, fz, player.id, g_MapInfo.mapRadius);
|
||||||
|
else
|
||||||
|
placeCivDefaultEntities(fx, fz, player.id, g_MapInfo.mapRadius, { 'iberWall': false });
|
||||||
|
|
||||||
|
// Create the city patch
|
||||||
|
var cityRadius = scaleByMapSize(15, 25) / 3;
|
||||||
|
var placer = new ClumpPlacer(PI * cityRadius * cityRadius, 0.6, 0.3, 10, ix, iz);
|
||||||
|
var painter = new LayeredPainter([g_Terrains.roadWild, g_Terrains.road], [1]);
|
||||||
|
createArea(placer, painter, null);
|
||||||
|
|
||||||
|
// Custom base terrain function
|
||||||
|
|
||||||
|
// Create animals
|
||||||
|
for (var j = 0; j < 2; ++j)
|
||||||
|
{
|
||||||
|
var aAngle = randFloat(0, TWO_PI);
|
||||||
|
var aDist = 7;
|
||||||
|
var aX = round(fx + aDist * cos(aAngle));
|
||||||
|
var aZ = round(fz + aDist * sin(aAngle));
|
||||||
|
var group = new SimpleGroup(
|
||||||
|
[new SimpleObject(g_Gaia.chicken, 5, 5, 0, 2)],
|
||||||
|
true, g_TileClasses.baseResource, aX, aZ
|
||||||
|
);
|
||||||
|
createObjectGroup(group, 0, avoidClasses(g_TileClasses.baseResource, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create berry bushes
|
||||||
|
var bbAngle = randFloat(0, TWO_PI);
|
||||||
|
var bbDist = 12;
|
||||||
|
var bbX = round(fx + bbDist * cos(bbAngle));
|
||||||
|
var bbZ = round(fz + bbDist * sin(bbAngle));
|
||||||
|
group = new SimpleGroup(
|
||||||
|
[new SimpleObject(g_Gaia.fruitBush, 5, 5, 0, 3)],
|
||||||
|
true, g_TileClasses.baseResource, bbX, bbZ
|
||||||
|
);
|
||||||
|
createObjectGroup(group, 0, avoidClasses(g_TileClasses.baseResource, 2));
|
||||||
|
|
||||||
|
// Create metal mine
|
||||||
|
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));
|
||||||
|
group = new SimpleGroup(
|
||||||
|
[new SimpleObject(g_Gaia.metalLarge, 1, 1, 0, 0)],
|
||||||
|
true, g_TileClasses.baseResource, mX, mZ
|
||||||
|
);
|
||||||
|
createObjectGroup(group, 0, avoidClasses(g_TileClasses.baseResource, 2));
|
||||||
|
|
||||||
|
// Create stone mines
|
||||||
|
mAngle += randFloat(PI / 8, PI / 4);
|
||||||
|
mX = round(fx + mDist * cos(mAngle));
|
||||||
|
mZ = round(fz + mDist * sin(mAngle));
|
||||||
|
group = new SimpleGroup(
|
||||||
|
[new SimpleObject(g_Gaia.stoneLarge, 1, 1, 0, 2)],
|
||||||
|
true, g_TileClasses.baseResource, mX, mZ
|
||||||
|
);
|
||||||
|
createObjectGroup(group, 0, avoidClasses(g_TileClasses.baseResource, 2));
|
||||||
|
|
||||||
|
var hillSize = PI * g_MapInfo.mapRadius * g_MapInfo.mapRadius;
|
||||||
|
|
||||||
|
// Create starting trees
|
||||||
|
var num = 5;
|
||||||
|
var tAngle = randFloat(0, TWO_PI);
|
||||||
|
var tDist = randFloat(12, 13);
|
||||||
|
var tX = round(fx + tDist * cos(tAngle));
|
||||||
|
var tZ = round(fz + tDist * sin(tAngle));
|
||||||
|
|
||||||
|
group = new SimpleGroup(
|
||||||
|
[new SimpleObject(g_Gaia.tree1, num, num, 0, 3)],
|
||||||
|
false, g_TileClasses.baseResource, tX, tZ
|
||||||
|
);
|
||||||
|
createObjectGroup(group, 0, avoidClasses(g_TileClasses.baseResource, 2));
|
||||||
|
|
||||||
|
// Create grass tufts
|
||||||
|
var num = hillSize / 250;
|
||||||
|
for (var j = 0; j < num; ++j)
|
||||||
|
{
|
||||||
|
var gAngle = randFloat(0, TWO_PI);
|
||||||
|
var gDist = g_MapInfo.mapRadius - (5 + randInt(7));
|
||||||
|
var gX = round(fx + gDist * cos(gAngle));
|
||||||
|
var gZ = round(fz + gDist * sin(gAngle));
|
||||||
|
group = new SimpleGroup(
|
||||||
|
[new SimpleObject(g_Decoratives.grassShort, 2, 5, 0, 1, -PI / 8, PI / 8)],
|
||||||
|
false, g_TileClasses.baseResource, gX, gZ
|
||||||
|
);
|
||||||
|
createObjectGroup(group, 0, avoidClasses(g_TileClasses.baseResource, 2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an array where each element is an array of playerIndices of a team.
|
||||||
|
*/
|
||||||
|
function getTeams(numPlayers)
|
||||||
|
{
|
||||||
|
// Group players by team
|
||||||
|
var teams = [];
|
||||||
|
for (var i = 0; i < numPlayers; ++i)
|
||||||
|
{
|
||||||
|
let team = getPlayerTeam(i);
|
||||||
|
if (team == -1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!teams[team])
|
||||||
|
teams[team] = [];
|
||||||
|
|
||||||
|
teams[team].push(i+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Players without a team get a custom index
|
||||||
|
for (var i = 0; i < numPlayers; ++i)
|
||||||
|
if (getPlayerTeam(i) == -1)
|
||||||
|
teams.push([i+1]);
|
||||||
|
|
||||||
|
// Remove unused indices
|
||||||
|
return teams.filter(team => true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chose a random pattern for placing the bases of the players.
|
||||||
|
*/
|
||||||
|
function randomStartingPositionPattern()
|
||||||
|
{
|
||||||
|
var formats = ["radial"];
|
||||||
|
|
||||||
|
// Enable stronghold if we have a few teams and a big enough map
|
||||||
|
if (g_MapInfo.teams.length >= 2 && g_MapInfo.numPlayers >= 4 && g_MapInfo.mapSize >= 256)
|
||||||
|
formats.push("stronghold");
|
||||||
|
|
||||||
|
// Enable random if we have enough teams or enough players on a big enough map
|
||||||
|
if (g_MapInfo.mapSize >= 256 && (g_MapInfo.teams.length >= 3 || g_MapInfo.numPlayers > 4))
|
||||||
|
formats.push("random");
|
||||||
|
|
||||||
|
// Enable line if we have enough teams and players on a big enough map
|
||||||
|
if (g_MapInfo.teams.length >= 2 && g_MapInfo.numPlayers >= 4 && g_MapInfo.mapSize >= 384)
|
||||||
|
formats.push("line");
|
||||||
|
|
||||||
|
return {
|
||||||
|
"setup": formats[randInt(formats.length)],
|
||||||
|
"distance": randFloat(0.2, 0.35),
|
||||||
|
"separation": randFloat(0.05, 0.1)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mix player indices but sort by team.
|
||||||
|
*
|
||||||
|
* @returns {Array} - every item is an array of player indices
|
||||||
|
*/
|
||||||
|
function randomizePlayers()
|
||||||
|
{
|
||||||
|
var playerIDs = [];
|
||||||
|
for (var i = 0; i < g_MapInfo.numPlayers; ++i)
|
||||||
|
playerIDs.push(i + 1);
|
||||||
|
|
||||||
|
return sortPlayers(playerIDs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Place teams in a line-pattern.
|
||||||
|
*
|
||||||
|
* @param {Array} playerIDs - typically randomized indices of players of a single team
|
||||||
|
* @param {number} distance - radial distance from the center of the map
|
||||||
|
* @param {number} groupedDistance - distance between players
|
||||||
|
*
|
||||||
|
* @returns {Array} - contains id, angle, x, z for every player
|
||||||
|
*/
|
||||||
|
function placeLine(playerIDs, distance, groupedDistance)
|
||||||
|
{
|
||||||
|
var players = [];
|
||||||
|
|
||||||
|
for (var i = 0; i < g_MapInfo.teams.length; ++i)
|
||||||
|
{
|
||||||
|
var safeDist = distance;
|
||||||
|
if (distance + g_MapInfo.teams[i].length * groupedDistance > 0.45)
|
||||||
|
safeDist = 0.45 - g_MapInfo.teams[i].length * groupedDistance;
|
||||||
|
|
||||||
|
var teamAngle = g_MapInfo.startAngle + (i + 1) * TWO_PI / g_MapInfo.teams.length;
|
||||||
|
|
||||||
|
// Create player base
|
||||||
|
for (var p = 0; p < g_MapInfo.teams[i].length; ++p)
|
||||||
|
{
|
||||||
|
players[g_MapInfo.teams[i][p]] = {
|
||||||
|
"id": g_MapInfo.teams[i][p],
|
||||||
|
"angle": g_MapInfo.startAngle + (p + 1) * TWO_PI / g_MapInfo.teams[i].length,
|
||||||
|
"x": 0.5 + (safeDist + p * groupedDistance) * cos(teamAngle),
|
||||||
|
"z": 0.5 + (safeDist + p * groupedDistance) * sin(teamAngle)
|
||||||
|
};
|
||||||
|
createBase(players[g_MapInfo.teams[i][p]], false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return players;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Place players in a circle-pattern.
|
||||||
|
*
|
||||||
|
* @param {number} distance - radial distance from the center of the map
|
||||||
|
*/
|
||||||
|
function placeRadial(playerIDs, distance)
|
||||||
|
{
|
||||||
|
var players = new Array(g_MapInfo.numPlayers);
|
||||||
|
|
||||||
|
for (var i = 0; i < g_MapInfo.numPlayers; ++i)
|
||||||
|
{
|
||||||
|
var angle = g_MapInfo.startAngle + i * TWO_PI / g_MapInfo.numPlayers;
|
||||||
|
players[i] = {
|
||||||
|
"id": playerIDs[i],
|
||||||
|
"angle": angle,
|
||||||
|
"x": 0.5 + distance * cos(angle),
|
||||||
|
"z": 0.5 + distance * sin(angle)
|
||||||
|
};
|
||||||
|
createBase(players[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return players;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Chose arbitrary starting locations.
|
||||||
|
*/
|
||||||
|
function placeRandom(playerIDs)
|
||||||
|
{
|
||||||
|
var players = [];
|
||||||
|
var placed = [];
|
||||||
|
|
||||||
|
for (var i = 0; i < g_MapInfo.numPlayers; ++i)
|
||||||
|
{
|
||||||
|
var attempts = 0;
|
||||||
|
var playerAngle = randFloat(0, TWO_PI);
|
||||||
|
var distance = randFloat(0, 0.42);
|
||||||
|
var x = 0.5 + distance * cos(playerAngle);
|
||||||
|
var z = 0.5 + distance * sin(playerAngle);
|
||||||
|
|
||||||
|
var tooClose = false;
|
||||||
|
for (var j = 0; j < placed.length; ++j)
|
||||||
|
{
|
||||||
|
var sep = euclid_distance(x, z, placed[j].x, placed[j].z);
|
||||||
|
if (sep < 0.25)
|
||||||
|
{
|
||||||
|
tooClose = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tooClose)
|
||||||
|
{
|
||||||
|
--i;
|
||||||
|
++attempts;
|
||||||
|
|
||||||
|
// Reset if we're in what looks like an infinite loop
|
||||||
|
if (attempts > 100)
|
||||||
|
{
|
||||||
|
players = [];
|
||||||
|
placed = [];
|
||||||
|
i = -1;
|
||||||
|
attempts = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
players[i] = {
|
||||||
|
"id": playerIDs[i],
|
||||||
|
"angle": playerAngle,
|
||||||
|
"x": x,
|
||||||
|
"z": z
|
||||||
|
};
|
||||||
|
|
||||||
|
placed.push(players[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the bases
|
||||||
|
for (var i = 0; i < g_MapInfo.numPlayers; ++i)
|
||||||
|
createBase(players[i]);
|
||||||
|
|
||||||
|
return players;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Place given players in a stronghold-pattern.
|
||||||
|
*
|
||||||
|
* @param distance - radial distance from the center of the map
|
||||||
|
* @param groupedDistance - distance between neighboring players
|
||||||
|
*/
|
||||||
|
function placeStronghold(playerIDs, distance, groupedDistance)
|
||||||
|
{
|
||||||
|
var players = [];
|
||||||
|
|
||||||
|
for (var i = 0; i < g_MapInfo.teams.length; ++i)
|
||||||
|
{
|
||||||
|
var teamAngle = g_MapInfo.startAngle + (i + 1) * TWO_PI / g_MapInfo.teams.length;
|
||||||
|
var fractionX = 0.5 + distance * cos(teamAngle);
|
||||||
|
var fractionZ = 0.5 + distance * sin(teamAngle);
|
||||||
|
|
||||||
|
// If we have a team of above average size, make sure they're spread out
|
||||||
|
if (g_MapInfo.teams[i].length > 4)
|
||||||
|
groupedDistance = randFloat(0.08, 0.12);
|
||||||
|
|
||||||
|
// If we have a team of below average size, make sure they're together
|
||||||
|
if (g_MapInfo.teams[i].length < 3)
|
||||||
|
groupedDistance = randFloat(0.04, 0.06);
|
||||||
|
|
||||||
|
// If we have a solo player, place them on the center of the team's location
|
||||||
|
if (g_MapInfo.teams[i].length == 1)
|
||||||
|
groupedDistance = 0;
|
||||||
|
|
||||||
|
// Create player base
|
||||||
|
for (var p = 0; p < g_MapInfo.teams[i].length; ++p)
|
||||||
|
{
|
||||||
|
var angle = g_MapInfo.startAngle + (p + 1) * TWO_PI / g_MapInfo.teams[i].length;
|
||||||
|
players[g_MapInfo.teams[i][p]] = {
|
||||||
|
"id": g_MapInfo.teams[i][p],
|
||||||
|
"angle": angle,
|
||||||
|
"x": fractionX + groupedDistance * cos(angle),
|
||||||
|
"z": fractionZ + groupedDistance * sin(angle)
|
||||||
|
};
|
||||||
|
createBase(players[g_MapInfo.teams[i][p]], false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return players;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates tileClass for the default classes and every class given.
|
||||||
|
*
|
||||||
|
* @param {Array} newClasses
|
||||||
|
* @returns {Object} - maps from classname to ID
|
||||||
|
*/
|
||||||
|
function initTileClasses(newClasses)
|
||||||
|
{
|
||||||
|
var classNames = g_DefaultTileClasses;
|
||||||
|
|
||||||
|
if (newClasses !== undefined)
|
||||||
|
classNames = classNames.concat(newClasses);
|
||||||
|
|
||||||
|
g_TileClasses = {};
|
||||||
|
for (var className of classNames)
|
||||||
|
g_TileClasses[className] = createTileClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get biome-specific names of entities and terrain after randomization.
|
||||||
|
*/
|
||||||
|
function initBiome()
|
||||||
|
{
|
||||||
|
g_Terrains = {
|
||||||
|
"mainTerrain": rBiomeT1(),
|
||||||
|
"forestFloor1": rBiomeT2(),
|
||||||
|
"forestFloor2": rBiomeT3(),
|
||||||
|
"cliff": rBiomeT4(),
|
||||||
|
"tier1Terrain": rBiomeT5(),
|
||||||
|
"tier2Terrain": rBiomeT6(),
|
||||||
|
"tier3Terrain": rBiomeT7(),
|
||||||
|
"hill": rBiomeT8(),
|
||||||
|
"dirt": rBiomeT9(),
|
||||||
|
"road": rBiomeT10(),
|
||||||
|
"roadWild": rBiomeT11(),
|
||||||
|
"tier4Terrain": rBiomeT12(),
|
||||||
|
"shoreBlend": rBiomeT13(),
|
||||||
|
"shore": rBiomeT14(),
|
||||||
|
"water": rBiomeT15()
|
||||||
|
};
|
||||||
|
|
||||||
|
g_Gaia = {
|
||||||
|
"tree1": rBiomeE1(),
|
||||||
|
"tree2": rBiomeE2(),
|
||||||
|
"tree3": rBiomeE3(),
|
||||||
|
"tree4": rBiomeE4(),
|
||||||
|
"tree5": rBiomeE5(),
|
||||||
|
"fruitBush": rBiomeE6(),
|
||||||
|
"chicken": rBiomeE7(),
|
||||||
|
"mainHuntableAnimal": rBiomeE8(),
|
||||||
|
"fish": rBiomeE9(),
|
||||||
|
"secondaryHuntableAnimal": rBiomeE10(),
|
||||||
|
"stoneLarge": rBiomeE11(),
|
||||||
|
"stoneSmall": rBiomeE12(),
|
||||||
|
"metalLarge": rBiomeE13()
|
||||||
|
};
|
||||||
|
|
||||||
|
g_Decoratives = {
|
||||||
|
"grass": rBiomeA1(),
|
||||||
|
"grassShort": rBiomeA2(),
|
||||||
|
"reeds": rBiomeA3(),
|
||||||
|
"lillies": rBiomeA4(),
|
||||||
|
"rockLarge": rBiomeA5(),
|
||||||
|
"rockMedium": rBiomeA6(),
|
||||||
|
"bushMedium": rBiomeA7(),
|
||||||
|
"bushSmall": rBiomeA8(),
|
||||||
|
"tree": rBiomeA9()
|
||||||
|
};
|
||||||
|
|
||||||
|
g_Forests = {
|
||||||
|
"forest1": [
|
||||||
|
g_Terrains.forestFloor2 + TERRAIN_SEPARATOR + g_Gaia.tree1,
|
||||||
|
g_Terrains.forestFloor2 + TERRAIN_SEPARATOR + g_Gaia.tree2,
|
||||||
|
g_Terrains.forestFloor2
|
||||||
|
],
|
||||||
|
"forest2": [
|
||||||
|
g_Terrains.forestFloor1 + TERRAIN_SEPARATOR + g_Gaia.tree4,
|
||||||
|
g_Terrains.forestFloor1 + TERRAIN_SEPARATOR + g_Gaia.tree5,
|
||||||
|
g_Terrains.forestFloor1
|
||||||
|
]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an object of commonly used functions.
|
||||||
|
*/
|
||||||
|
function initMapSettings()
|
||||||
|
{
|
||||||
|
initBiome();
|
||||||
|
|
||||||
|
let numPlayers = getNumPlayers();
|
||||||
|
g_MapInfo = {
|
||||||
|
"biome": biomeID,
|
||||||
|
"numPlayers": numPlayers,
|
||||||
|
"teams": getTeams(numPlayers),
|
||||||
|
"startAngle": randFloat(0, TWO_PI)
|
||||||
|
};
|
||||||
|
}
|
237
binaries/data/mods/public/maps/random/stronghold.js
Normal file
237
binaries/data/mods/public/maps/random/stronghold.js
Normal file
@ -0,0 +1,237 @@
|
|||||||
|
RMS.LoadLibrary("rmgen");
|
||||||
|
InitMap();
|
||||||
|
|
||||||
|
randomizeBiome();
|
||||||
|
initMapSettings();
|
||||||
|
initTileClasses();
|
||||||
|
|
||||||
|
resetTerrain(g_Terrains.mainTerrain, g_TileClasses.land, 30);
|
||||||
|
RMS.SetProgress(20);
|
||||||
|
|
||||||
|
addBases("stronghold", randFloat(0.2, 0.35), randFloat(0.05, 0.1));
|
||||||
|
RMS.SetProgress(30);
|
||||||
|
|
||||||
|
addElements(shuffleArray([
|
||||||
|
{
|
||||||
|
"func": addBluffs,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 20,
|
||||||
|
g_TileClasses.hill, 5,
|
||||||
|
g_TileClasses.mountain, 20,
|
||||||
|
g_TileClasses.plateau, 20,
|
||||||
|
g_TileClasses.player, 30,
|
||||||
|
g_TileClasses.valley, 5,
|
||||||
|
g_TileClasses.water, 7
|
||||||
|
],
|
||||||
|
"sizes": ["big", "huge"],
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addHills,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.hill, 15,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.valley, 2,
|
||||||
|
g_TileClasses.water, 2
|
||||||
|
],
|
||||||
|
"sizes": ["normal", "big"],
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addMountains,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 20,
|
||||||
|
g_TileClasses.mountain, 25,
|
||||||
|
g_TileClasses.plateau, 20,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.valley, 10,
|
||||||
|
g_TileClasses.water, 15
|
||||||
|
],
|
||||||
|
"sizes": ["big", "huge"],
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addPlateaus,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 20,
|
||||||
|
g_TileClasses.mountain, 25,
|
||||||
|
g_TileClasses.plateau, 25,
|
||||||
|
g_TileClasses.player, 40,
|
||||||
|
g_TileClasses.valley, 10,
|
||||||
|
g_TileClasses.water, 15
|
||||||
|
],
|
||||||
|
"sizes": ["big", "huge"],
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addValleys,
|
||||||
|
"avoid": [g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.hill, 5,
|
||||||
|
g_TileClasses.mountain, 25,
|
||||||
|
g_TileClasses.plateau, 10,
|
||||||
|
g_TileClasses.player, 40,
|
||||||
|
g_TileClasses.valley, 15,
|
||||||
|
g_TileClasses.water, 10
|
||||||
|
],
|
||||||
|
"sizes": ["normal", "big"],
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
}
|
||||||
|
]));
|
||||||
|
RMS.SetProgress(60);
|
||||||
|
|
||||||
|
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.valley, 5,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addDecoration,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.bluff, 2,
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 12,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["normal"],
|
||||||
|
"amounts": ["normal"]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
RMS.SetProgress(70);
|
||||||
|
|
||||||
|
addElements(shuffleArray([
|
||||||
|
{
|
||||||
|
"func": addMetal,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 3,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 30,
|
||||||
|
g_TileClasses.rock, 10,
|
||||||
|
g_TileClasses.metal, 20,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addStone,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 3,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 30,
|
||||||
|
g_TileClasses.rock, 20,
|
||||||
|
g_TileClasses.metal, 10,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": ["normal"],
|
||||||
|
"mixes": ["same"],
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addForests,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries,
|
||||||
|
5, g_TileClasses.bluff,
|
||||||
|
5, g_TileClasses.forest,
|
||||||
|
18, g_TileClasses.metal, 3,
|
||||||
|
g_TileClasses.mountain, 5,
|
||||||
|
g_TileClasses.plateau, 5,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 3,
|
||||||
|
g_TileClasses.water, 2
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": ["few", "normal", "many", "tons"]
|
||||||
|
}
|
||||||
|
]));
|
||||||
|
RMS.SetProgress(80);
|
||||||
|
|
||||||
|
addElements(shuffleArray([
|
||||||
|
{
|
||||||
|
"func": addBerries,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 30,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 5,
|
||||||
|
g_TileClasses.metal, 10,
|
||||||
|
g_TileClasses.mountain, 2,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 10,
|
||||||
|
g_TileClasses.spine, 2,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addAnimals,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.animals, 20,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 2,
|
||||||
|
g_TileClasses.metal, 2,
|
||||||
|
g_TileClasses.mountain, 1,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 20,
|
||||||
|
g_TileClasses.rock, 2,
|
||||||
|
g_TileClasses.spine, 2,
|
||||||
|
g_TileClasses.water, 3
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"func": addStragglerTrees,
|
||||||
|
"avoid": [
|
||||||
|
g_TileClasses.berries, 5,
|
||||||
|
g_TileClasses.bluff, 5,
|
||||||
|
g_TileClasses.forest, 7,
|
||||||
|
g_TileClasses.metal, 2,
|
||||||
|
g_TileClasses.mountain, 1,
|
||||||
|
g_TileClasses.plateau, 2,
|
||||||
|
g_TileClasses.player, 12,
|
||||||
|
g_TileClasses.rock, 2,
|
||||||
|
g_TileClasses.spine, 2,
|
||||||
|
g_TileClasses.water, 5
|
||||||
|
],
|
||||||
|
"sizes": g_AllSizes,
|
||||||
|
"mixes": g_AllMixes,
|
||||||
|
"amounts": g_AllAmounts
|
||||||
|
}
|
||||||
|
]));
|
||||||
|
RMS.SetProgress(90);
|
||||||
|
|
||||||
|
ExportMap();
|
11
binaries/data/mods/public/maps/random/stronghold.json
Normal file
11
binaries/data/mods/public/maps/random/stronghold.json
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"settings" : {
|
||||||
|
"Name" : "Stronghold",
|
||||||
|
"Script" : "stronghold.js",
|
||||||
|
"Description" : "Teams start off with nearly adjacent town centers, offering easy military and construction cooperation. With slivers of personal territory, teammates must rely on each other to defend their rear.",
|
||||||
|
"BaseTerrain" : ["medit_sea_depths"],
|
||||||
|
"BaseHeight" : 30,
|
||||||
|
"Preview" : "stronghold.png",
|
||||||
|
"CircularMap" : true
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user