define(['sugar-web/activity/activity', "webL10n", 'activity/Board', 'activity/vanilla-state', 'activity/patterns', 'activity/shadeColor','sugar-web/env'], function (activity, l10n, Board, State, patterns, shadeColor, env) { requirejs(['domReady!'], function (doc) { activity.setup(); env.getEnvironment(function(err, environment) { var defaultLanguage = (typeof chrome != 'undefined' && chrome.app && chrome.app.runtime) ? chrome.i18n.getUILanguage() : navigator.language; var language = environment.user ? environment.user.language : defaultLanguage; l10n.language.code = language; window.addEventListener('localized', function () { activity.getXOColor(function (err, color) { var dataStore = activity.getDatastoreObject(); main(Board, State, patterns, color, shadeColor, l10n, dataStore); }); }); }); }); }); function main(Board, State, patterns, color, shadeColor, l10n, dataStore) { var state = new State({ boardState: [], generation: 0, playPauseIcon: 'play', shouldPlay: false }); var randomPattern = patterns[0], gliderPattern = patterns[1], noPattern = patterns[2], blankPattern = patterns[3]; var target = document.querySelector('.main canvas'); var board = new Board(state.state.boardState, color.fill, '#FBF6F5', shadeColor(color.stroke, 10), color.stroke, 12, 12, 2, 2, target); document.querySelector('.generation-count').style.color = color.fill; document.querySelector('.generation-status').style.color = color.fill; document.querySelector('.generation-status').innerText = l10n.get('Generation'); board.draw(); var storeLocally = function storeLocally(state) { dataStore.setDataAsText({ boardState: state.boardState, generation: state.generation }); console.log('writing'); dataStore.save(function (err) { if (err) { console.log('writing failed.'); console.error(err); } else { console.log('writing saved.'); } }); }; var generateGeneration = function generateGeneration() { if (state.state.shouldPlay) { var nextGenerationBoard = state.state.boardState.map(function (row, y) { return row.map(function (cell, x) { return transformCellByRule(cell, findNeighbours(x, y)); }); }); state.set(function (prev) { return { boardState: nextGenerationBoard, generation: prev.generation + 1 }; }); setTimeout(generateGeneration, 100); } else { return 0; } }; var transformCellByRule = function transformCellByRule(cell, neighbours) { var cellIsAlive = cell === 1 || cell === 2; var aliveInNeighbour = neighbours.filter(function (cell) { return cell === 1 || cell === 2; }); var numOfAliveNeighbours = aliveInNeighbour.length; if (cellIsAlive) { if (numOfAliveNeighbours < 2) { return 0; } else if (numOfAliveNeighbours === 2 || numOfAliveNeighbours === 3) { return 1; } else { return 0; } } else { if (numOfAliveNeighbours === 3) { return 2; } else { return 0; } } }; var findNeighbours = function findNeighbours(x, y) { var leftX = x - 1 === -1 ? 49 : x - 1; var rightX = x + 1 === 50 ? 0 : x + 1; var topY = y - 1 === -1 ? 29 : y - 1; var bottomY = y + 1 === 30 ? 0 : y + 1; var boardState = state.state.boardState; var left = boardState[y][leftX]; var right = boardState[y][rightX]; var top = boardState[topY][x]; var bottom = boardState[bottomY][x]; var leftTop = boardState[topY][leftX]; var leftBottom = boardState[bottomY][leftX]; var rightTop = boardState[topY][rightX]; var rightBottom = boardState[bottomY][rightX]; return [left, right, top, bottom, leftTop, leftBottom, rightTop, rightBottom]; }; state.subscribe({ boardState: ['.fake-selector', function (fakeElem, value, prevValue) { board.update(value); }], generation: ['.generation-count', 'innerText'], playPauseIcon: ['#play-pause', function (elem, value, prevValue) { elem.className = value + ' toolbutton'; }], shouldPlay: ['.fake-selector', function (fakeElem, value, prevValue) { if (value) { generateGeneration(); } }] }); dataStore.loadAsText(function (err, metadata, data) { var boardState = data ? data.boardState : randomPattern(); var generation = data ? data.generation : 0; state.set({ boardState: boardState, generation: parseInt(generation) }); }); board.onClick(function (cellX, cellY) { state.set(function (prev) { var newState = [].concat(prev.boardState); var clickedCell = newState[cellY][cellX] if (clickedCell === 1 || clickedCell === 2) { newState[cellY][cellX] = 0; } else { newState[cellY][cellX] = 2; } return { boardState: newState }; }); }); document.querySelector('#play-pause').addEventListener('click', function () { state.set(function (prev) { var iconToSet = prev.playPauseIcon === 'play' ? 'pause' : 'play'; var togglePlay = prev.shouldPlay === true ? false : true; if (prev.shouldPlay) { storeLocally({ boardState: state.state.boardState, generation: state.state.generation }); } return { playPauseIcon: iconToSet, shouldPlay: togglePlay }; }); }); document.querySelector('#stop-button').addEventListener('click', function() { storeLocally({ boardState: state.state.boardState, generation: state.state.generation }); }) document.querySelector('#random').addEventListener('click', function () { state.set({ boardState: randomPattern(), generation: 0 }); }); document.querySelector('#glider').addEventListener('click', function () { state.set({ boardState: glider(), generation: 0 }); }); document.querySelector('#no').addEventListener('click', function () { state.set({ boardState: no(), generation: 0 }); }); document.querySelector('#clear').addEventListener('click', function () { state.set({ boardState: blankPattern(), generation: 0, playPauseIcon: 'play', shouldPlay: false }); }); window.addEventListener('resize', function (e) { board.handleResize(window.innerWidth, state.state.boardState); }); board.handleResize(window.innerWidth, state.state.boardState); }