content/hifi-content/rebecca/LoadTest/Raffle/raffleWheelX.js
2022-02-14 02:04:11 +01:00

160 lines
6.2 KiB
JavaScript

//
//
// Created by Rebecca Stankus on 07/05/2018
// Copyright High Fidelity 2018
//
// Licensed under the Apache 2.0 License
// See accompanying license file or http://apache.org/
//
/* global Avatar, AccountServices, Users */
(function() {
var ANGULAR_VELOCITY = {
x: 10,
y: 0,
z: 0
};
var ANGULAR_VELOCITY_CHECK_MS = 50;
var ANGULAR_VELOCITY_DECREMENT = 0.09;
var CHECKING_INTERVAL_DELAY = 100;
var USERS_ALLOWED_TO_SPIN_WHEEL = ['philip', 'Bighungry2x', 'XaosPrincess', 'ThaPhlash', 'Becky'];
var MAX_CHAR_PER_LINE = 9;
var CUT_OFF_1 = 13;
var CUT_OFF_2 = 18;
var CUT_OFF_3 = 24;
var CUT_OFF_4 = 32;
var LINE_HEIGHT_1 =0.385;
var LINE_HEIGHT_2 =0.28;
var LINE_HEIGHT_3 =0.21;
var LINE_HEIGHT_4 =0.155;
var DEFAULT_LINE_HEIGHT = 0.555;
var SHUFFLE_DELAY = 200;
var CORRECT_SOUND = SoundCache.getSound(Script.resolvePath('sounds/correct.wav?234'));
var _this;
var audioVolume = 0.4;
var injector;
function shuffle(array) {
var currentIndex = array.length, temporaryValue, randomIndex;
while (currentIndex !== 0) {
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
var Wheel = function() {
_this = this;
};
Wheel.prototype = {
interval: null,
angularVelocityLimit: 10,
nameText: null,
avatarList: [],
usernameList: [],
listCounter: 0,
preload: function(entityID) {
_this.entityID = entityID;
Users.usernameFromIDReply.connect(_this.usernameFromIDReply);
},
startFarTrigger: function() {
_this.mousePressOnEntity;
},
mousePressOnEntity: function(entityID, mouseEvent) {
if (!mouseEvent.button === "Primary") {
return;
}
var position = Entities.getEntityProperties(_this.entityID, 'position').position;
var winnerTextEntitiesArray = Entities.findEntitiesByName("Raffle Wheel Winner", position, 1);
_this.usernameList = [];
if (USERS_ALLOWED_TO_SPIN_WHEEL.indexOf(AccountServices.username) >= 0) {
_this.angularVelocityLimit = 10;
_this.avatarList = AvatarList.getAvatarIdentifiers();
_this.avatarList.forEach(function(id) {
Users.requestUsernameFromID(id);
});
Entities.editEntity(_this.entityID, {
angularVelocity: ANGULAR_VELOCITY
});
Script.setTimeout(function() {
shuffle(_this.usernameList);
}, SHUFFLE_DELAY);
Script.setTimeout(function() {
if (_this.interval) {
Script.clearInterval(_this.interval);
}
var winner;
_this.interval = Script.setInterval(function() {
var lineHeight;
var currentAngularVelocity = Entities.getEntityProperties(
_this.entityID, 'angularVelocity').angularVelocity;
if (currentAngularVelocity.x <= _this.angularVelocityLimit && currentAngularVelocity.x > 0) {
winner = _this.usernameList[_this.listCounter];
if (winner.length <= MAX_CHAR_PER_LINE) {
lineHeight = DEFAULT_LINE_HEIGHT;
} else if (winner.length <= CUT_OFF_1) {
lineHeight = LINE_HEIGHT_1;
} else if (winner.length <= CUT_OFF_2) {
lineHeight = LINE_HEIGHT_2;
} else if (winner.length <= CUT_OFF_3) {
lineHeight = LINE_HEIGHT_3;
} else if (winner.length <= CUT_OFF_4) {
lineHeight = LINE_HEIGHT_4;
} else {
winner = winner.slice(0, CUT_OFF_4 + 1);
}
Entities.editEntity(winnerTextEntitiesArray[0], {
lineHeight: lineHeight,
text: winner
});
_this.listCounter += 1;
_this.listCounter = _this.listCounter >= _this.usernameList.length ? 0 : _this.listCounter;
_this.angularVelocityLimit -= ANGULAR_VELOCITY_DECREMENT;
} else if (currentAngularVelocity.x === 0) {
if (_this.interval) {
// this print is purposely left as a backup way to see winner via logs
print("-------------RAFFLE WINNER IS: ", winner);
_this.playSound(CORRECT_SOUND);
Script.clearInterval(_this.interval);
}
}
}, ANGULAR_VELOCITY_CHECK_MS);
}, CHECKING_INTERVAL_DELAY);
}
},
playSound: function(sound) {
if (sound.downloaded) {
var position = Entities.getEntityProperties(_this.entityID, 'position').position;
if (injector) {
injector.stop();
}
injector = Audio.playSound(sound, {
position: position,
volume: audioVolume
});
}
},
usernameFromIDReply: function(nodeID, userName, machineFingerprint, isAdmin) {
_this.usernameList.push(userName);
},
unload: function(entityID) {
if (_this.interval) {
Script.clearInterval(_this.interval);
}
}
};
return new Wheel();
});