Skip to content

Commit f7cd3de

Browse files
committed
Newsletter addition: WeightedRandomize
1 parent d686cd7 commit f7cd3de

4 files changed

Lines changed: 89 additions & 0 deletions

File tree

v3/src/gameobjects/tilemap/Tilemap.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,6 +1205,23 @@ var Tilemap = new Class({
12051205
return TilemapComponents.TileToWorldXY(tileX, tileY, point, camera, layer);
12061206
},
12071207

1208+
/**
1209+
* See component documentation. If no layer specified, the map's current layer is used. This
1210+
* cannot be applied to StaticTilemapLayers.
1211+
*
1212+
* @return {this|null} Returns this, or null if the layer given was invalid.
1213+
*/
1214+
weightedRandomize: function (tileX, tileY, width, height, weightedIndexes, layer)
1215+
{
1216+
layer = this.getLayer(layer);
1217+
if (this._isStaticCall(layer, 'randomize')) { return this; }
1218+
if (layer !== null)
1219+
{
1220+
TilemapComponents.WeightedRandomize(tileX, tileY, width, height, weightedIndexes, layer);
1221+
}
1222+
return this;
1223+
},
1224+
12081225
/**
12091226
* See component documentation. If no layer specified, the map's current layer is used.
12101227
*
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
var GetTilesWithin = require('./GetTilesWithin');
2+
3+
/**
4+
* Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the
5+
* specified layer. Each tile will recieve a new index. New indexes are drawn from the given
6+
* weightedIndexes array. An example weighted array:
7+
*
8+
* [
9+
* { index: 6, weight: 4 }, // Probability of index 6 is 4 / 8
10+
* { index: 7, weight: 2 }, // Probability of index 7 would be 2 / 8
11+
* { index: 8, weight: 1.5 }, // Probability of index 8 would be 1.5 / 8
12+
* { index: 26, weight: 0.5 } // Probability of index 27 would be 0.5 / 8
13+
* ]
14+
*
15+
* The probability of any index being choose is (the index's weight) / (sum of all weights). This
16+
* method only modifies tile indexes and does not change collisioninformation.
17+
*
18+
* @param {integer} [tileX=0] - [description]
19+
* @param {integer} [tileY=0] - [description]
20+
* @param {integer} [width=max width based on tileX] - [description]
21+
* @param {integer} [height=max height based on tileY] - [description]
22+
* @param {object[]} [weightedIndexes] - An array of objects to randomly draw from during
23+
* randomization. They should be in the form: { index: 0, weight: 4 }.
24+
* @param {LayerData} layer - [description]
25+
*/
26+
var WeightedRandomize = function (tileX, tileY, width, height, weightedIndexes, layer)
27+
{
28+
if (weightedIndexes === undefined) { return; }
29+
30+
var i;
31+
var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
32+
33+
var weightTotal = 0;
34+
for (i = 0; i < weightedIndexes.length; i++)
35+
{
36+
weightTotal += weightedIndexes[i].weight;
37+
}
38+
39+
if (weightTotal <= 0) { return; }
40+
41+
for (i = 0; i < tiles.length; i++)
42+
{
43+
var rand = Math.random() * weightTotal;
44+
var sum = 0;
45+
var randomIndex = -1;
46+
for (var j = 0; j < weightedIndexes.length; j++)
47+
{
48+
sum += weightedIndexes[j].weight;
49+
if (rand <= sum)
50+
{
51+
randomIndex = weightedIndexes[j].index;
52+
break;
53+
}
54+
}
55+
56+
tiles[i].index = randomIndex;
57+
}
58+
};
59+
60+
module.exports = WeightedRandomize;

v3/src/gameobjects/tilemap/components/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ module.exports = {
3535
TileToWorldX: require('./TileToWorldX'),
3636
TileToWorldXY: require('./TileToWorldXY'),
3737
TileToWorldY: require('./TileToWorldY'),
38+
WeightedRandomize: require('./WeightedRandomize'),
3839
WorldToTileX: require('./WorldToTileX'),
3940
WorldToTileXY: require('./WorldToTileXY'),
4041
WorldToTileY: require('./WorldToTileY')

v3/src/gameobjects/tilemap/dynamiclayer/DynamicTilemapLayer.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,17 @@ var DynamicTilemapLayer = new Class({
463463
return TilemapComponents.TileToWorldXY(tileX, tileY, point, camera, this.layer);
464464
},
465465

466+
/**
467+
* See component documentation.
468+
*
469+
* @return {this}
470+
*/
471+
weightedRandomize: function (tileX, tileY, width, height, weightedIndexes)
472+
{
473+
TilemapComponents.WeightedRandomize(tileX, tileY, width, height, weightedIndexes, this.layer);
474+
return this;
475+
},
476+
466477
/**
467478
* See component documentation.
468479
*

0 commit comments

Comments
 (0)