content/hifi-content/wadewatts/Race Gates/scoreboard_server.js
2022-02-14 02:04:11 +01:00

126 lines
3.8 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('[scoreboard_server] Error parsing message: ' + message);
return;
}
switch (data.type) {
case 'INIT_GATE':
addGate(data.gateID);
print(JSON.stringify(gates));
break;
case 'REMOVE_GATE':
removeGate(data.gateID);
break;
case 'CHECKPOINT':
addRacer(data.racerID, data.racerName);
completeCheckpoint(data.racerID, data.gateID);
print(JSON.stringify(racers));
break;
}
}
function completeCheckpoint(racerID, gateID) {
var racer = racers[racerID];
var completedGates = racer.completedGates;
var isCompleted = (completedGates.indexOf(gateID) > -1);
if (!isCompleted) {
completedGates.push(gateID);
if (completedGates.length === 1) {
racer.isRacing = true;
racer.startTime = Date.now();
sendRenderMessage();
}
else if (completedGates.length === gates.length) {
racer.isRacing = false;
racer.finishTime = ((Date.now() - racer.startTime) / 1000);
if (racer.bestTime === -1 || racer.finishTime < racer.bestTime) {
racer.bestTime = racer.finishTime;
}
racer.completedGates = [];
sendRenderMessage();
}
else if (completedGates.length > gates.length) {
print('More completed gates than gates exist! A gate was probably deleted.');
racer.isRacing = false;
racer.finishTime = ((Date.now() - racer.startTime) / 1000);
if (racer.bestTime === -1 || racer.finishTime < racer.bestTime) {
racer.bestTime = racer.finishTime;
}
racer.completedGates = [];
sendRenderMessage();
}
}
}
function addRacer(racerID, racerName) {
if (!racers[racerID]) {
racers[racerID] = {
name: racerName,
completedGates: [],
startTime: -1,
finishTime: -1,
bestTime: -1,
isRacing: false
}
}
}
function addGate(gateID) {
var isGateAdded = (gates.indexOf(gateID) > -1);
if (!isGateAdded) {
gates.push(gateID);
}
}
function removeGate(gateID) {
var gateIndex = gates.indexOf(gateID);
if (gateIndex > -1) {
gates.splice(gateIndex, 1);
}
}
function sendRenderMessage() {
sendMessage({
type: 'RENDER',
racers: racers
});
}
return {
preload: function(id) {
entityID = id;
gates = [];
racers = {};
Messages.subscribe(messageChannel);
Messages.messageReceived.connect(null, onReceivedMessage);
print('THERE HAD BETTER BE SOME CHANGES AROUND HERE');
},
unload: function(id) {
Messages.unsubscribe(messageChannel);
Messages.messageReceived.disconnect(null, onReceivedMessage);
},
};
})