define([ "sugar-web/activity/activity", "sugar-web/env", "sugar-web/graphics/icon", "webL10n", "sugar-web/graphics/presencepalette", "toolpalette", "humane" ], function (activity, env, icon, webL10n, presencepalette, toolpalette, humane) { // Manipulate the DOM only when it is ready. requirejs(['domReady!'], function (doc) { activity.setup(); // initiating the level palette (for easy/ medium/ hard) var levelButton = document.getElementById("level-button"); var levels = [ {"id": 1, "title": webL10n.get("easy")}, {"id": 2, "title": webL10n.get("medium")}, {"id": 3, "title": webL10n.get("hard")} ]; levelpalette = new toolpalette.FilterPalette(levelButton, undefined); levelpalette.setCategories(levels); levelpalette.addEventListener('filter', function () { setLevel(levelpalette.getFilter()); levelpalette.popDown(); }); // initiating the filter palette (for add/ sub/ multiplication) var filterButton = document.getElementById("filter-button"); var filter = [ {"id": 1, "title": "+"}, {"id": 2, "title": "-"}, {"id": 3, "title": "x"}, {"id": 4, "title": "+ / x / -"} ]; fpalette = new toolpalette.FilterPalette(filterButton, undefined); fpalette.setCategories(filter); fpalette.addEventListener('filter', function () { setOperation(fpalette.getFilter()); fpalette.popDown(); }); // initializing network palette // Link presence palette var presence = null; var isHost = false; var networkpalette = new presencepalette.PresencePalette(document.getElementById("network-button"), undefined); networkpalette.addEventListener('shared', function () { networkpalette.popDown(); presence = activity.getPresenceObject(function (error, network) { if (error) { console.log("Sharing error"); return; } network.createSharedActivity('org.sugarlabs.SprintMath', function (groupId) { console.log("Activity shared"); // disable toolbar buttons functionally hidetoolbarbuttons(); isHost = true; }); network.onDataReceived(onNetworkDataReceived); network.onSharedActivityUserChanged(onNetworkUserChanged); }); }); // Initialize the activity. var play = false; // whether the game is playing (True) or ended (False) var score; // score of the user in the game var action; // instance of the interval var time; // time remaining in the game var questions = []; // array to hold all 200 random questions var questionNumber = 0; // index of current question var gameLevel = "easy"; // game level (easy/med/hard) var gameOperation = 1; // game operation (add/sub/multiply) var gameOverMessages = []; // in case of presence stores all game over messages var gamePlaying = []; // in case of presence stores all users that are playing var restart= false; // function to hide a particular DOM element function hide(Id) { document.getElementById(Id).style.display = "none"; } // function to show a particular DOM element function show(Id) { document.getElementById(Id).style.display = "block"; } // function to run when game over function gameOver() { clearInterval(action); document.getElementById("timeremaining").innerHTML = 60; hide("time"); hide("correct"); hide("score"); hide("wrong"); hide("box1"); hide("box2"); hide("box3"); hide("box4"); show("gameOver"); setGameOverMessage(); play = false; restart= true; if(!play && presence && isHost){ hidetoolbarbuttons(); } } // to set game over message after game is finished function setGameOverMessage() { if (presence) { presence.sendMessage(presence.getSharedInfo().id, { user: presence.getUserInfo(), content: { action: 'gameover', data: score } }); gameOverMessages.push({"user": currentenv.user, "score": score}); showAllUserScores(); } else { document.getElementById("gameOver").innerHTML = webL10n.get("GameOver", { name: currentenv.user.name, score: score }); document.getElementById("gameOver").style.backgroundColor = currentenv.user.colorvalue.stroke; document.getElementById("gameOver").style.color = currentenv.user.colorvalue.fill; } document.getElementById("question").innerHTML = ''; for (var i = 1; i < 5; i++) { document.getElementById("box" + i).innerHTML = ''; } } // to show all presence user scores function showAllUserScores() { var div = document.createElement("div"); for (i = 0; i < gameOverMessages.length; i++) { var div_child = document.createElement("div"); div_child.innerHTML = webL10n.get("GameOver", { name: gameOverMessages[i].user.name, score: gameOverMessages[i].score }); div_child.style.backgroundColor= gameOverMessages[i].user.colorvalue.stroke; div_child.style.color= gameOverMessages[i].user.colorvalue.fill; div.appendChild(div_child) } for (i=0;i= y) { currentAns = x - y; currentQues = x + "-" + y; } else { currentAns = y - x; currentQues = y + "-" + x; } } else { currentAns = x * y; currentQues = x + "x" + y; } var choices = [currentAns]; for (var j = 1; j < 4; j++) { var wrongans; do { if (gameOperation === 1 || gameOperation === 2) wrongans = (1 + Math.round((levelFactor + levelFactor) * Math.random())); else wrongans = (1 + Math.round((levelFactor * levelFactor) * Math.random())); } while (choices.indexOf(wrongans) > -1); choices.push(wrongans); } shuffleArray(choices); questions.push({ "question": currentQues, "answer": currentAns, "choices": choices }) } if(presence && isHost){ presence.sendMessage(presence.getSharedInfo().id, { user: presence.getUserInfo(), content: { action: 'init', data: questions, gameover: gameOverMessages, gameplaying: gamePlaying } }); } displayCurrentQuestion(); } // shuffle array function shuffleArray(array) { for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = array[i]; array[i] = array[j]; array[j] = temp; } } // set current question (will set the current question in the html DOM) function displayCurrentQuestion() { var CurrentQues = questions[questionNumber].question; var choices = questions[questionNumber].choices; // display question document.getElementById("question").innerHTML = CurrentQues; // display answers for (var i = 1; i < 5; i++) { document.getElementById("box" + i).innerHTML = choices[i - 1]; } } document.getElementById("restart-button").onclick = startGame; // Sugar functions document.getElementById("stop-button").addEventListener('click', function (event) { console.log("writing..."); object_store = { "play": play, "score": score, "timeremaining": time, "questions": questions, "questionNumber": questionNumber, "gameLevel": gameLevel, "gameOperation": gameOperation }; var jsonData = JSON.stringify(object_store); activity.getDatastoreObject().setDataAsText(jsonData); activity.getDatastoreObject().save(function (error) { if (error === null) { console.log("write done."); } else { console.log("write failed."); } }); }); env.getEnvironment(function (err, environment) { currentenv = environment; var fill = currentenv.user.colorvalue.fill; var stroke = currentenv.user.colorvalue.stroke; setColor(fill, stroke); var defaultLanguage = (typeof chrome != 'undefined' && chrome.app && chrome.app.runtime) ? chrome.i18n.getUILanguage() : navigator.language; var language = environment.user ? environment.user.language : defaultLanguage; webL10n.language.code = language; // Load from datastore if (!environment.objectId) { startGame(); } else { activity.getDatastoreObject().loadAsText(function (error, metadata, data) { if (error == null && data != null) { stored_data = JSON.parse(data); play = stored_data.play; score = stored_data.score; time = stored_data.timeremaining; questions = stored_data.questions; questionNumber = stored_data.questionNumber; gameLevel = stored_data.gameLevel; gameOperation = stored_data.gameOperation; if (play && time>0) { resumeGame() } else { startGame() } } else { console.log(error); } }); } if (environment.sharedId) { // disable toolbar buttons functionally hidetoolbarbuttons(); presence = activity.getPresenceObject(function (error, network) { network.onDataReceived(onNetworkDataReceived); network.onSharedActivityUserChanged(onNetworkUserChanged); }); } }); window.addEventListener("localized", function () { // Set current language to Sugarizer document.getElementById("timeString").innerHTML = webL10n.get("Time"); document.getElementById("scoreString").innerHTML = webL10n.get("Score"); document.getElementById("correct").innerHTML = webL10n.get("correct"); document.getElementById("wrong").innerHTML = webL10n.get("wrong"); var levels = [ {"id": 1, "title": webL10n.get("easy")}, {"id": 2, "title": webL10n.get("medium")}, {"id": 3, "title": webL10n.get("hard")} ]; levelpalette.setCategories(levels); }); // network callback var onNetworkDataReceived = function (msg) { if (presence.getUserInfo().networkId === msg.user.networkId) { return; } switch (msg.content.action) { case 'init': if(gamePlaying.length===0) { questions = msg.content.data; gameOverMessages = msg.content.gameover; gamePlaying = msg.content.gameplaying; startGame(); } break; case 'adduser': // add user gamePlaying= msg.content.data; showAllUserScores(); break; case 'removeuser': // remove user gamePlaying= msg.content.data; if(gamePlaying.length===0 && isHost) showtoolbarbuttons(); showAllUserScores(); break; case 'gameover': // remove user from playing array gamePlaying = gamePlaying.filter(function (user) { return user.name !== msg.user.name }); if (presence) { presence.sendMessage(presence.getSharedInfo().id, { user: presence.getUserInfo(), content: { action: 'removeuser', data: gamePlaying } }); } // add user in game over array gameOverMessages.push({"user": msg.user, "score": msg.content.data}); showAllUserScores(); break; } }; var onNetworkUserChanged = function (msg) { if (isHost) { presence.sendMessage(presence.getSharedInfo().id, { user: presence.getUserInfo(), content: { action: 'init', data: questions, gameover: gameOverMessages, gameplaying: gamePlaying } }); if(msg.move === 1) { gamePlaying.push(msg.user); adduser(); } if(msg.move===-1) { gamePlaying = gamePlaying.filter(function (user) { return user.name !== msg.user.name }); removeuser(); } showAllUserScores(); } var userName = msg.user.name.replace('<', '<').replace('>', '>'); if(msg.move === 1){ humane.log(webL10n.get("joined", { name: userName })); }else{ humane.log(webL10n.get("left", { name: userName })); } }; function adduser() { presence.sendMessage(presence.getSharedInfo().id, { user: presence.getUserInfo(), content: { action: 'adduser', data: gamePlaying } }); } function removeuser() { presence.sendMessage(presence.getSharedInfo().id, { user: presence.getUserInfo(), content: { action: 'removeuser', data: gamePlaying } }); } // function to set color theme based on User Colors function setColor(fill, stroke) { // set colors based on user stroke and fill colors document.getElementById("box1").style.backgroundColor = stroke; document.getElementById("box2").style.backgroundColor = stroke; document.getElementById("box3").style.backgroundColor = stroke; document.getElementById("box4").style.backgroundColor = stroke; // dynamically change the font color between white and black based on the fill and stroke colors // to provide better user experience if (tinycolor(stroke).isLight()) { document.getElementById("choices").style.color = "black"; // document.getElementById("time_score_container").style.color = "black"; } else { document.getElementById("choices").style.color = "white"; // document.getElementById("time_score_container").style.color = "white"; } document.getElementById("container").style.color = fill; } // set level function setLevel(e) { var level = gameLevel; if (e === 1) { level = "easy"; } else if (e === 2) { level = "medium"; } else if (e === 3) { level = "hard"; } if (gameLevel !== level) { gameLevel = level; startGame(); } } // set operation function setOperation(e) { if (gameOperation !== e) { gameOperation = e; startGame(); } } // show toolbar buttons function showtoolbarbuttons() { // enable toolbar buttons functionally document.getElementById("restart-button").disabled = false; document.getElementById("filter-button").disabled = false; document.getElementById("level-button").disabled = false; document.getElementById("network-button").disabled = false; // enable toolbar buttons visually document.getElementById("restart-button").classList.remove('disabled'); document.getElementById("filter-button").classList.remove('disabled'); document.getElementById("level-button").classList.remove('disabled'); document.getElementById("network-button").classList.remove('disabled'); } // hide toolbar buttons function hidetoolbarbuttons() { // disable toolbar buttons functionally document.getElementById("restart-button").disabled = true; document.getElementById("filter-button").disabled = true; document.getElementById("level-button").disabled = true; document.getElementById("network-button").disabled = true; // disable toolbar buttons visually document.getElementById("restart-button").classList.add('disabled'); document.getElementById("filter-button").classList.add('disabled'); document.getElementById("level-button").classList.add('disabled'); document.getElementById("network-button").classList.add('disabled'); } }); });