217 lines
No EOL
7.7 KiB
JavaScript
217 lines
No EOL
7.7 KiB
JavaScript
//
|
|
// 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();
|
|
}); |