Skip to content
Permalink
Newer
Older
100644 229 lines (204 sloc) 6.34 KB
September 10, 2013 22:24
1
2
// Main app class
3
enyo.kind({
4
name: "LOLGameApp",
5
kind: enyo.Control,
6
published: {size: 13, level: 1, count: 13, activity: null},
September 10, 2013 22:24
7
components: [
8
{classes: "playboard", components:[
9
{name: "player", classes: "player-image"},
10
{name: "box", classes: "lol-box", components: [
September 10, 2013 22:24
11
]},
12
{name: "computer", classes: "computer-image"}
September 10, 2013 22:24
13
]},
14
{name: "playbutton", kind: "Image", src: "icons/play.png", classes: "play", ontap: "doPlay", showing: false},
15
{name: "endaudio", kind: "HTML5.Audio", preload: "auto", autobuffer: true, controlsbar: false},
16
{name: "endmessage", content: "", showing: false, classes: "end-message"}
September 10, 2013 22:24
17
],
18
19
// Constructor
20
create: function() {
21
this.inherited(arguments);
22
this.init();
23
},
24
25
// Init game
26
init: function() {
27
// Init game context
28
this.game = new LOLGame(this.count);
29
if (this.count > 0) this.player = this.game.getPlayer();
30
this.count = this.size;
September 10, 2013 22:24
31
this.selectedCount = 0;
32
33
// Init color
June 15, 2014 22:03
34
this.activity.getXOColor(function(error, colors) {console.log(colors);});
35
36
// Init level
37
document.getElementById("level-easy-button").classList.remove('active');
38
document.getElementById("level-medium-button").classList.remove('active');
39
document.getElementById("level-hard-button").classList.remove('active');
40
if (this.level == 1) document.getElementById("level-easy-button").classList.add('active');
41
else if (this.level == 2) document.getElementById("level-medium-button").classList.add('active');
42
else if (this.level == 3) document.getElementById("level-hard-button").classList.add('active');
September 10, 2013 22:24
44
// Draw board
45
this.drawBoard();
46
},
47
48
// Redraw the board
49
drawBoard: function() {
50
// Clean board
51
this.selectedCount = 0;
52
var items = [];
53
enyo.forEach(this.$.box.getControls(), function(item) {
54
items.push(item);
55
});
56
for (var i = 0 ; i < items.length ; i++) {
57
items[i].destroy();
58
}
59
60
// Redraw board
61
for (var i = 0 ; i < this.game.getLength() ; i++) {
62
this.$.box.createComponent(
63
{ kind: "LOLItem", ontap: "selectItem" },
64
{ owner: this }
65
).render();
66
}
67
document.getElementById("switch-player-button").disabled = (this.game.getLength() != this.size);
68
this.showCurrentPlayer();
September 10, 2013 22:24
69
70
// Test end condition
71
if (this.game.endOfGame()) {
72
this.$.endmessage.addClass(this.game.getPlayer() != this.player ? "end-message-win" : "end-message-lost");
73
this.$.endmessage.removeClass(this.game.getPlayer() != this.player ? "end-message-lost" : "end-message-win");
74
this.$.endaudio.setSrc(this.game.getPlayer() != this.player ? "audio/applause.ogg" : "audio/disappointed.ogg");
75
this.$.endaudio.play();
76
this.$.endmessage.show();
September 10, 2013 22:24
77
}
78
this.$.endmessage.setShowing(this.game.endOfGame());
79
80
// Play for computer
81
if (this.game.getPlayer() != this.player && !this.game.endOfGame())
September 10, 2013 22:24
82
this.computerPlay();
83
},
84
85
// Get current level
86
getLevel: function() {
87
if (document.getElementById("level-easy-button").classList.contains('active'))
September 10, 2013 22:24
88
return 1;
89
if (document.getElementById("level-medium-button").classList.contains('active'))
September 10, 2013 22:24
90
return 2;
91
if (document.getElementById("level-hard-button").classList.contains('active'))
September 10, 2013 22:24
92
return 3;
93
return 0;
94
},
95
96
// Show the current player turn
97
showCurrentPlayer: function() {
98
if (this.player == this.game.getPlayer() && !this.game.endOfGame())
99
this.$.player.removeClass("empty-image");
100
else
101
this.$.player.addClass("empty-image");
102
if (this.player != this.game.getPlayer() && !this.game.endOfGame())
103
this.$.computer.removeClass("empty-image");
104
else
105
this.$.computer.addClass("empty-image");
106
},
107
September 10, 2013 22:24
108
// Select an item
109
selectItem: function(item) {
110
if (this.player != this.game.getPlayer())
111
return;
112
var value = item.getSelected();
113
if (this.selectedCount == 3 && !value) {
114
this.$.playbutton.show();
September 10, 2013 22:24
115
return;
116
}
September 10, 2013 22:24
117
this.selectedCount = !value ? this.selectedCount + 1 : this.selectedCount - 1;
118
item.setSelected(!value);
119
if (this.selectedCount > 0)
120
this.$.playbutton.show();
121
else
122
this.$.playbutton.hide();
September 10, 2013 22:24
123
},
124
125
// Switch player
126
switchPlayer: function() {
127
this.game.reverse();
128
this.player = this.player % 2;
129
this.drawBoard();
130
},
131
132
// Play for the player
133
doPlay: function() {
134
if (this.player != this.game.getPlayer())
135
return;
136
if (this.selectedCount == 0)
137
return;
138
this.save(this.game.play(this.selectedCount));
September 10, 2013 22:24
139
this.drawBoard();
140
this.$.playbutton.hide();
September 10, 2013 22:24
141
},
142
143
// Let's computer play
144
computerPlay: function() {
145
if (this.player == this.game.getPlayer())
146
return;
147
this.selectedCount = 0;
148
this.step = 0;
149
this.timer = window.setInterval(enyo.bind(this, "doComputer"), 400+50*this.getLevel());
150
},
151
152
// Play for the computer
153
doComputer: function() {
154
// First, think to the shot and select item
155
if (this.step == 0) {
156
this.step++;
157
var shot = this.game.think(this.getLevel());
158
var context = this;
159
enyo.forEach(this.$.box.getControls(), function(item) {
160
if (context.selectedCount < shot) {
161
item.setSelected(true);
162
context.selectedCount++;
163
}
164
});
165
this.step++;
166
}
167
168
// Then play
169
else if (this.step == 2) {
170
window.clearInterval(this.timer);
171
this.save(this.game.play(this.selectedCount));
September 10, 2013 22:24
172
this.drawBoard();
173
}
174
},
175
176
// Start a new game
177
doRenew: function() {
178
this.level = this.getLevel();
September 10, 2013 22:24
179
this.init();
180
},
181
182
// Load game from datastore
183
load: function() {
184
var datastoreObject = this.activity.getDatastoreObject();
185
var currentthis = this;
186
datastoreObject.loadAsText(function (error, metadata, data) {
187
var data = JSON.parse(data);
June 15, 2014 22:03
188
if (data == null)
189
return;
190
currentthis.size = data.size;
191
currentthis.count = data.count;
192
currentthis.level = data.level;
193
currentthis.player = data.player;
194
currentthis.init();
195
});
196
},
197
198
// Save game in datastore
199
save: function(count) {
200
var datastoreObject = this.activity.getDatastoreObject();
201
var jsonData = JSON.stringify({size: this.size, count: count, level: this.getLevel(), player: this.game.getPlayer()});
202
datastoreObject.setDataAsText(jsonData);
203
datastoreObject.save(function() {});
September 10, 2013 22:24
204
}
205
});
206
207
208
// Class for an item
209
enyo.kind({
210
name: "LOLItem",
211
kind: enyo.Control,
212
classes: "lol-item",
213
published: { selected: false },
214
215
// Constructor
216
create: function() {
217
this.inherited(arguments);
218
this.selectedChanged();
219
},
220
221
// Selection changed
222
selectedChanged: function() {
223
var className = "lol-item-selected";
224
if (this.selected)
225
this.addClass(className);
226
else
227
this.removeClass(className);
228
},
229
});