Unify deepcopy and clone.
Delete clone globalscripts function introduced by 9f47ed536d
.
Rename the better supported deepcopy function to clone.
Delete unused Vector2D and Vector3D clone prototype functions that can
just use clone if needed.
Differential Revision: https://code.wildfiregames.com/D870
Reviewed By: leper
This was SVN commit r20125.
This commit is contained in:
parent
e1bf09977c
commit
e95f4e9744
@ -1,22 +1,3 @@
|
|||||||
/**
|
|
||||||
* returns a clone of a simple object or array
|
|
||||||
* Only valid JSON objects are accepted
|
|
||||||
* So no recursion, and only plain objects or arrays
|
|
||||||
*/
|
|
||||||
function clone(o)
|
|
||||||
{
|
|
||||||
let r;
|
|
||||||
if (o instanceof Array)
|
|
||||||
r = [];
|
|
||||||
else if (o instanceof Object)
|
|
||||||
r = {};
|
|
||||||
else // native data type
|
|
||||||
return o;
|
|
||||||
for (let key in o)
|
|
||||||
r[key] = clone(o[key]);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* "Inside-out" implementation of Fisher-Yates shuffle
|
* "Inside-out" implementation of Fisher-Yates shuffle
|
||||||
*/
|
*/
|
||||||
|
@ -136,11 +136,6 @@ Vector2D.prototype.distanceTo = function(v)
|
|||||||
// Static functions that return a new vector object.
|
// Static functions that return a new vector object.
|
||||||
// Note that object creation is slow in JS, so use them only when necessary
|
// Note that object creation is slow in JS, so use them only when necessary
|
||||||
|
|
||||||
Vector2D.clone = function(v)
|
|
||||||
{
|
|
||||||
return new Vector2D(v.x, v.y);
|
|
||||||
};
|
|
||||||
|
|
||||||
Vector2D.from3D = function(v)
|
Vector2D.from3D = function(v)
|
||||||
{
|
{
|
||||||
return new Vector2D(v.x, v.z);
|
return new Vector2D(v.x, v.z);
|
||||||
@ -311,11 +306,6 @@ Vector3D.prototype.horizDistanceTo = function(v)
|
|||||||
// Static functions that return a new vector object.
|
// Static functions that return a new vector object.
|
||||||
// Note that object creation is slow in JS, so use them only when really necessary
|
// Note that object creation is slow in JS, so use them only when really necessary
|
||||||
|
|
||||||
Vector3D.clone = function(v)
|
|
||||||
{
|
|
||||||
return new Vector3D(v.x, v.y, v.z);
|
|
||||||
};
|
|
||||||
|
|
||||||
Vector3D.add = function(v1, v2)
|
Vector3D.add = function(v1, v2)
|
||||||
{
|
{
|
||||||
return new Vector3D(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
|
return new Vector3D(v1.x + v2.x, v1.y + v2.y, v1.z + v2.z);
|
||||||
|
@ -1731,7 +1731,7 @@ function selectMap(name)
|
|||||||
g_GameAttributes.settings[prop] = undefined;
|
g_GameAttributes.settings[prop] = undefined;
|
||||||
|
|
||||||
let mapData = loadMapData(name);
|
let mapData = loadMapData(name);
|
||||||
let mapSettings = mapData && mapData.settings ? deepcopy(mapData.settings) : {};
|
let mapSettings = mapData && mapData.settings ? clone(mapData.settings) : {};
|
||||||
|
|
||||||
// Reset victory conditions
|
// Reset victory conditions
|
||||||
if (g_GameAttributes.mapType != "random")
|
if (g_GameAttributes.mapType != "random")
|
||||||
|
@ -1123,7 +1123,7 @@ function updateDebug()
|
|||||||
|
|
||||||
debug.hidden = false;
|
debug.hidden = false;
|
||||||
|
|
||||||
let conciseSimState = deepcopy(GetSimState());
|
let conciseSimState = clone(GetSimState());
|
||||||
conciseSimState.players = "<<<omitted>>>";
|
conciseSimState.players = "<<<omitted>>>";
|
||||||
let text = "simulation: " + uneval(conciseSimState);
|
let text = "simulation: " + uneval(conciseSimState);
|
||||||
|
|
||||||
|
@ -118,7 +118,7 @@ while (!goodStartPositionsFound)
|
|||||||
log("Starting giant while loop try " + tries);
|
log("Starting giant while loop try " + tries);
|
||||||
|
|
||||||
// Generate reliefmap
|
// Generate reliefmap
|
||||||
var myReliefmap = deepcopy(g_Map.height);
|
var myReliefmap = clone(g_Map.height);
|
||||||
setRandomHeightmap(heightRange.min, heightRange.max, myReliefmap);
|
setRandomHeightmap(heightRange.min, heightRange.max, myReliefmap);
|
||||||
for (var i = 0; i < 50 + mapSize/4; i++) // Cycles depend on mapsize (more cycles -> bigger structures)
|
for (var i = 0; i < 50 + mapSize/4; i++) // Cycles depend on mapsize (more cycles -> bigger structures)
|
||||||
globalSmoothHeightmap(0.8, myReliefmap);
|
globalSmoothHeightmap(0.8, myReliefmap);
|
||||||
@ -175,7 +175,7 @@ while (!goodStartPositionsFound)
|
|||||||
possibleStartPositionsTemp.push(possibleStartPositions[i]);
|
possibleStartPositionsTemp.push(possibleStartPositions[i]);
|
||||||
// placeTerrain(possibleStartPositions[i][0], possibleStartPositions[i][1], "purple"); // Only works properly for 1 loop
|
// placeTerrain(possibleStartPositions[i][0], possibleStartPositions[i][1], "purple"); // Only works properly for 1 loop
|
||||||
}
|
}
|
||||||
possibleStartPositions = deepcopy(possibleStartPositionsTemp);
|
possibleStartPositions = clone(possibleStartPositionsTemp);
|
||||||
|
|
||||||
// Reduce to tiles near low and high ground (Rectangular check since faster) to make sure each player has access to all resource types.
|
// Reduce to tiles near low and high ground (Rectangular check since faster) to make sure each player has access to all resource types.
|
||||||
var possibleStartPositionsTemp = [];
|
var possibleStartPositionsTemp = [];
|
||||||
@ -210,7 +210,7 @@ while (!goodStartPositionsFound)
|
|||||||
// placeTerrain(possibleStartPositions[i][0], possibleStartPositions[i][1], "red"); // Only works properly for 1 loop
|
// placeTerrain(possibleStartPositions[i][0], possibleStartPositions[i][1], "red"); // Only works properly for 1 loop
|
||||||
}
|
}
|
||||||
|
|
||||||
possibleStartPositions = deepcopy(possibleStartPositionsTemp);
|
possibleStartPositions = clone(possibleStartPositionsTemp);
|
||||||
|
|
||||||
if(possibleStartPositions.length > numPlayers)
|
if(possibleStartPositions.length > numPlayers)
|
||||||
enoughTiles = true;
|
enoughTiles = true;
|
||||||
|
@ -13,7 +13,7 @@ function placeRandomPathToHeight(
|
|||||||
width = 10, distance = 4, strength = 0.08, heightmap = g_Map.height)
|
width = 10, distance = 4, strength = 0.08, heightmap = g_Map.height)
|
||||||
{
|
{
|
||||||
let pathPoints = [];
|
let pathPoints = [];
|
||||||
let position = deepcopy(start);
|
let position = clone(start);
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
rectangularSmoothToHeight(position, width, width, targetHeight, strength, heightmap);
|
rectangularSmoothToHeight(position, width, width, targetHeight, strength, heightmap);
|
||||||
@ -85,7 +85,7 @@ let fences = [
|
|||||||
];
|
];
|
||||||
let num = fences.length;
|
let num = fences.length;
|
||||||
for (let i = 0; i < num; ++i)
|
for (let i = 0; i < num; ++i)
|
||||||
fences.push(new Fortress("fence", deepcopy(fences[i].wall).reverse()));
|
fences.push(new Fortress("fence", clone(fences[i].wall).reverse()));
|
||||||
|
|
||||||
// Groves, only Wood
|
// Groves, only Wood
|
||||||
let groveEntities = ["gaia/flora_bush_temperate", "gaia/flora_tree_euro_beech"];
|
let groveEntities = ["gaia/flora_bush_temperate", "gaia/flora_tree_euro_beech"];
|
||||||
@ -400,7 +400,7 @@ RMS.SetProgress(45);
|
|||||||
/**
|
/**
|
||||||
* Get resource spots after players start locations calculation
|
* Get resource spots after players start locations calculation
|
||||||
*/
|
*/
|
||||||
let avoidPoints = deepcopy(startLocations);
|
let avoidPoints = clone(startLocations);
|
||||||
for (let i = 0; i < avoidPoints.length; ++i)
|
for (let i = 0; i < avoidPoints.length; ++i)
|
||||||
avoidPoints[i].dist = 30;
|
avoidPoints[i].dist = 30;
|
||||||
let resourceSpots = getPointsByHeight({ "min": (heighLimits[3] + heighLimits[4]) / 2, "max": (heighLimits[5] + heighLimits[6]) / 2 }, avoidPoints, clPath);
|
let resourceSpots = getPointsByHeight({ "min": (heighLimits[3] + heighLimits[4]) / 2, "max": (heighLimits[5] + heighLimits[6]) / 2 }, avoidPoints, clPath);
|
||||||
|
@ -250,7 +250,7 @@ function setBaseTerrainDiamondSquare(minHeight = MIN_HEIGHT, maxHeight = MAX_HEI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
initialHeightmap = deepcopy(newHeightmap);
|
initialHeightmap = clone(newHeightmap);
|
||||||
offset /= Math.pow(2, smoothness);
|
offset /= Math.pow(2, smoothness);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -269,7 +269,7 @@ function setBaseTerrainDiamondSquare(minHeight = MIN_HEIGHT, maxHeight = MAX_HEI
|
|||||||
*/
|
*/
|
||||||
function globalSmoothHeightmap(strength = 0.8, heightmap = g_Map.height, smoothMap = [[1, 0], [1, 1], [0, 1], [-1, 1], [-1, 0], [-1, -1], [0, -1], [1, -1]])
|
function globalSmoothHeightmap(strength = 0.8, heightmap = g_Map.height, smoothMap = [[1, 0], [1, 1], [0, 1], [-1, 1], [-1, 0], [-1, -1], [0, -1], [1, -1]])
|
||||||
{
|
{
|
||||||
let referenceHeightmap = deepcopy(heightmap);
|
let referenceHeightmap = clone(heightmap);
|
||||||
let max_x = heightmap.length;
|
let max_x = heightmap.length;
|
||||||
let max_y = heightmap[0].length;
|
let max_y = heightmap[0].length;
|
||||||
for (let x = 0; x < max_x; ++x)
|
for (let x = 0; x < max_x; ++x)
|
||||||
@ -350,7 +350,7 @@ function rectangularSmoothToHeight(center, dx, dy, targetHeight, strength = 0.8,
|
|||||||
function getPointsByHeight(heightRange, avoidPoints = [], avoidClass = undefined, minDistance = 20, maxTries = 2 * g_Map.size, heightmap = g_Map.height, isCircular = g_MapSettings.CircularMap)
|
function getPointsByHeight(heightRange, avoidPoints = [], avoidClass = undefined, minDistance = 20, maxTries = 2 * g_Map.size, heightmap = g_Map.height, isCircular = g_MapSettings.CircularMap)
|
||||||
{
|
{
|
||||||
let points = [];
|
let points = [];
|
||||||
let placements = deepcopy(avoidPoints);
|
let placements = clone(avoidPoints);
|
||||||
let validVertices = [];
|
let validVertices = [];
|
||||||
let r = 0.5 * (heightmap.length - 1); // Map center x/y as well as radius
|
let r = 0.5 * (heightmap.length - 1); // Map center x/y as well as radius
|
||||||
let avoidMap;
|
let avoidMap;
|
||||||
|
@ -570,7 +570,7 @@ function getOrderOfPointsForShortestClosePath(points)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Just add the first 3 points
|
// Just add the first 3 points
|
||||||
let pointsToAdd = deepcopy(points);
|
let pointsToAdd = clone(points);
|
||||||
for (let i = 0; i < 3; ++i)
|
for (let i = 0; i < 3; ++i)
|
||||||
{
|
{
|
||||||
order.push(i);
|
order.push(i);
|
||||||
|
@ -299,7 +299,7 @@ let fences = [
|
|||||||
];
|
];
|
||||||
let num = fences.length;
|
let num = fences.length;
|
||||||
for (let i = 0; i < num; ++i)
|
for (let i = 0; i < num; ++i)
|
||||||
fences.push(new Fortress("fence", deepcopy(fences[i].wall).reverse()));
|
fences.push(new Fortress("fence", clone(fences[i].wall).reverse()));
|
||||||
|
|
||||||
// Camps with fire and gold treasure
|
// Camps with fire and gold treasure
|
||||||
function placeCamp(point,
|
function placeCamp(point,
|
||||||
@ -647,7 +647,7 @@ RMS.SetProgress(80);
|
|||||||
/**
|
/**
|
||||||
* Get resource spots after players start locations calculation and paths
|
* Get resource spots after players start locations calculation and paths
|
||||||
*/
|
*/
|
||||||
let avoidPoints = deepcopy(startLocations);
|
let avoidPoints = clone(startLocations);
|
||||||
for (let i = 0; i < avoidPoints.length; ++i)
|
for (let i = 0; i < avoidPoints.length; ++i)
|
||||||
avoidPoints[i].dist = 30;
|
avoidPoints[i].dist = 30;
|
||||||
let resourceSpots = getPointsByHeight(resourceSpotHeightRange, avoidPoints, clPath);
|
let resourceSpots = getPointsByHeight(resourceSpotHeightRange, avoidPoints, clPath);
|
||||||
|
@ -3890,7 +3890,7 @@ UnitAI.prototype.GetOrderData = function()
|
|||||||
var orders = [];
|
var orders = [];
|
||||||
for (let order of this.orderQueue)
|
for (let order of this.orderQueue)
|
||||||
if (order.data)
|
if (order.data)
|
||||||
orders.push(deepcopy(order.data));
|
orders.push(clone(order.data));
|
||||||
|
|
||||||
return orders;
|
return orders;
|
||||||
};
|
};
|
||||||
|
@ -389,7 +389,7 @@ ScriptInterface_impl::ScriptInterface_impl(const char* nativeScopeName, const sh
|
|||||||
JS_DefineFunction(m_cx, globalRootedVal, "log", ::logmsg, 1, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT);
|
JS_DefineFunction(m_cx, globalRootedVal, "log", ::logmsg, 1, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT);
|
||||||
JS_DefineFunction(m_cx, globalRootedVal, "warn", ::warn, 1, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT);
|
JS_DefineFunction(m_cx, globalRootedVal, "warn", ::warn, 1, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT);
|
||||||
JS_DefineFunction(m_cx, globalRootedVal, "error", ::error, 1, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT);
|
JS_DefineFunction(m_cx, globalRootedVal, "error", ::error, 1, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT);
|
||||||
JS_DefineFunction(m_cx, globalRootedVal, "deepcopy", ::deepcopy, 1, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT);
|
JS_DefineFunction(m_cx, globalRootedVal, "clone", ::deepcopy, 1, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT);
|
||||||
JS_DefineFunction(m_cx, globalRootedVal, "deepfreeze", ::deepfreeze, 1, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT);
|
JS_DefineFunction(m_cx, globalRootedVal, "deepfreeze", ::deepfreeze, 1, JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT);
|
||||||
|
|
||||||
Register("ProfileStart", ::ProfileStart, 1);
|
Register("ProfileStart", ::ProfileStart, 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user