5 var scheduledDirections = new Array;
8 var linkComponent = Qt.createComponent("content/Link.qml"); // XXX should resolve relative to script, not component
9 var cookieComponent = Qt.createComponent("content/Cookie.qml");
13 var waitForCookie = 0;
15 var skullMovementsBeforeDirectionChange = 0;
20 return (Math.floor(Math.random() * n));
23 function scheduleDirection(dir)
25 if (state == "starting") {
27 headDirection = direction;
28 head.rotation = headDirection;
29 } else if (state == "running"){
31 if(scheduledDirections[scheduledDirections.length-1]!=direction)
32 scheduledDirections.push(direction);
36 function startNewGame()
38 if (state == "starting") {
44 startNewGameTimer.running = true;
50 numRows = numRowsAvailable;
51 numColumns = numColumnsAvailable;
52 board = new Array(numRows * numColumns);
54 scheduledDirections = new Array;
57 skull.z = numRows * numColumns + 1;
59 for (var i = 0; i < numRows * numColumns; ++i) {
60 if (i < links.length) {
65 if(linkComponent.status != Component.Ready) {
66 if(linkComponent.status == Component.Error)
67 console.log(linkComponent.errorString());
69 console.log("Still loading linkComponent");
70 continue;//TODO: Better error handling?
72 var link = linkComponent.createObject(playfield);
73 link.z = numRows * numColumns + 1 - i;
74 link.type = i == 0 ? 2 : 0;
83 head.row = numRows/2 -1;
84 head.column = numColumns/2 -1;
91 startHeartbeatTimer.running = true;
98 snake[i].dying = true;
104 highScores.saveScore(lastScore);
115 if (scheduledDirections.length) {
116 dir = scheduledDirections.shift();
119 if (state == "starting") {
120 var turn = (dir - headDirection);
121 head.rotation += turn == -3 ? 1 : (turn == 3 ? -1 : turn );
127 var column = head.column;
131 } else if (dir == 1) {
133 } else if (dir == 2) {
135 } else if (dir == 3) {
139 //validate the new position
140 if (row < 0 || row >= numRows
141 || column < 0 || column >= numColumns
142 || (row == skull.row && column == skull.column)
143 || !isFree(row, column)) {
144 var turn = (dir - headDirection);
145 head.rotation += turn == -3 ? 1 : (turn == 3 ? -1 : turn );
152 if (linksToGrow > 0) {
154 newLink = links[snake.length];
155 newLink.spawned = false;
156 newLink.rotation = snake[snake.length-1].rotation;
157 newLink.type = growType;
158 newLink.dying = false;
161 var lastLink = snake[snake.length-1];
162 board[lastLink.row * numColumns + lastLink.column] = undefined;
165 if (waitForCookie > 0) {
166 if (--waitForCookie == 0)
167 createCookie(cookie? (cookie.value+1) : 1);
170 for (var i = snake.length-1; i > 0; --i) {
171 snake[i].row = snake[i-1].row;
172 snake[i].column = snake[i-1].column;
173 snake[i].rotation = snake[i-1].rotation;
177 newLink.spawned = true;
182 head.column = column;
183 board[row * numColumns + column] = head;
185 var turn = (dir - headDirection);
186 head.rotation += turn == -3 ? 1 : (turn == 3 ? -1 : turn );
189 var value = testCookie(row, column);
191 linksToGrow += value;
196 function isFree(row, column)
198 return board[row * numColumns + column] == undefined;
201 function isHead(row, column)
203 return head.column == column && head.row == row;
206 function testCookie(row, column)
208 if (cookie && !cookie.dying && cookie.row == row && cookie.column == column) {
209 var value = cookie.value;
210 waitForCookie = value;
211 growType = snake[snake.length-1].type == 1 ? 0 : 1;
213 cookie.z = numRows * numColumns + 2;
222 if (linksToDie > 0) {
224 var link = snake.pop();
226 board[link.row * numColumns + link.column] = undefined;
229 if (snake.length == 0) {
236 var column = skull.column;
237 if (isHead(row, column)) {
241 row += skull.verticalMovement;
242 column += skull.horizontalMovement;
246 while (skullMovementsBeforeDirectionChange == 0 || row < 0 || row >= numRows
247 || column < 0 || column >= numColumns
248 || (!isFree(row, column) && !isHead(row, column))) {
250 skull.verticalMovement = 0;
251 skull.horizontalMovement = 0;
252 skullMovementsBeforeDirectionChange = rand(20)+1;
254 skull.verticalMovement = -1
256 skull.horizontalMovement = -1;
258 skull.verticalMovement = 1
260 skull.horizontalMovement = 1;
262 var rd = cookie.row - skull.row;
263 var rc = cookie.column - skull.column;
264 if (Math.abs(rd) > Math.abs(rc)) {
265 skull.verticalMovement = rd > 0 ? 1 : -1;
266 skullMovementsBeforeDirectionChange = Math.abs(rd);
268 skull.horizontalMovement= rc > 0 ? 1 : -1;
269 skullMovementsBeforeDirectionChange = Math.abs(rc);
272 row = skull.row + skull.verticalMovement;
273 column = skull.column + skull.horizontalMovement;
279 skull.column = column;
280 --skullMovementsBeforeDirectionChange;
281 var value = testCookie(row, column);
283 linksToDie += value/2;
285 if (isHead(row, column))
289 function createCookie(value) {
290 if (numRows * numColumns - snake.length < 10)
293 var column = rand(numColumns);
294 var row = rand(numRows);
295 while (!isFree(row, column)) {
297 if (column == numColumns) {
305 if(cookieComponent.status != Component.Ready) {
306 if(cookieComponent.status == Component.Error)
307 console.log(cookieComponent.errorString());
309 console.log("Still loading cookieComponent");
310 return;//TODO: Better error handling?
312 cookie = cookieComponent.createObject(head.parent);
313 cookie.value = value;
315 cookie.column = column;