// // trivia.js // // Created by Rebecca Stankus on 06/11/18 // Copyright 2018 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html /* global EventBridge, AccountServices Script, Xform */ (function() { var CARD_YELLOW = { blue: 66, green: 255, red: 227 }; var SQUARE_YELLOW = { blue: 0, green: 167, red: 179 }; var SQUARE_BLUE = { blue: 237, green: 68, red: 26 }; var SQUARE_GREEN = { blue: 43, green: 161, red: 27 }; var SQUARE_PINK = { blue: 97, green: 0, red: 158 }; var SELECT_SOUND = SoundCache.getSound(Script.resolvePath("assets/sounds/bingoSelect.wav")); var DESELECT_SOUND = SoundCache.getSound(Script.resolvePath("assets/sounds/bingoDeselect.wav")); var GET_CARD_SOUND = SoundCache.getSound(Script.resolvePath("assets/sounds/bingoWish.wav")); var SELECT_AUDIO_VOLUME = 0.1; var BINGO_STRING = "BINGO"; var COLUMN_RANGE = 15; var _this; var injector; var cardOverlay; var playingEntity; var doneButtonOverlay; var bingoButtonOverlay; var bingoHeaderSquares = []; var bingoNumberSquares = []; var userCardNumbers = []; var rowMinimum; var flashingInterval; var spreadsheetURL; var userName; var canClick = true; var isRunningStandaloneBingoApp = function() { var _standaloneScriptName = 'card.js'; var isRunning = false; ScriptDiscoveryService.getRunning().forEach(function(script){ if (script.name === _standaloneScriptName) { isRunning = true; } }); return isRunning; }; var BingoCardSpawner = function() { _this = this; }; BingoCardSpawner.prototype = { preload: function(entityID){ _this.entityID = entityID; spreadsheetURL = "https://script.google.com/macros/s/AKfycbzFuuJ30c_qUZmBB8PnjLtunaJx1VbhSRFjsy_6wocR2_p7wohJ/exec"; }, endGame: function() { Entities.deleteEntity(playingEntity); ScriptDiscoveryService.stopScript(Script.resolvePath('./card/card.js')); canClick = true; }, encodeURLParams: function (params) { var paramPairs = []; for (var key in params) { paramPairs.push(key + "=" + params[key]); } return paramPairs.join("&"); }, mousePressOnEntity: function(id, event) { if (event.isLeftButton && canClick) { userName = AccountServices.username; canClick = false; _this.playSound(GET_CARD_SOUND, 1.0, true); var entitySpawnPosition = MyAvatar.position; var yPositionOverHead = entitySpawnPosition.y + 0.5 * MyAvatar.getHeight() + 0.1; entitySpawnPosition.y = yPositionOverHead; playingEntity = Entities.addEntity({ name: "Playing Bingo", collisionless: true, color: CARD_YELLOW, alpha: 0.7, dimensions: { x: 0.1, y: 0.1, z: 0.1 }, position: entitySpawnPosition, grabbable: false, parentID: MyAvatar.sessionUUID, shape: "Cube", type: "Box", userData: "{ \"grabbableKey\": { \"grabbable\": false } }" }, true); var searchParamString = this.encodeURLParams({ type: "search", username: userName }); var searchRequest = new XMLHttpRequest(); searchRequest.open('GET', spreadsheetURL + "?" + searchParamString); searchRequest.timeout = 10000; searchRequest.ontimeout = function() { print("bingo: request timed out"); }; searchRequest.onreadystatechange = function() { if (searchRequest.readyState === 4) { if (searchRequest.response === "New username") { _this.createCard(true); } else if (searchRequest.response) { var userNumbersToSplit = searchRequest.response.substring(2, searchRequest.response.length - 2); userCardNumbers = userNumbersToSplit.split(","); } if (!isRunningStandaloneBingoApp()) { ScriptDiscoveryService.loadScript(Script.resolvePath('./card/card.js')); } } }; searchRequest.send(); canClick = true; } }, createCard: function() { rowMinimum = 1; for (var i = 0; i < BINGO_STRING.length; i++) { var rows = 5; for (var currentRow = 0; currentRow < rows; currentRow++) { _this.getRandomNumber(); } rowMinimum += COLUMN_RANGE; } _this.storeUser(); }, storeUser: function() { print(userCardNumbers); var addParamString = _this.encodeURLParams({ type: "add", username: userName, cardNumbers: JSON.stringify(userCardNumbers) }); // print(spreadsheetURL + "?" + paramString); var addRequest = new XMLHttpRequest(); addRequest.open('GET', spreadsheetURL + "?" + addParamString); addRequest.timeout = 10000; addRequest.ontimeout = function() { print("bingo: request timed out"); }; addRequest.onreadystatechange = function() { if (addRequest.readyState === 4) { print(addRequest.response); } }; addRequest.send(); }, contains: function(array, number) { for (var i = 0 ; i < array.length; i++) { if (array[i] === number) { return true; } } return false; }, getRandomNumber: function() { // var randomNumber = Math.floor(Math.random() * (parseInt(range) + 1) + parseInt(minimum)); var randomNumber = Math.floor(Math.random() * Number(COLUMN_RANGE) + Number(rowMinimum)); // print("range as a number is ", Number(COLUMN_RANGE)); // print("random number is ", randomNumber, " ...checking if it is already chosen"); if (!_this.contains(userCardNumbers, randomNumber)) { print(randomNumber); userCardNumbers.push(randomNumber); return randomNumber; } return _this.getRandomNumber(); }, playSound: function(sound, volume, localOnly) { // print(JSON.stringify(sound)); if (sound.downloaded) { if (injector) { injector.stop(); } injector = Audio.playSound(sound, { position: MyAvatar.position, volume: volume, localOnly: localOnly }); } }, unload: function() { _this.endGame(); } }; return new BingoCardSpawner(); });