content/hifi-content/wadewatts/race course server script 2.js
2022-02-14 02:04:11 +01:00

155 lines
5.5 KiB
JavaScript

(function() {
var messageChannel = 'MESSAGE_CHANNEL_GATE_GAME';
var entityID;
var gates;
var racers;
function sendMessage(message) {
message.entityID = entityID;
Messages.sendMessage(
messageChannel,
JSON.stringify(message)
);
}
function onReceivedMessage(channel, message, senderID) {
try {
var data = JSON.parse(message);
} catch (e) {
print('Error parsing message in scoreboard_server: ' + message);
return;
}
// print('data: ' + JSON.stringify(data));
switch (data.type) {
case 'INIT_GATE':
gates.push(data.gateID);
updateRacerGates();
break;
case 'REMOVE_GATE':
var gateIndex = gates.indexOf(data.gateID);
if (gateIndex > -1) {
gates.splice(gateIndex, 1);
}
updateRacerGates();
break;
case 'ADD_RACER':
var racer = racers[data.avatarSessionUUID] = {
sessionUUID: data.avatarSessionUUID,
displayName: data.avatarDisplayName,
isRacing: false,
startTime: null,
finishTime: null,
bestTime: null,
gates: {}
};
updateRacerGates();
break;
case 'REMOVE_RACER':
if (racers[data.avatarSessionUUID]) {
delete racers[data.avatarSessionUUID];
sendRenderMessage();
}
break;
case 'PASS_THROUGH_GATE':
var racer = racers[data.avatarSessionUUID];
var allGatesPassed = racer.gates.every(function(gateCompleted) {
return gateCompleted;
});
if (allGatesPassed) {
if (racer.isRacing) { // finish race
racer.isRacing = false;
racer.finishTime = Date.now() - racer.startTime;
racer.bestTime = racer.finishTime < racer.bestTime ? racer.finishTime : racer.bestTime;
}
else { // start race
racer.isRacing = true;
racer.startTime = Date.now();
for (var i = 0; i < gates.length; i++) {
var gateID = gates[i];
racer.gates[gateID] = false;
}
}
}
racer.gates[data.gateID] = true;
print(racer.displayName + ' passed gates: ' + racer.gates);
sendRenderMessage();
// print('RACERS ' + JSON.stringify(racers));
// print('GATES ' + gates.length + ' ' + JSON.stringify(gates));
// var racer = racers[data.avatarSessionUUID];
// if (!racer) {
// racers[data.avatarSessionUUID] = racer = {
// avatarDisplayName: data.avatarDisplayName || 'Anon',
// isRacing: false
// };
// }
// if (!racer.isRacing && data.gateID === gates[0]) {
// racer.isRacing = true;
// racer.startTime = Date.now();
// racer.gatesPassed = 1;
// racer.time = 'racing...';
// } else if (racer.gatesPassed < gates.length && gates[racer.gatesPassed] === data.gateID) {
// racer.gatesPassed++;
// sendMessage({
// type: 'CHECKPOINT',
// gateID: data.gateID
// });
// } else if (racer.gatesPassed === gates.length && gates[0] === data.gateID) { // finish race by going into the starting ring again
// racer.isRacing = false;
// racer.time = ((Date.now() - racer.startTime) / 1000).toFixed(3) + ' sec';
// if (!racer.bestTime || racer.time < racer.bestTime) {
// racer.bestTime = racer.time;
// }
// sendMessage({
// type: 'CHECKPOINT',
// gateID: data.gateID
// });
// } else {
// return;
// }
// sendRenderMessage();
break;
}
}
function sendRenderMessage() {
sendMessage({
type: 'RENDER',
racers: racers
});
}
function updateRacerGates() {
Object.keys(racers).forEach(function(racerID) {
print('RACERID ' + racerID);
var racer = racers[racerID];
racer.gates = {};
gates.forEach(function(gateID) {
racer.gates[gateID] = true;
});
});
}
return {
preload: function(id) {
entityID = id;
gates = [];
racers = {};
Messages.subscribe(messageChannel);
Messages.messageReceived.connect(null, onReceivedMessage);
print('Hello Scoreboard');
},
unload: function(id) {
Messages.unsubscribe(messageChannel);
Messages.messageReceived.disconnect(null, onReceivedMessage);
},
};
})