content/hifi-content/liv/dev/Bingo/bingoCardSpawner.js
2022-02-14 02:04:11 +01:00

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();
});