UNPKG

d-zone

Version:

An ambient life simulation driven by the user activity within a Discord server

220 lines (208 loc) 11.2 kB
'use strict'; var util = require('./script/common/util.js'); var Preloader = require('./script/engine/preloader.js'); var Game = require('./script/engine/game.js'); var Renderer = require('./script/engine/renderer.js'); var Canvas = require('./script/engine/canvas.js'); var UI = require('./script/ui/ui.js'); var bs = require('browser-storage'); var packageInfo = require('./../package.json'); var socketConfig = require('./../socket-config.json'); // TODO: Loading screen while preloading images, connecting to websocket, and generating world console.log('Loading...'); var version = packageInfo.version; var preloader = new Preloader(initGame); var game, ws; function initGame(images) { game = new Game({ step: 1000 / 60 }); game.renderer = new Renderer({ game: game, images: images }); var canvas = new Canvas({ id: 'main', game: game, initialScale: 2, backgroundColor: '#181213' }); game.renderer.addCanvas(canvas); game.bindCanvas(canvas); game.ui = new UI(game); //game.showGrid = true; //game.timeRenders = true; initWebsocket(); window.pause = function() { game.paused = true; }; window.unpause = function() { game.paused = false; }; window.game = game; } function initWebsocket() { var World = require('./script/environment/world.js'); var Users = require('./script/actors/users.js'); var Decorator = require('./script/props/decorator.js'); var users, world, decorator; var socketURL = (socketConfig.secure ? 'wss://' : 'ws://') + socketConfig.address + ':' + socketConfig.port; console.log('Initializing websocket on', socketURL); // Swap the comments on the next 3 lines to switch between your websocket server and a virtual one ws = new WebSocket(socketURL); //var TestSocket = require('./script/engine/tester.js'), //ws = new TestSocket(50, 3000); ws.addEventListener('message', function(event) { var data = JSON.parse(event.data); if(decorator) decorator.beacon.ping(); if(data.type === 'server-list') { game.servers = data.data; console.log('Got server list:', game.servers); // Server button game.ui.addButton({ text: 'Server', top: 3, right: 3, onPress: function() { if(game.serverListPanel) { game.serverListPanel.remove(); delete game.serverListPanel; return; } var joinThisServer = function(server) { return function() { var params = '?s=' + server.id; if(server.password) params += '&p=' + server.password; if(server.passworded) { var submitPassword = function(pass) { server.password = pass; if(window.location.protocol !== 'file:') window.history.pushState( { server: server.id, password: server.password }, server.id, window.location.pathname + params ); joinServer(server); game.passwordPromptPanel.remove(); delete game.passwordPromptPanel; }; game.passwordPromptPanel = game.ui.addPanel({ left: 'auto', top: 'auto', w: 102, h: 28 }); game.passwordPromptInput = game.ui.addInput({ left: 5, top: 5, w: 65, h: 18, parent: game.passwordPromptPanel, onSubmit: submitPassword, text: server.password ? server.password : '' }); game.passwordPromptInput.focus(); game.passwordPromptOK = game.ui.addButton({ text: 'OK', right: 5, top: 5, w: 24, h: 18, parent: game.passwordPromptPanel, onPress: game.passwordPromptInput.submit.bind(game.passwordPromptInput) }); } else { if(window.location.protocol !== 'file:') window.history.pushState( {server: server.id, password: server.password}, server.id, window.location.pathname + params ); joinServer(server); } game.serverListPanel.remove(); delete game.serverListPanel; } }; game.serverListPanel = game.ui.addPanel({ left: 'auto', top: 'auto', w: 146, h: 28 + 21 * (Object.keys(game.servers).length - 1) }); var widestButton = 136; var serverButtonY = 0; var button; for(var sKey in game.servers) { if(!game.servers.hasOwnProperty(sKey)) continue; var server = game.servers[sKey]; var serverLock = game.servers[sKey].passworded ? ':icon-lock-small: ' : ''; button = game.ui.addButton({ text: serverLock+game.servers[sKey].name, left: 5, top: 5 + serverButtonY * 21, w: 136, h: 18, parent: game.serverListPanel, onPress: new joinThisServer(server), disabled: game.server === server.id }); widestButton = Math.max(widestButton, button.textCanvas.width + 2); serverButtonY++; } game.serverListPanel.resize(widestButton + 10, game.serverListPanel.h); game.serverListPanel.resizeChildren(widestButton, button.h); game.serverListPanel.reposition(); } }); // Help button game.ui.addButton({ text: '?', bottom: 3, right: 3, w: 18, h: 18, onPress: function() { if(game.helpPanel) { game.helpPanel.remove(); delete game.helpPanel; return; } game.helpPanel = game.ui.addPanel({ left: 'auto', top: 'auto', w: 200, h: 75 }); game.ui.addLabel({ text: 'D-Zone '+version, top: 5, left: 'auto', parent: game.helpPanel }); game.ui.addLabel({ text: packageInfo.description, top: 20, left: 2, maxWidth: 196, parent: game.helpPanel }); game.ui.addLabel({ text: ':icon-npm: View on npm', hyperlink: 'https://www.npmjs.com/package/d-zone', top: 50, left: 8, parent: game.helpPanel }); game.ui.addLabel({ text: ':icon-github: View on GitHub', hyperlink: 'https://github.com/vegeta897/d-zone', top: 50, right: 8, parent: game.helpPanel }); }}); var startupServer = getStartupServer(); joinServer(startupServer); } else if(data.type === 'server-join') { // Initial server status var requestServer = data.data.request.server; var requestPass = data.data.request.password; bs.setItem('dzone-default-server', JSON.stringify({ id: requestServer, password: requestPass })); game.reset(); game.renderer.clear(); var userList = data.data.users; game.server = requestServer; world = new World(game, Math.round(3.3 * Math.sqrt(Object.keys(userList).length))); decorator = new Decorator(game, world); game.decorator = decorator; users = new Users(game, world); var params = '?s=' + data.data.request.server; if(requestPass) params += '&p=' + requestPass; if(window.location.protocol !== 'file:') window.history.replaceState( data.data.request, requestServer, window.location.pathname + params ); //return; //console.log('Initializing actors',data.data); game.setMaxListeners(Object.keys(userList).length + 50); users.setMaxListeners(Object.keys(userList).length); for(var uid in userList) { if(!userList.hasOwnProperty(uid)) continue; //if(uid != '86913608335773696') continue; //if(data.data[uid].status != 'online') continue; if(!userList[uid].username) continue; users.addActor(userList[uid]); //break; } console.log((Object.keys(users.actors).length).toString()+' actors created'); game.renderer.canvases[0].onResize(); } else if(data.type === 'presence') { // User status update users.updateActor(data.data) } else if(data.type === 'message') { // Chatter users.queueMessage(data.data); } else if(data.type === 'error') { window.alert(data.data.message); if(!game.world) joinServer({id: 'default'}); } else { //console.log('Websocket data:',data); } }); ws.addEventListener('open', function() { console.log('Websocket connected'); }); ws.addEventListener('close', function() {console.log('Websocket disconnected'); }); ws.addEventListener('error', function(err) {console.log('Websocket error:', err); }); // window.testMessage = function(message) { // var msg = message ? message.text : 'hello, test message yo!'; // var uid = message ? message.uid : users.actors[Object.keys(users.actors)[0]].uid; // var channel = message ? message.channel : '1'; // ws.send('data', JSON.stringify({ type: 'message', data: { // uid: uid, message: msg, channel: channel // }})); // }; } window.onpopstate = function(event) { var server = { id: event.state.server }; if(event.state.password) server.password = event.state.password; joinServer(server); }; function joinServer(server) { var connectionMessage = { type: 'connect', data: { server: server.id } }; if(server.password) connectionMessage.data.password = server.password; console.log('Requesting to join server', server.id); ws.send(new Buffer(JSON.stringify(connectionMessage))); } function getStartupServer() { // Get startup server, first checking URL params, then localstorage var startupServer = { id: util.getURLParameter('s') }; // Check URL params if(!startupServer.id) { startupServer = bs.getItem('dzone-default-server'); // Check localstorage if(startupServer) startupServer = JSON.parse(startupServer); } if(!startupServer/* || !game.servers[startupServer.id]*/) startupServer = { id: 'default' }; if(util.getURLParameter('p')) startupServer.password = util.getURLParameter('p'); return startupServer; } //setTimeout(function() { game.paused = true; },1000);