Skip to content
This repository was archived by the owner on Mar 11, 2025. It is now read-only.

Commit 9e09a5c

Browse files
committed
cut dependency between business objects and generators
1 parent 63deff4 commit 9e09a5c

File tree

9 files changed

+345
-378
lines changed

9 files changed

+345
-378
lines changed

www/index.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
<script src="js/catan/js/tools.js"></script>
2525
<script src="js/catan/js/ui.js"></script>
2626
<script src="js/catan/js/position.js"></script>
27+
<script src="js/catan/js/generator/generator.js"></script>
28+
<script src="js/catan/js/generator/generator.land.js"></script>
29+
<script src="js/catan/js/generator/generator.number.js"></script>
30+
<script src="js/catan/js/generator/generator.harbor.js"></script>
2731

2832
<!-- cordova script (this will be a 404 during development) -->
2933
<script src="cordova.js"></script>

www/js/catan/js/catan.js

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,26 +18,5 @@ Catan = (function () {
1818
}
1919
};
2020

21-
22-
Catan.generateMap = function (canvas, tileTrioScoreLimit) {
23-
tileTrioScoreLimit = tileTrioScoreLimit || 12;
24-
25-
var lands, res, map;
26-
27-
do {
28-
map = new Catan.Map(7, 7, new Catan.Position(3, 3));
29-
do {
30-
lands = map.generateLands();
31-
} while (lands.length > 0);
32-
33-
res = map.generateNumbers(tileTrioScoreLimit);
34-
} while (!res);
35-
36-
map.generateHarbors();
37-
38-
Catan.UI.drawMap(map, canvas);
39-
return map;
40-
};
41-
4221
return Catan;
4322
})();
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
(function(Catan) {
2+
3+
Catan.Generator.Harbor = {};
4+
5+
Catan.Generator.Harbor.generate = function (map) {
6+
var mod = Math.round(Math.random());
7+
var n = 0;
8+
9+
// create harbors
10+
var landHarbors = [
11+
Catan.T.Hills, Catan.T.Forest,
12+
Catan.T.Fields, Catan.T.Mountains, Catan.T.Pasture
13+
];
14+
Catan.Tools.shuffle(landHarbors);
15+
var empties = [Catan.T.Empty, Catan.T.Empty, Catan.T.Empty, Catan.T.Empty];
16+
var harbors = [];
17+
for (var i = empties.length; i > 0; --i) {
18+
harbors.push(landHarbors.pop());
19+
harbors.push(empties.pop());
20+
}
21+
harbors.push(landHarbors.pop());
22+
Catan.Tools.rotate(harbors, (Catan.Tools.randInterval(0, harbors.length - 1)));
23+
24+
var harborCoords = [];
25+
26+
// put harbors on map and index
27+
map.eachCoast(function (i, j) {
28+
// set oceans and harboors
29+
if (n++ % 2 != mod) {
30+
map.get(i, j).land = Catan.T.Ocean;
31+
} else {
32+
map.get(i, j).land = Catan.T.Harbor;
33+
map.get(i, j).circle = harbors.pop();
34+
35+
if (map.get(i, j).circle != Catan.T.Empty) {
36+
harborCoords.push(new Catan.Position(i, j));
37+
}
38+
}
39+
});
40+
41+
var lands = [
42+
Catan.T.Hills,
43+
Catan.T.Pasture,
44+
Catan.T.Mountains,
45+
Catan.T.Fields,
46+
Catan.T.Forest,
47+
Catan.T.Desert
48+
];
49+
50+
// swap harbors
51+
var swapped = true;
52+
for (var limit = 0; swapped && limit < 30; limit++) {
53+
swapped = false;
54+
Catan.Tools.shuffle(harborCoords);
55+
for (var h = 0; h < harborCoords.length; h++) {
56+
var currentHarbor = map.get(harborCoords[h].column, harborCoords[h].line);
57+
var allowedLands = lands;
58+
allowedLands = map.getAllowedLands(harborCoords[h].column, harborCoords[h].line, allowedLands);
59+
60+
if (!Catan.Tools.contains(allowedLands, currentHarbor.circle)) {
61+
// find a place to go
62+
for (var hh = 0; hh < harborCoords.length; hh++) {
63+
allowedLands = lands;
64+
allowedLands = map.getAllowedLands(harborCoords[hh].column, harborCoords[hh].line, allowedLands);
65+
if (Catan.Tools.contains(allowedLands, currentHarbor.circle)) {
66+
// do swap
67+
var swapHarbor = map.get(harborCoords[hh].column, harborCoords[hh].line);
68+
var cTmp = swapHarbor.circle;
69+
swapHarbor.circle = currentHarbor.circle;
70+
currentHarbor.circle = cTmp;
71+
swapped = true;
72+
}
73+
}
74+
}
75+
}
76+
}
77+
};
78+
})(Catan);

www/js/catan/js/generator/generator.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,25 @@
22

33
Catan.Generator = {};
44

5+
Catan.Generator.Map = {};
6+
7+
Catan.Generator.Map.generate = function (tileTrioScoreLimit) {
8+
tileTrioScoreLimit = tileTrioScoreLimit || 12;
9+
10+
var lands, res, map;
11+
12+
do {
13+
map = new Catan.Map(7, 7, new Catan.Position(3, 3));
14+
do {
15+
lands = Catan.Generator.Land.generate(map);
16+
} while (lands.length > 0);
17+
18+
res = Catan.Generator.Number.generate(map, tileTrioScoreLimit);
19+
} while (!res);
20+
21+
Catan.Generator.Harbor.generate(map);
22+
23+
return map;
24+
};
25+
526
})(Catan);

www/js/catan/js/generator/generator.land.js

Lines changed: 79 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,89 @@
22

33
Catan.Generator.Land = {};
44

5-
Catan.Generator.Land.generate = function (canvas, tileTrioScoreLimit) {
6-
tileTrioScoreLimit = tileTrioScoreLimit || 12;
5+
Catan.Generator.Land.generate = function (map) {
6+
var allowedLands;
7+
// init map with random lands
8+
var lands = [
9+
Catan.T.Hills, Catan.T.Hills, Catan.T.Hills,
10+
Catan.T.Pasture, Catan.T.Pasture, Catan.T.Pasture, Catan.T.Pasture,
11+
Catan.T.Mountains, Catan.T.Mountains, Catan.T.Mountains,
12+
Catan.T.Fields, Catan.T.Fields, Catan.T.Fields, Catan.T.Fields,
13+
Catan.T.Forest, Catan.T.Forest, Catan.T.Forest, Catan.T.Forest,
14+
Catan.T.Desert
15+
];
716

8-
var lands, res, map;
17+
Catan.Tools.shuffle(lands);
18+
map.each(function (i, j) {
19+
map.get(i, j).land = lands.pop();
20+
});
921

10-
do {
11-
map = new Catan.Map(7, 7, new Catan.Position(3, 3));
12-
do {
13-
lands = map.generateLands();
14-
} while (lands.length > 0);
22+
// unset same lands neighbours
23+
var emptySpots = [];
24+
map.each(function (i, j) {
25+
var a;
26+
var b;
27+
map.eachConsecutiveNeighbour(i, j, function (a, b) {
28+
return (a.land == b.land && a.land != Catan.T.Empty && a.land !== undefined);
29+
}, function (ax, ay, bx, by) {
30+
a = map.get(ax, ay);
31+
b = map.get(bx, by);
32+
lands.push(a.land);
33+
a.land = undefined;
34+
emptySpots.push(a.position);
35+
});
36+
});
1537

16-
res = map.generateNumbers(tileTrioScoreLimit);
17-
} while (!res);
38+
// repush as much lands as possible
39+
var newEmptySpots = [];
40+
Catan.Tools.shuffle(emptySpots);
41+
Catan.Tools.shuffle(lands);
1842

19-
map.generateHarbors();
43+
for (var i = 0; i < emptySpots.length; ++i) {
44+
allowedLands = map.getAllowedLands(emptySpots[i].column, emptySpots[i].line, lands);
2045

21-
Catan.UI.drawMap(map, canvas);
22-
return map;
46+
if (allowedLands.length > 0) {
47+
map.get(emptySpots[i].column, emptySpots[i].line).land = allowedLands[0];
48+
lands = Catan.Tools.removeOne(lands, allowedLands[0]);
49+
} else {
50+
newEmptySpots.push(emptySpots[i]);
51+
}
52+
}
53+
emptySpots = newEmptySpots;
54+
55+
// swap as much as possible
56+
var allLands;
57+
var swapped = false;
58+
var eachSwapFunction = function (i, j) {
59+
if (!swapped && !(i == ex && j == ey) && Catan.Tools.contains(allowedLands, map.get(i, j).land)) {
60+
var currentAllowedLands = map.getAllowedLands(i, j, allLands);
61+
for (var t = 0; t < lands.length && !swapped; t++) {
62+
if (map.get(i, j).land != lands[t] && Catan.Tools.contains(currentAllowedLands, lands[t])) {
63+
// set empty spot land to current.land
64+
map.get(ex, ey).land = map.get(i, j).land;
65+
// set current land to land[t]
66+
map.get(i, j).land = lands[t];
67+
// remove land[t] from land
68+
lands = Catan.Tools.removeOne(lands, lands[t]);
69+
// set item swapped
70+
swapped = true;
71+
}
72+
}
73+
}
74+
};
75+
76+
for (var cur = 0; cur < emptySpots.length; ++cur) {
77+
var ex = emptySpots[cur].column;
78+
var ey = emptySpots[cur].line;
79+
allLands = [Catan.T.Hills, Catan.T.Pasture, Catan.T.Mountains, Catan.T.Fields, Catan.T.Forest, Catan.T.Desert];
80+
allowedLands = map.getAllowedLands(ex, ey, allLands);
81+
// if smth is allowed
82+
if (allowedLands.length > 0) {
83+
swapped = false;
84+
map.each(eachSwapFunction);
85+
}
86+
}
87+
88+
return lands;
2389
};
2490
})(Catan);

www/js/catan/js/generator/generator.map.js

Lines changed: 0 additions & 24 deletions
This file was deleted.

0 commit comments

Comments
 (0)