(function() { var GAMES_LIST_ENDPOINT = "https://hifi-content.s3.amazonaws.com/james/gametable-dev/game_list.json"; var _this; var INITIAL_DELAY = 1000; function GameTable() { _this = this; } GameTable.prototype = { matCorner: null, currentGameIndex: 0, count: 0, preload: function(entityID) { _this.entityID = entityID; //get userdata in case other players had change its state var userData = _this.getCurrentUserData(); if (userData.hasOwnProperty('gameTable') && userdata.gameTable.hasOwnProperty('currentGame') && userdata.gameTable.hasOwnProperty('currentGameIndex')) { _this.currentGameIndex = userData.gameTable.currentGameIndex; _this.currentGame = userData.gameTable.currentGame; } Script.setTimeout(function() { _this.setCurrentGamesList(); }, INITIAL_DELAY); }, collisionWithEntity: function(me, other, collision) { //stick the table to the ground if (collision.type !== 1) { return; } var myProps = Entities.getEntityProperties(_this.entityID, ["rotation", "position"]); var eulerRotation = Quat.safeEulerAngles(myProps.rotation); eulerRotation.x = 0; eulerRotation.z = 0; var newRotation = Quat.fromVec3Degrees(eulerRotation); //we zero out the velocity and angular velocity so the table doesn't change position or spin Entities.editEntity(_this.entityID, { rotation: newRotation, dynamic: false, velocity: { x: 0, y: 0, z: 0 }, angularVelocity: { x: 0, y: 0, z: 0 } }); }, setInitialGameIfNone: function() { var userData = _this.getCurrentUserData(); if (userData.hasOwnProperty('gameTable') !== true || userData.gameTable.hasOwnProperty('currentGame') !== true) { print('userdata has no gameTable or no currentGame'); _this.setCurrentGame(); _this.cleanupGameEntities(); print('i set the game and reset the game'); } else { print('already has game'); } }, resetGame: function() { print('jbp RESET GAME on gameTable'); //get userdata in case other players had change its state var userData = _this.getCurrentUserData(); if (userData.hasOwnProperty('gameTable') && userData.gameTable.hasOwnProperty('currentGame') && userData.gameTable.hasOwnProperty('currentGameIndex')) { _this.currentGameIndex = userData.gameTable.currentGameIndex; _this.currentGame = userData.gameTable.currentGame; } _this.cleanupGameEntities(); }, nextGame: function() { print('jbp NEXT GAME on gameTable'); //get userdata in case other players had change its state var userData = _this.getCurrentUserData(); if (userData.hasOwnProperty('gameTable') && userData.gameTable.hasOwnProperty('currentGame') && userData.gameTable.hasOwnProperty('currentGameIndex')) { _this.currentGameIndex = userData.gameTable.currentGameIndex; _this.currentGame = userData.gameTable.currentGame; } _this.currentGameIndex++; if (typeof _this.gamesList === "undefined") { _this.setCurrentGamesList(); } if (_this.currentGameIndex >= _this.gamesList.length) { _this.currentGameIndex = 0; } _this.cleanupGameEntities(); }, cleanupGameEntities: function() { var matchedPiece = "hifi:gameTable:piece:" + _this.currentGame; print('jbp should cleanup game entities for:: ' + _this.currentGame); var props = Entities.getEntityProperties(_this.entityID); var results = Entities.findEntities(props.position, 10); var found = []; results.forEach(function(item) { var itemProps = Entities.getEntityProperties(item); if (itemProps.description === matchedPiece) { found.push(item); print('found a matching piece, pushing'); } if (itemProps.description.indexOf('hifi:gameTable:anchor') > -1) { found.push(item); print('found a matching piece, pushing'); } }); found.forEach(function(foundItem) { print('deleting matching piece'); Entities.deleteEntity(foundItem); }); _this.setCurrentGame(); //_this.spawnEntitiesForGame(); }, setCurrentGamesList: function() { var gamesList = getGamesList(); _this.gamesList = gamesList; print('set gameslist to: ' + JSON.stringify(gamesList)); _this.setInitialGameIfNone(); }, setCurrentGame: function() { if (typeof _this.gamesList === 'undefined') { _this.setCurrentGamesList(); } _this.currentGame = _this.gamesList[_this.currentGameIndex].gameName; _this.currentGameFull = _this.gamesList[_this.currentGameIndex]; print('setCurrentGame: ' + _this.currentGameIndex + " " + _this.currentGame); _this.setCurrentUserData({ currentGame: _this.currentGame, currentGameIndex: _this.currentGameIndex }); _this.spawnEntitiesForGame(); }, setCurrentUserData: function(data) { var userData = _this.getCurrentUserData(); userData.gameTable = data; //print("WRITING USER DATA: " + JSON.stringify(userData)); var success = Entities.editEntity(_this.entityID, { userData: JSON.stringify(userData), }); var afterUserData = _this.getCurrentUserData(); //print("AFTER WRITE, USER DATA: " + JSON.stringify(afterUserData)); }, getCurrentUserData: function() { var props = Entities.getEntityProperties(_this.entityID); var hasUserData = props.hasOwnProperty('userData'); print('has user data??' + hasUserData); print('userData is:: ' + props.userData); var json = {}; try { json = JSON.parse(props.userData); } catch (e) { print('user data is not json' + props.userData); } return json; }, getEntityFromGroup: function(groupName, entityName) { print('getting entity from group: ' + groupName); var props = Entities.getEntityProperties(_this.entityID); var results = Entities.findEntities(props.position, 7.5); var found; var result = null; results.forEach(function(item) { var itemProps = Entities.getEntityProperties(item); var descriptionSplit = itemProps.description.split(":"); if (descriptionSplit[1] === groupName && descriptionSplit[2] === entityName) { result = item; } }); print('result returned ought to be: ' + result); return result; }, spawnEntitiesForGame: function() { print('jbp should spawn entities for game. count: ' + this.count); var entitySpawner = _this.getEntityFromGroup('gameTable', 'entitySpawner'); var props = Entities.getEntityProperties(_this.entityID); var mat = _this.getEntityFromGroup('gameTable', 'mat'); Entities.callEntityMethod(entitySpawner, 'spawnEntities', [JSON.stringify(_this.currentGameFull), mat, _this.entityID]); this.count++; return; }, }; function getGamesList() { var request = new XMLHttpRequest(); request.open("GET", GAMES_LIST_ENDPOINT, false); request.send(); var response = JSON.parse(request.responseText); print('got gamesList' + request.responseText); return response; } return new GameTable(); })