mirror of
https://github.com/overte-org/overte.git
synced 2025-04-06 21:52:41 +02:00
169 lines
6.3 KiB
JavaScript
169 lines
6.3 KiB
JavaScript
//
|
|
// Created by Thijs Wenker on 3/31/2017
|
|
// Copyright 2017 High Fidelity, Inc.
|
|
//
|
|
// Revision of James B. Pollack's work on GamesTable in 2016
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
//
|
|
|
|
(function() {
|
|
var GAMES_LIST_ENDPOINT = Script.resolvePath('games/gamesDirectory.svo.json');
|
|
|
|
var _this;
|
|
var INITIAL_DELAY = 1000;
|
|
|
|
function getGamesList() {
|
|
return Script.require(GAMES_LIST_ENDPOINT);
|
|
}
|
|
|
|
function GameTable() {
|
|
_this = this;
|
|
}
|
|
|
|
GameTable.prototype = {
|
|
matCorner: null,
|
|
currentGameIndex: 0,
|
|
preload: function(entityID) {
|
|
_this.entityID = entityID;
|
|
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: true,
|
|
velocity: {
|
|
x: 0,
|
|
y: 0,
|
|
z: 0
|
|
},
|
|
angularVelocity: {
|
|
x: 0,
|
|
y: 0,
|
|
z: 0
|
|
}
|
|
});
|
|
},
|
|
getCurrentGame: function() {
|
|
var userData = _this.getCurrentUserData();
|
|
if (!(userData.gameTableData !== undefined && userData.gameTableData.currentGame !== undefined)) {
|
|
_this.currentGameIndex = -1;
|
|
return;
|
|
}
|
|
var foundIndex = -1;
|
|
_this.gamesList.forEach(function(game, index) {
|
|
if (game.gameName === userData.gameTableData.currentGame) {
|
|
foundIndex = index;
|
|
}
|
|
});
|
|
_this.currentGameIndex = foundIndex;
|
|
},
|
|
setInitialGameIfNone: function() {
|
|
_this.getCurrentGame();
|
|
if (_this.currentGameIndex === -1) {
|
|
_this.setCurrentGame();
|
|
_this.cleanupGameEntities();
|
|
}
|
|
},
|
|
resetGame: function() {
|
|
// always check the current game before resetting
|
|
_this.getCurrentGame();
|
|
_this.cleanupGameEntities();
|
|
},
|
|
nextGame: function() {
|
|
// always check the current game before switching
|
|
_this.getCurrentGame();
|
|
_this.currentGameIndex = (_this.currentGameIndex + 1) % _this.gamesList.length;
|
|
_this.cleanupGameEntities();
|
|
},
|
|
cleanupGameEntities: function() {
|
|
var position = Entities.getEntityProperties(_this.entityID, 'position').position;
|
|
var results = Entities.findEntities(position, 5.0);
|
|
var found = [];
|
|
results.forEach(function(item) {
|
|
var description = Entities.getEntityProperties(item, 'description').description;
|
|
if (description.indexOf('hifi:gameTable:piece:') === 0) {
|
|
found.push(item);
|
|
}
|
|
if (description.indexOf('hifi:gameTable:anchor') > -1) {
|
|
found.push(item);
|
|
}
|
|
});
|
|
print('deleting ' + found.length + ' matching piece');
|
|
found.forEach(function(foundItem) {
|
|
Entities.deleteEntity(foundItem);
|
|
});
|
|
_this.setCurrentGame();
|
|
_this.spawnEntitiesForGame();
|
|
},
|
|
setCurrentGamesList: function() {
|
|
_this.gamesList = getGamesList();
|
|
_this.setInitialGameIfNone();
|
|
},
|
|
setCurrentGame: function() {
|
|
print('index in set current game: ' + _this.currentGameIndex);
|
|
print('game at index' + _this.gamesList[_this.currentGameIndex]);
|
|
_this.currentGame = _this.gamesList[_this.currentGameIndex].gameName;
|
|
_this.currentGameFull = _this.gamesList[_this.currentGameIndex];
|
|
_this.setCurrentUserData({
|
|
currentGame: _this.currentGame
|
|
});
|
|
},
|
|
setCurrentUserData: function(data) {
|
|
var userData = _this.getCurrentUserData();
|
|
userData['gameTableData'] = data;
|
|
Entities.editEntity(_this.entityID, {
|
|
userData: JSON.stringify(userData)
|
|
});
|
|
},
|
|
getCurrentUserData: function() {
|
|
var userData = Entities.getEntityProperties(_this.entityID, ['userData']).userData;
|
|
try {
|
|
return JSON.parse(userData);
|
|
} catch (e) {
|
|
print('user data is not json' + userData);
|
|
}
|
|
return {};
|
|
},
|
|
getEntityFromGroup: function(groupName, entityName) {
|
|
print('getting entity from group: ' + groupName);
|
|
var position = Entities.getEntityProperties(_this.entityID, ['position']).position;
|
|
var results = Entities.findEntities(position, 7.5);
|
|
var result = null;
|
|
results.forEach(function(item) {
|
|
var description = Entities.getEntityProperties(item, 'description').description;
|
|
var descriptionSplit = description.split(":");
|
|
if (descriptionSplit[1] === groupName && descriptionSplit[2] === entityName) {
|
|
result = item;
|
|
}
|
|
});
|
|
return result;
|
|
},
|
|
spawnEntitiesForGame: function() {
|
|
var entitySpawner = _this.getEntityFromGroup('gameTable', 'entitySpawner');
|
|
var mat = _this.getEntityFromGroup('gameTable', 'mat');
|
|
|
|
Entities.callEntityMethod(entitySpawner, 'spawnEntities', [
|
|
JSON.stringify(_this.currentGameFull),
|
|
mat,
|
|
_this.entityID
|
|
]);
|
|
}
|
|
};
|
|
|
|
return new GameTable();
|
|
});
|