(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); }, }; })