/
logic_system.js
108 lines (95 loc) · 3.7 KB
/
logic_system.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
var logicSystem = function(ecs, eventManager, gridUtil) {
var updateGrid = function(gridUpdateFunc) {
var gridsUpdated = {};
ecs.runSystemOnce(
[componentTypeEnum.GRID],
function(entity) {
var grid = entity.components[componentTypeEnum.GRID].grid;
// We update each grid only once
if (gridsUpdated[grid.id] === true)
return;
gridsUpdated[grid.id] = true;
gridUpdateFunc(grid);
});
eventManager.vent.trigger("VIEWSYSTEM:CELLS:GRID_CHANGED");
};
var refillGridEvent = function() {
updateGrid(function(grid) {
gridUtil.refillGrid(grid);
gridUtil.saveGrid(grid);
});
}
var makeMoveEvent = function(firstCell, secondCell) {
updateGrid(function(grid) {
var isMovePossible = gridUtil.check(grid, firstCell, secondCell);
if (isMovePossible) {
gridUtil.makeMove(grid, firstCell, secondCell);
gridUtil.saveGrid(grid);
if (gridUtil.checkCompleted(grid))
eventManager.vent.trigger("SYSTEM:LOGIC:GRID_COMPLETED");
}
});
};
var gridCompletedEvent = function() {
gridUtil.saveGrid(null);
var currentLevel = eventManager.vent.trigger("SYSTEM:LEVEL:GET_CURRENT_NUMBER").number;
var maxLevel = eventManager.vent.trigger("SYSTEM:LEVEL:GET_MAX_NUMBER").number;
updateGrid(function(grid) {
var newGrid = [
"Well done you have",
"completed level " + currentLevel + " of ",
"Notebook Numbers!",
];
if (currentLevel === maxLevel)
{
var newGrid = [
"Congratulations you have",
"completed Notebook Numbers!",
"You're an absolute legend!",
"Click new game to play again."
];
}
// Replace the grid without updating the reference
grid.length = 0;
Array.prototype.push.apply(grid, newGrid);
});
ecs.removeEntities("refill_grid");
};
var timerExpiredEvent = function() {
eventManager.vent.trigger("SYSTEM:CURSOR:RESET");
gridUtil.saveGrid(null);
updateGrid(function(grid) {
var newGrid = [
"Oh dear, the",
"time limit has",
"expired!",
"",
"Click the new game button",
"to play again.",
];
// Replace the grid without updating the reference
grid.length = 0;
Array.prototype.push.apply(grid, newGrid);
});
ecs.removeEntities("refill_grid");
};
var undoEvent = function(move) {
updateGrid(function(grid) {
if (move.type === moveTypes.MAKE_MOVE) {
gridUtil.undoMakeMove(grid, move);
} else if (move.type === moveTypes.REFILL_GRID) {
gridUtil.undoRefillGrid(grid, move);
} else if (move.type === moveTypes.CLEAR_LINE) {
gridUtil.undoClearLine(grid, move);
}
});
}
var initialiseEvents = function() {
eventManager.vent.on("SYSTEM:LOGIC:REFILL_GRID", refillGridEvent);
eventManager.vent.on("SYSTEM:LOGIC:MAKE_MOVE", makeMoveEvent);
eventManager.vent.on("SYSTEM:LOGIC:GRID_COMPLETED", gridCompletedEvent);
eventManager.vent.on("SYSTEM:LOGIC:UNDO", undoEvent);
eventManager.vent.on("SYSTEM:LOGIC:TIMER_EXPIRED", timerExpiredEvent);
};
initialiseEvents();
};