diff --git a/README.md b/README.md index 956e9b6..cae17cf 100755 --- a/README.md +++ b/README.md @@ -2,10 +2,8 @@ chuck.js ======== Physical JavaScript Action Browser Multiplayer Game - it will be awesome! - - - - + +[![Foo](http://25.media.tumblr.com/8249dcd3bdb176686421d1914937db1c/tumblr_mzc1ejGxNC1ry8awho1_400.png)](http://chuck-game.tumblr.com/ "Screenshot of chuck.js - click to visit our development blog!") Follow the development at http://chuck-game.tumblr.com/ diff --git a/app/Bootstrap/HttpServer.js b/app/Bootstrap/HttpServer.js index a1293b2..e8f3f2d 100755 --- a/app/Bootstrap/HttpServer.js +++ b/app/Bootstrap/HttpServer.js @@ -1,74 +1,105 @@ define([ - 'express', - 'http', - 'path', + 'http', + 'node-static', 'Server/Api', 'fs' ], -function (express, http, path, Api, fs) { +function (http, nodeStatic, Api, fs) { - "use strict"; + "use strict"; function HttpServer (options, coordinator) { options.port = options.port || 1234; + options.caching = typeof options.caching != 'undefined' ? options.caching : 3600; options.rootDirectory = options.rootDirectory || './'; + this.server = null; this.api = new Api(coordinator); - this.app = express(); - this.server = http.createServer(this.app); + this.init(options); } HttpServer.prototype.init = function (options) { var self = this; - var app = this.app; - // Serve static files - app.use('/static', express.static(path.join(options.rootDirectory, 'static'))); - app.use('/app', express.static(path.join(options.rootDirectory, 'app'))); + //gzip true serves gzip file if there is one with .gz next to the original && if browser supports it + var fileServer = new nodeStatic.Server(options.rootDirectory, { cache: options.caching, gzip: true }); - // Serve index.html at root - app.get('/', function(req, res) { - res.sendFile(path.resolve(options.rootDirectory, 'static/html/index.html')); - }); + this.server = http.createServer( + function (req, res) { + + var fullBody = ''; + req.addListener('data', function(chunk) { // doesn't work on Jeenas computer without this + fullBody += chunk.toString(); + }); - // Serve client.js and minified version - app.get('/client.js', function(req, res) { - if (process.env.NODE_ENV === 'production' && fs.existsSync(path.resolve(options.rootDirectory, 'build/client.min.js'))) { - res.sendFile(path.resolve(options.rootDirectory, 'build/client.min.js')); - } else { - res.sendFile(path.resolve(options.rootDirectory, 'client.js')); + req.addListener('error', function(err) { + console.log(''); + }); + + + req.addListener('end', function () { + + switch(true) { + case req.url == '/': + fileServer.serveFile('./static/html/index.html', 200, {}, req, res); + console.checkpoint('HTTP Server serves index'); + break; + + case req.url == '/client.js': + fs.exists('./build/client.min.js', function (exists) { + if (process.env.NODE_ENV && process.env.NODE_ENV == 'production' && exists) { + fileServer.serveFile('./build/client.min.js', 200, {}, req, res); + } else { + fileServer.serveFile('./client.js', 200, {}, req, res); + } + }); + break; + + case req.url == '/client.min.js': + fileServer.serveFile('./build/client.min.js', 200, {}, req, res); + break; + + case req.url == '/require.js': + fileServer.serveFile('./node_modules/requirejs/require.js', 200, {}, req, res); + break; + + case req.url == '/screenfull.js': + fileServer.serveFile('./node_modules/screenfull/dist/screenfull.js', 200, {}, req, res); + break; + + case req.url == '/chart.js': + fileServer.serveFile('./node_modules/chart.js/Chart.js', 200, {}, req, res); + break; + + case req.url == '/api': + self.api.handleCall(fullBody); + var status = self.api.isError ? 400 : 200; + res.writeHead(status, {"Content-Type": self.api.getContentType()}); + res.end(self.api.getOutput()); + self.api.isError = false; + break; + + case new RegExp(/^\/app/).test(req.url): + fileServer.serve(req, res, function () { + self.handleFileError(res) + }); + break; + + case new RegExp(/^\/static/).test(req.url): + fileServer.serve(req, res, function () { + self.handleFileError(res) + }); + break; + + default: + self.handleFileError(res); + break; + } + }); } - }); - app.get('/client.min.js', function(req, res) { - res.sendFile(path.resolve(options.rootDirectory, 'build/client.min.js')); - }); - - // Serve require.js, screenfull.js, chart.js from node_modules - app.get('/require.js', function(req, res) { - res.sendFile(path.resolve(options.rootDirectory, 'node_modules/requirejs/require.js')); - }); - app.get('/screenfull.js', function(req, res) { - res.sendFile(path.resolve(options.rootDirectory, 'static/vendor/screenfull.js')); - }); - app.get('/chart.js', function(req, res) { - // Chart.js v4 uses 'dist/chart.umd.js' - res.sendFile(path.resolve(options.rootDirectory, 'node_modules/chart.js/dist/chart.umd.js')); - }); - - // API endpoint - app.post('/api', express.text({type: '*/*'}), function(req, res) { - self.api.handleCall(req.body); - var status = self.api.isError ? 400 : 200; - res.status(status).type(self.api.getContentType()).send(self.api.getOutput()); - self.api.isError = false; - }); - - // 404 handler - app.use(function(req, res) { - res.status(404).send('

404 not ... found

'); - }); + ); this.server.once('error', function(err) { if(err.code == 'EADDRINUSE') { @@ -79,6 +110,7 @@ function (express, http, path, Api, fs) { }); this.server.listen(options.port); + console.checkpoint('start HTTP server'); } @@ -86,5 +118,10 @@ function (express, http, path, Api, fs) { return this.server; } + HttpServer.prototype.handleFileError = function (res) { + res.writeHead(404, {'Content-Type': 'text/html'}); + res.end('

404 not ... found

'); + } + return HttpServer; }); \ No newline at end of file diff --git a/app/Bootstrap/Socket.js b/app/Bootstrap/Socket.js index c9a652e..3765c0b 100755 --- a/app/Bootstrap/Socket.js +++ b/app/Bootstrap/Socket.js @@ -4,23 +4,35 @@ define([ function (io) { - "use strict"; + "use strict"; function Socket (server, options, coordinator) { + options.logLevel = typeof options.logLevel != 'undefined' + ? options.logLevel + : 0; + this.coordinator = coordinator; - this.io = io(server, { - // No more 'log level' or 'transports' in v4 - // Add any v4-compatible options here if needed - }); + this.socket = io.listen(server); + this.init(options); } Socket.prototype.init = function (options) { + var self = this; - this.io.on('connection', function (socket) { - console.checkpoint('socket receiving connection'); - self.onConnection(socket); + this.socket.configure('development', function () { + this.set('log level', options.logLevel); }); + + this.socket.configure('production', function () { + this.set('log level', options.logLevel); + }); + + this.socket.on('connection', function (user) { + console.checkpoint('socket receiving connection'); + self.onConnection(user); + }); + console.checkpoint('start Socket Listener'); } diff --git a/app/Game/Asset/RubeDoll.json b/app/Game/Asset/RubeDoll.json deleted file mode 100644 index 0ea7dc3..0000000 --- a/app/Game/Asset/RubeDoll.json +++ /dev/null @@ -1,783 +0,0 @@ -{ - "allowSleep" : true, - "autoClearForces" : true, - "body" : - [ - - { - "angle" : 0, - "angularVelocity" : 0, - "awake" : true, - "fixture" : - [ - - { - "density" : 1, - "filter-groupIndex" : -55, - "friction" : 0.2, - "name" : "fixture3", - "polygon" : - { - "vertices" : - { - "x" : - [ - 0.04692989960312843, - 0.04692989960312843, - -0.04693000018596649, - -0.04693000018596649 - ], - "y" : - [ - -0.1895969957113266, - 0.1895969957113266, - 0.1895969957113266, - -0.1895969957113266 - ] - } - } - } - ], - "linearVelocity" : 0, - "massData-I" : 0.0004525936674326658, - "massData-center" : - { - "x" : -5.029141902923584e-08, - "y" : 0 - }, - "massData-mass" : 0.03559110686182976, - "name" : "upperLeftArm", - "position" : - { - "x" : -0.1165359988808632, - "y" : 0.9012569785118103 - }, - "type" : 2 - }, - - { - "angle" : 0, - "angularVelocity" : 0, - "awake" : true, - "fixture" : - [ - - { - "density" : 1, - "filter-groupIndex" : -55, - "friction" : 0.2, - "name" : "fixture2", - "polygon" : - { - "vertices" : - { - "x" : - [ - 0.1366278976202011, - 0.1366278976202011, - -0.1360991001129150, - -0.1360991001129150 - ], - "y" : - [ - -0.3788780868053436, - 0.3830279111862183, - 0.3830279111862183, - -0.3788780868053436 - ] - } - } - } - ], - "linearVelocity" : 0, - "massData-I" : 0.01134084537625313, - "massData-center" : - { - "x" : 0.0002643987536430359, - "y" : 0.002074912190437317 - }, - "massData-mass" : 0.2077923566102982, - "name" : "chest", - "position" : - { - "x" : 0.0007875636219978333, - "y" : 0.7995355725288391 - }, - "type" : 2 - }, - - { - "angle" : 0, - "angularVelocity" : 0, - "awake" : true, - "fixture" : - [ - - { - "circle" : - { - "center" : - { - "x" : -0.01561669446527958, - "y" : 0.004700659774243832 - }, - "radius" : 0.2268356680870056 - }, - "density" : 0.2204959988594055, - "filter-groupIndex" : -55, - "friction" : 0.2, - "name" : "fixture1" - } - ], - "linearVelocity" : 0, - "massData-I" : 0.0009264730615541339, - "massData-center" : - { - "x" : -0.01561669446527958, - "y" : 0.004700659774243832 - }, - "massData-mass" : 0.03564291819930077, - "name" : "head", - "position" : - { - "x" : 0.02309736609458923, - "y" : 1.497289657592773 - }, - "type" : 2 - }, - - { - "angle" : 0, - "angularVelocity" : 0, - "awake" : true, - "fixture" : - [ - - { - "density" : 1, - "filter-groupIndex" : -55, - "friction" : 0.2, - "name" : "fixture3", - "polygon" : - { - "vertices" : - { - "x" : - [ - 0.04693000018596649, - 0.04693000018596649, - -0.04693005979061127, - -0.04693005979061127 - ], - "y" : - [ - -0.1159216761589050, - 0.1159217953681946, - 0.1159217953681946, - -0.1159216761589050 - ] - } - } - } - ], - "linearVelocity" : 0, - "massData-I" : 0.0001134485355578363, - "massData-center" : - { - "x" : -2.980232238769531e-08, - "y" : 5.960464477539062e-08 - }, - "massData-mass" : 0.02176084183156490, - "name" : "lowerRightArm", - "position" : - { - "x" : 0.1183081120252609, - "y" : 0.6842151284217834 - }, - "type" : 2 - }, - - { - "angle" : 0, - "angularVelocity" : 0, - "awake" : true, - "fixture" : - [ - - { - "density" : 1, - "filter-groupIndex" : -55, - "friction" : 0.2, - "name" : "fixture3", - "polygon" : - { - "vertices" : - { - "x" : - [ - 0.07039500027894974, - 0.07039500027894974, - -0.07039500027894974, - -0.07039500027894974 - ], - "y" : - [ - -0.09294360131025314, - 0.1277720034122467, - 0.1277720034122467, - -0.09294360131025314 - ] - } - } - } - ], - "linearVelocity" : 0, - "massData-I" : 0.0001869037223514169, - "massData-center" : - { - "x" : 0, - "y" : 0.01741420105099678 - }, - "massData-mass" : 0.03107454814016819, - "name" : "lowerLeftLeg", - "position" : - { - "x" : -0.03829947486519814, - "y" : 0.09799569845199585 - }, - "type" : 2 - }, - - { - "angle" : 0, - "angularVelocity" : 0, - "awake" : true, - "fixture" : - [ - - { - "density" : 1, - "filter-groupIndex" : -55, - "friction" : 0.2, - "name" : "fixture3", - "polygon" : - { - "vertices" : - { - "x" : - [ - 0.04693000763654709, - 0.04693000763654709, - -0.04692991077899933, - -0.04692991077899933 - ], - "y" : - [ - -0.1159216761589050, - 0.1159217953681946, - 0.1159217953681946, - -0.1159216761589050 - ] - } - } - } - ], - "linearVelocity" : 0, - "massData-I" : 0.0001134483172791079, - "massData-center" : - { - "x" : 4.842877032729120e-08, - "y" : 5.960464477539062e-08 - }, - "massData-mass" : 0.02176081016659737, - "name" : "lowerLeftArm", - "position" : - { - "x" : -0.1165381968021393, - "y" : 0.6842151284217834 - }, - "type" : 2 - }, - - { - "angle" : 0, - "angularVelocity" : 0, - "awake" : true, - "fixture" : - [ - - { - "density" : 1, - "filter-groupIndex" : -55, - "friction" : 0.2, - "name" : "fixture3", - "polygon" : - { - "vertices" : - { - "x" : - [ - 0.04693000018596649, - 0.04693000018596649, - -0.04693010076880455, - -0.04693010076880455 - ], - "y" : - [ - -0.1895969957113266, - 0.1895969957113266, - 0.1895969957113266, - -0.1895969957113266 - ] - } - } - } - ], - "linearVelocity" : 0, - "massData-I" : 0.0004525947733782232, - "massData-center" : - { - "x" : -5.029141902923584e-08, - "y" : 0 - }, - "massData-mass" : 0.03559118881821632, - "name" : "upperRightArm", - "position" : - { - "x" : 0.1183080002665520, - "y" : 0.9012569785118103 - }, - "type" : 2 - }, - - { - "angle" : 0, - "angularVelocity" : 0, - "awake" : true, - "fixture" : - [ - - { - "density" : 1, - "filter-groupIndex" : -55, - "friction" : 0.2, - "name" : "fixture3", - "polygon" : - { - "vertices" : - { - "x" : - [ - 0.07039496302604675, - 0.07039496302604675, - -0.07039486616849899, - -0.07039486616849899 - ], - "y" : - [ - -0.1890522241592407, - 0.1890524625778198, - 0.1890524625778198, - -0.1890522241592407 - ] - } - } - } - ], - "linearVelocity" : 0, - "massData-I" : 0.0007221315754577518, - "massData-center" : - { - "x" : 4.842877388000488e-08, - "y" : 1.192092895507812e-07 - }, - "massData-mass" : 0.05323329567909241, - "name" : "upperRightLeg", - "position" : - { - "x" : 0.03859551250934601, - "y" : 0.3325110077857971 - }, - "type" : 2 - }, - - { - "angle" : 0, - "angularVelocity" : 0, - "awake" : true, - "fixture" : - [ - - { - "density" : 1, - "filter-groupIndex" : -55, - "friction" : 0.2, - "name" : "fixture3", - "polygon" : - { - "vertices" : - { - "x" : - [ - 0.07039505988359451, - 0.07039505988359451, - -0.07039495557546616, - -0.07039495557546616 - ], - "y" : - [ - -0.1890522241592407, - 0.1890524625778198, - 0.1890524625778198, - -0.1890522241592407 - ] - } - } - } - ], - "linearVelocity" : 0, - "massData-I" : 0.000722132739610970, - "massData-center" : - { - "x" : 5.215406417846680e-08, - "y" : 1.192092824453539e-07 - }, - "massData-mass" : 0.05323336645960808, - "name" : "upperLeftLeg", - "position" : - { - "x" : -0.03829947486519814, - "y" : 0.3325110077857971 - }, - "type" : 2 - }, - - { - "angle" : 0, - "angularVelocity" : 0, - "awake" : true, - "fixture" : - [ - - { - "density" : 1, - "filter-groupIndex" : -55, - "friction" : 0.2, - "name" : "fixture3", - "polygon" : - { - "vertices" : - { - "x" : - [ - 0.07039500027894974, - 0.07039500027894974, - -0.07039490342140198, - -0.07039490342140198 - ], - "y" : - [ - -0.09294389933347702, - 0.1276109963655472, - 0.1276109963655472, - -0.09294389933347702 - ] - } - } - } - ], - "linearVelocity" : 0, - "massData-I" : 0.0001864968799054623, - "massData-center" : - { - "x" : 4.842877032729120e-08, - "y" : 0.01733354665338993 - }, - "massData-mass" : 0.03105190023779869, - "name" : "lowerRightLeg", - "position" : - { - "x" : 0.03859551250934601, - "y" : 0.09799569845199585 - }, - "type" : 2 - } - ], - "collisionbitplanes" : - { - "names" : - [ - "bitplane1", - "bitplane2", - "bitplane3", - "bitplane4", - "bitplane5", - "bitplane6", - "bitplane7", - "bitplane8", - "bitplane9", - "bitplane10", - "bitplane11", - "bitplane12", - "bitplane13", - "bitplane14", - "bitplane15", - "bitplane16", - "bitplane17", - "bitplane18", - "bitplane19", - "bitplane20", - "bitplane21", - "bitplane22", - "bitplane23", - "bitplane24", - "bitplane25", - "bitplane26", - "bitplane27", - "bitplane28", - "bitplane29", - "bitplane30", - "bitplane31", - "bitplane32" - ] - }, - "continuousPhysics" : true, - "gravity" : - { - "x" : 0, - "y" : -10 - }, - "joint" : - [ - - { - "anchorA" : - { - "x" : 0.0003538504242897034, - "y" : 0.07107692956924438 - }, - "anchorB" : - { - "x" : 0.0003536641597747803, - "y" : -0.1459649801254272 - }, - "bodyA" : 3, - "bodyB" : 6, - "enableLimit" : true, - "enableMotor" : false, - "jointSpeed" : 0, - "lowerLimit" : 0.01745329238474369, - "maxMotorTorque" : 1, - "motorSpeed" : 0, - "name" : "joint1", - "refAngle" : 0, - "type" : "revolute", - "upperLimit" : 1.919862151145935 - }, - - { - "anchorA" : - { - "x" : -0.0007802955806255341, - "y" : -0.1484909951686859 - }, - "anchorB" : - { - "x" : -0.0007801018655300140, - "y" : 0.08614099025726318 - }, - "bodyA" : 8, - "bodyB" : 4, - "enableLimit" : true, - "enableMotor" : false, - "jointSpeed" : 0, - "lowerLimit" : 0.01745329238474369, - "maxMotorTorque" : 1, - "motorSpeed" : 0, - "name" : "joint7", - "refAngle" : 0, - "type" : "revolute", - "upperLimit" : 2.443460941314697 - }, - - { - "anchorA" : - { - "x" : -0.004979588091373444, - "y" : -0.1506859958171844 - }, - "anchorB" : - { - "x" : -0.005973689258098602, - "y" : 0.08482310175895691 - }, - "bodyA" : 7, - "bodyB" : 9, - "enableLimit" : true, - "enableMotor" : false, - "jointSpeed" : 0, - "lowerLimit" : 0.01745329238474369, - "maxMotorTorque" : 1, - "motorSpeed" : 0, - "name" : "joint8", - "refAngle" : 0, - "type" : "revolute", - "upperLimit" : 2.443460941314697 - }, - - { - "anchorA" : - { - "x" : -0.06799955666065216, - "y" : -0.3021813035011292 - }, - "anchorB" : - { - "x" : -0.02891255542635918, - "y" : 0.1648437976837158 - }, - "bodyA" : 1, - "bodyB" : 8, - "enableLimit" : true, - "enableMotor" : false, - "jointSpeed" : 0, - "lowerLimit" : -0.7853981852531433, - "maxMotorTorque" : 1, - "motorSpeed" : 0, - "name" : "joint6", - "refAngle" : 0, - "type" : "revolute", - "upperLimit" : 1.570796370506287 - }, - - { - "anchorA" : - { - "x" : 0.06260262429714203, - "y" : -0.3029872477054596 - }, - "anchorB" : - { - "x" : 0.02294230461120605, - "y" : 0.1640380322933197 - }, - "bodyA" : 1, - "bodyB" : 7, - "enableLimit" : true, - "enableMotor" : false, - "jointSpeed" : 0, - "lowerLimit" : -0.7853981852531433, - "maxMotorTorque" : 1, - "motorSpeed" : 0, - "name" : "joint5", - "refAngle" : 0, - "type" : "revolute", - "upperLimit" : 1.570796370506287 - }, - - { - "anchorA" : - { - "x" : 0.1179294362664223, - "y" : 0.2464744448661804 - }, - "anchorB" : - { - "x" : 0.0004089996218681335, - "y" : 0.1447530388832092 - }, - "bodyA" : 1, - "bodyB" : 6, - "enableLimit" : false, - "enableMotor" : false, - "jointSpeed" : 0, - "lowerLimit" : -2.268928050994873, - "maxMotorTorque" : 1, - "motorSpeed" : 0, - "name" : "joint2", - "refAngle" : 0, - "type" : "revolute", - "upperLimit" : 3.141592741012573 - }, - - { - "anchorA" : - { - "x" : -0.1188285648822784, - "y" : 0.2521644234657288 - }, - "anchorB" : - { - "x" : -0.001505002379417419, - "y" : 0.1504430174827576 - }, - "bodyA" : 1, - "bodyB" : 0, - "enableLimit" : false, - "enableMotor" : false, - "jointSpeed" : 0, - "lowerLimit" : -2.268928050994873, - "maxMotorTorque" : 1, - "motorSpeed" : 0, - "name" : "joint3", - "refAngle" : 0, - "type" : "revolute", - "upperLimit" : 3.141592741012573 - }, - - { - "anchorA" : - { - "x" : 0.0008554458618164062, - "y" : -0.1461489796638489 - }, - "anchorB" : - { - "x" : 0.0008557140827178955, - "y" : 0.07089227437973022 - }, - "bodyA" : 0, - "bodyB" : 5, - "enableLimit" : true, - "enableMotor" : false, - "jointSpeed" : 0, - "lowerLimit" : -1.919862151145935, - "maxMotorTorque" : 1, - "motorSpeed" : 0, - "name" : "joint4", - "refAngle" : 0, - "type" : "revolute", - "upperLimit" : 0.01745329238474369 - }, - - { - "anchorA" : - { - "x" : 0.02210754156112671, - "y" : 0.4607425332069397 - }, - "anchorB" : - { - "x" : -0.02544101513922215, - "y" : -0.2591779232025146 - }, - "bodyA" : 1, - "bodyB" : 2, - "enableLimit" : true, - "enableMotor" : false, - "jointSpeed" : 0, - "lowerLimit" : -0.6981316804885864, - "maxMotorTorque" : 0, - "motorSpeed" : 0, - "name" : "joint9", - "refAngle" : 0, - "type" : "revolute", - "upperLimit" : 1.221730470657349 - } - ], - "positionIterations" : 3, - "stepsPerSecond" : 60.0, - "subStepping" : false, - "velocityIterations" : 8, - "warmStarting" : true -} diff --git a/app/Game/Channel/Channel.js b/app/Game/Channel/Channel.js index db3b3a6..c4d6287 100755 --- a/app/Game/Channel/Channel.js +++ b/app/Game/Channel/Channel.js @@ -3,11 +3,11 @@ "Lib/Utilities/NotificationCenter", "Game/Channel/User", "Lib/Utilities/Protocol/Helper", - "Lib/Utilities/OptionsHelper", + "Lib/Utilities/Options", "Game/Config/Settings" ], - function (GameController, nc, User, ProtocolHelper, optionsHelper, Settings) { + function (GameController, Nc, User, ProtocolHelper, Options, Settings) { "use strict"; @@ -21,19 +21,19 @@ this.levelListIndex = -1; this.gameController = null; - this.options = options = optionsHelper.merge(options, { + this.options = options = Options.merge(options, { levelUids: Settings.CHANNEL_DEFAULT_LEVELS }); // Notification Center - nc.on(nc.ns.channel.events.round.end, this.onEndRound, this); - nc.on(nc.ns.channel.events.controlCommand.channel, function (message) { + Nc.on(Nc.ns.channel.events.round.end, this.onEndRound, this); + Nc.on(Nc.ns.channel.events.controlCommand.channel, function (message) { ProtocolHelper.applyCommand(message.data, self); }); - nc.on(nc.ns.channel.to.client.gameCommand.broadcast, this.broadcastGameCommand, this); - nc.on(nc.ns.channel.to.client.controlCommand.broadcast, this.broadcastControlCommand, this); - //nc.on(nc.ns.channel.to.client.gameCommand.broadcastExcept, this.broadcastGameCommandExcept, this); - //nc.on(nc.ns.channel.to.client.controlCommand.broadcastExcept, this.broadcastControlCommandExcept, this); + Nc.on(Nc.ns.channel.to.client.gameCommand.broadcast, this.broadcastGameCommand, this); + Nc.on(Nc.ns.channel.to.client.controlCommand.broadcast, this.broadcastControlCommand, this); + //Nc.on(Nc.ns.channel.to.client.gameCommand.broadcastExcept, this.broadcastGameCommandExcept, this); + //Nc.on(Nc.ns.channel.to.client.controlCommand.broadcastExcept, this.broadcastControlCommandExcept, this); this.beginRound(); @@ -82,7 +82,6 @@ Channel.prototype.onEndRound = function() { var self = this; - this.gameController.endRound(); this.broadcastControlCommand("endRound", true); console.checkpoint("End Round (" + this.name + ") - Begin Round in " + Settings.CHANNEL_END_ROUND_TIME + " seconds"); @@ -103,10 +102,10 @@ }; if(!this.gameController.level || !this.gameController.level.isLoaded) { - var token = nc.on(nc.ns.core.game.events.level.loaded, function() { + var token = Nc.on(Nc.ns.core.game.events.level.loaded, function() { self.sendJoinSuccess(options); self.users[options.id].sendControlCommand("beginRound", clientGameControllerOptions); - nc.off(token); + Nc.off(token); }); } else { this.sendJoinSuccess(options); @@ -135,16 +134,16 @@ levelUid: levelUid }; - //nc.trigger("user/" + user.id + "/joinSuccess", options); + //Nc.trigger("user/" + user.id + "/joinSuccess", options); user.sendControlCommand("joinSuccess", options); - nc.trigger(nc.ns.channel.events.user.joined, user); + Nc.trigger(Nc.ns.channel.events.user.joined, user); this.broadcastControlCommandExcept("userJoined", user.options, user); }; Channel.prototype.onReleaseUser = function (userId) { var self = this; - nc.trigger(nc.ns.channel.events.user.left, userId); + Nc.trigger(Nc.ns.channel.events.user.left, userId); delete this.users[userId]; this.broadcastControlCommand("userLeft", userId); diff --git a/app/Game/Channel/Control/PlayerController.js b/app/Game/Channel/Control/PlayerController.js index c9e55d3..cf7a306 100755 --- a/app/Game/Channel/Control/PlayerController.js +++ b/app/Game/Channel/Control/PlayerController.js @@ -5,7 +5,7 @@ define([ "Game/Config/Settings" ], -function(Parent, nc, Parser, Settings) { +function(Parent, Nc, Parser, Settings) { "use strict"; @@ -35,9 +35,9 @@ function(Parent, nc, Parser, Settings) { }; PlayerController.prototype.handActionRequest = function(options) { - options.x = parseFloat(options.x) || 0.0; - options.y = parseFloat(options.y) || 0.0; - options.av = parseFloat(options.av) || 0.0; + options.x = parseFloat(options.x) || 0; + options.y = parseFloat(options.y) || 0; + options.av = parseFloat(options.av) || 0; if (options) this.player.handActionRequest(options); }; @@ -45,7 +45,7 @@ function(Parent, nc, Parser, Settings) { this.player.suicide(); }; - PlayerController.prototype.mePositionStateOverride = function(update) { + PlayerController.prototype.mePositionStateUpdate = function(update) { if(!this.player.isSpawned()) { // if someone still falls but is dead on the server already @@ -57,7 +57,7 @@ function(Parent, nc, Parser, Settings) { y: Math.abs(update.p.y - this.player.doll.body.GetPosition().y) }; - if(difference.x < Settings.PUNKBUSTER_DIFFERENCE_METERS && + if(true || difference.x < Settings.PUNKBUSTER_DIFFERENCE_METERS && difference.y < Settings.PUNKBUSTER_DIFFERENCE_METERS) { this.player.doll.updatePositionState(update); } else { @@ -71,7 +71,7 @@ function(Parent, nc, Parser, Settings) { lv: body.GetLinearVelocity() }; - nc.trigger(nc.ns.channel.to.client.user.gameCommand.send + this.player.id, "positionStateReset", options); + Nc.trigger(Nc.ns.channel.to.client.user.gameCommand.send + this.player.id, "positionStateReset", options); } }; diff --git a/app/Game/Channel/GameController.js b/app/Game/Channel/GameController.js index 4f5f5b5..571b088 100755 --- a/app/Game/Channel/GameController.js +++ b/app/Game/Channel/GameController.js @@ -2,16 +2,17 @@ define([ "Game/Core/GameController", "Game/Channel/Physics/Engine", "Game/Config/Settings", + "Game/Channel/Control/PlayerController", "Lib/Utilities/RequestAnimFrame", "Lib/Utilities/NotificationCenter", "Lib/Vendor/Box2D", "Game/Channel/Player", "Game/Channel/GameObjects/GameObject", "Game/Channel/GameObjects/Doll", - "Game/Channel/GameObjects/Items/RubeDoll" + "Game/Channel/GameObjects/Items/RagDoll" ], -function (Parent, PhysicsEngine, Settings, requestAnimFrame, nc, Box2D, Player, GameObject, Doll, RubeDoll) { +function (Parent, PhysicsEngine, Settings, PlayerController, requestAnimFrame, Nc, Box2D, Player, GameObject, Doll, RagDoll) { "use strict"; @@ -20,22 +21,22 @@ function (Parent, PhysicsEngine, Settings, requestAnimFrame, nc, Box2D, Player, this.animationTimeout = null; this.worldUpdateTimeout = null; this.spawnTimeouts = []; - this.roundHasEnded = false; Parent.call(this, options); this.ncTokens = this.ncTokens.concat([ - nc.on(nc.ns.channel.events.user.joined, this.onUserJoined, this), - nc.on(nc.ns.channel.events.user.left, this.onUserLeft, this), - nc.on(nc.ns.channel.events.user.level.reset, this.onResetLevel, this), - nc.on(nc.ns.channel.events.user.client.ready, this.onClientReady, this), - nc.on(nc.ns.core.game.events.level.loaded, this.onLevelLoaded, this), - nc.on(nc.ns.channel.events.game.player.killed, this.onPlayerKilled, this), + Nc.on(Nc.ns.channel.events.user.joined, this.onUserJoined, this), + Nc.on(Nc.ns.channel.events.user.left, this.onUserLeft, this), + Nc.on(Nc.ns.channel.events.user.level.reset, this.onResetLevel, this), + Nc.on(Nc.ns.channel.events.user.client.ready, this.onClientReady, this), + Nc.on(Nc.ns.core.game.events.level.loaded, this.onLevelLoaded, this), + Nc.on(Nc.ns.channel.events.game.player.killed, this.onPlayerKilled, this), ]); console.checkpoint('starting game controller for channel (' + options.channelName + ')'); } + GameController.prototype = Object.create(Parent.prototype); GameController.prototype.update = function () { @@ -58,28 +59,15 @@ function (Parent, PhysicsEngine, Settings, requestAnimFrame, nc, Box2D, Player, this.createPlayer(user); } - GameController.prototype.onUserLeft = function (userId) { - var player = this.players[userId]; - this.clearItemsOfPlayerFingerPrints(player); - Parent.prototype.onUserLeft.call(this, userId); - }; - - GameController.prototype.clearItemsOfPlayerFingerPrints = function(player) { - nc.trigger(nc.ns.channel.events.game.player.clearFingerPrints, player); - }; - GameController.prototype.createPlayer = function(user) { - - var revealedGameController = { - isInBetweenRounds: this.isInBetweenRounds.bind(this) - }; - var player = Parent.prototype.createPlayer.call(this, user, revealedGameController); + var player = Parent.prototype.createPlayer.call(this, user); + player.setPlayerController(new PlayerController(player)) user.setPlayer(player); }; GameController.prototype.onPlayerKilled = function(player, killedByPlayer) { if(killedByPlayer.stats.score >= this.options.scoreLimit) { - nc.trigger(nc.ns.channel.events.round.end); + Nc.trigger(Nc.ns.channel.events.round.end); } else { this.spawnPlayer(player, Settings.RESPAWN_TIME); } @@ -95,6 +83,8 @@ function (Parent, PhysicsEngine, Settings, requestAnimFrame, nc, Box2D, Player, var spawnTimeout = setTimeout(function() { player.spawn(spawnPoint.x, spawnPoint.y); + // put it into + self.gameObjects.animated.push(player); var options = { id: player.id, @@ -102,7 +92,7 @@ function (Parent, PhysicsEngine, Settings, requestAnimFrame, nc, Box2D, Player, y: spawnPoint.y }; - nc.trigger(nc.ns.channel.to.client.gameCommand.broadcast, "spawnPlayer", options); + Nc.trigger(Nc.ns.channel.to.client.gameCommand.broadcast, "spawnPlayer", options); var i = self.spawnTimeouts.indexOf(spawnTimeout); self.spawnTimeouts.splice(i, 1); @@ -117,7 +107,7 @@ function (Parent, PhysicsEngine, Settings, requestAnimFrame, nc, Box2D, Player, var update = this.getWorldUpdateObject(false); if(Object.getOwnPropertyNames(update).length > 0) { - nc.trigger(nc.ns.channel.to.client.gameCommand.broadcast, "worldUpdate", update); + Nc.trigger(Nc.ns.channel.to.client.gameCommand.broadcast, "worldUpdate", update); } this.worldUpdateTimeout = setTimeout(this.updateWorld.bind(this), Settings.NETWORK_UPDATE_INTERVAL); @@ -128,7 +118,6 @@ function (Parent, PhysicsEngine, Settings, requestAnimFrame, nc, Box2D, Player, var update = {}; -/* var body = this.physicsEngine.world.GetBodyList(); do { if((getSleeping || body.IsAwake()) && body.GetType() === Box2D.Dynamics.b2Body.b2_dynamicBody) { @@ -136,33 +125,22 @@ function (Parent, PhysicsEngine, Settings, requestAnimFrame, nc, Box2D, Player, if (userData instanceof GameObject) { var gameObject = userData; - var updateData = gameObject.getUpdateData(); - - if (updateData) { - update[gameObject.uid] = updateData; + + update[gameObject.uid] = { + p: body.GetPosition(), + a: body.GetAngle(), + lv: body.GetLinearVelocity(), + av: body.GetAngularVelocity() + }; + + if(gameObject instanceof Doll) { + update[gameObject.uid].as = gameObject.getActionState(); + update[gameObject.uid].laxy = gameObject.lookAtXY; } } } } while (body = body.GetNext()); -*/ - - for (var uid in this.worldUpdateObjects) { - - var gameObject = this.worldUpdateObjects[uid]; - - if (!(gameObject instanceof GameObject)) { - console.warn('Cant find object ' + uid + ' in worldUpdateObjects pool (channel side), here is the object:'); - console.log(gameObject); - continue; - } - - var updateData = gameObject.getUpdateData(getSleeping); - - if (updateData) { - update[gameObject.uid] = updateData; - } - } return update; }; @@ -190,36 +168,23 @@ function (Parent, PhysicsEngine, Settings, requestAnimFrame, nc, Box2D, Player, return spawnedPlayers; }; - GameController.prototype._getRuntimeItems = function() { + GameController.prototype.getRuntimeItems = function() { + var objects = []; - var runtimeItems = []; - for (var uid in this.worldUpdateObjects) { - if(this.worldUpdateObjects[uid] instanceof RubeDoll) { - var object = this.worldUpdateObjects[uid]; - runtimeItems.push(object); + for (var i = 0; i < this.gameObjects.animated.length; i++) { + if(this.gameObjects.animated[i] instanceof RagDoll) { + var object = this.gameObjects.animated[i]; + var options = object.options; + options.x = object.getPosition().x; + options.y = object.getPosition().y; + objects.push({ + uid: object.uid, + options: object.options + }); } } - return runtimeItems; - }; - GameController.prototype.gatherRuntimeItemsForWorldUpdate = function() { - var infos = []; - var runtimeItems = this._getRuntimeItems(); - - // On the other side this is using the level.createItem mechanism to - // create the RubeDoll from its ItemSettings - for (var i = 0; i < runtimeItems.length; i++) { - var object = runtimeItems[i]; - var options = object.options; - options.x = object.getPosition().x; - options.y = object.getPosition().y; - infos.push({ - uid: object.uid, - options: object.options - }); - } - - return infos; + return objects; }; GameController.prototype.onClientReady = function(userId) { @@ -228,34 +193,22 @@ function (Parent, PhysicsEngine, Settings, requestAnimFrame, nc, Box2D, Player, var options = { spawnedPlayers: this.getSpawnedPlayersAndTheirPositions(), worldUpdate: this.getWorldUpdateObject(true), - runtimeItems: this.gatherRuntimeItemsForWorldUpdate(), + runtimeItems: this.getRuntimeItems(), userId: userId }; - nc.trigger(nc.ns.channel.to.client.user.gameCommand.send + userId, "clientReadyResponse", options); + Nc.trigger(Nc.ns.channel.to.client.user.gameCommand.send + userId, "clientReadyResponse", options); this.spawnPlayer(player, 0); }; - GameController.prototype.endRound = function() { - this.roundHasEnded = true; - - for(var id in this.players) { - this.players[id].setInBetweenRounds(true); - } - }; - - GameController.prototype.isInBetweenRounds = function() { - return this.roundHasEnded; - }; - // FIXME: remove this method GameController.prototype.onResetLevel = function(userId) { console.log('OH NO!!! ON RESET LEVEL IS CALLED AND RESPAWNES PLAYERS'); Parent.prototype.onResetLevel.call(this); - nc.trigger(nc.ns.channel.to.client.gameCommand.broadcast, "resetLevel", true); + Nc.trigger(Nc.ns.channel.to.client.gameCommand.broadcast, "resetLevel", true); for (var key in this.players) { this.spawnPlayer(this.players[key]); } @@ -269,11 +222,6 @@ function (Parent, PhysicsEngine, Settings, requestAnimFrame, nc, Box2D, Player, clearTimeout(this.spawnTimeouts[i]); }; - var runtimeItems = this._getRuntimeItems(); - for (var i = 0; i < runtimeItems.length; i++) { - runtimeItems[i].destroy(); - } - Parent.prototype.destroy.call(this); }; diff --git a/app/Game/Channel/GameObjects/Doll.js b/app/Game/Channel/GameObjects/Doll.js index 572beac..1b93440 100755 --- a/app/Game/Channel/GameObjects/Doll.js +++ b/app/Game/Channel/GameObjects/Doll.js @@ -6,7 +6,7 @@ define([ "Lib/Utilities/Assert" ], -function (Parent, Item, Box2D, nc, Assert) { +function (Parent, Item, Box2D, Nc, Assert) { "use strict"; @@ -54,7 +54,6 @@ function (Parent, Item, Box2D, nc, Assert) { var b2Math = Box2D.Common.Math.b2Math; var absItemVelocity = b2Math.AbsV(itemVelocity); var min = 1; - var damage = 0; if(absItemVelocity.x > min || absItemVelocity.y > min) { if(item.lastMoved && item.lastMoved.player != this.player) { @@ -73,21 +72,18 @@ function (Parent, Item, Box2D, nc, Assert) { // + 0.5 and / 2: offsetting for lower velocity impact // * 300: tested imperically by throwing piano from deadly height // * 80: tested imperically by throwing knife fast - damage = (velocityDamage + 0.5) * (weightDamage * 300 + dangerDamage * 80) / 2; + var damage = (velocityDamage + 0.5) * (weightDamage * 300 + dangerDamage * 80) / 2; var lastMovedPlayer = item.lastMoved.player; var callback = function() { self.player.addDamage(damage, lastMovedPlayer, item); }; - nc.trigger(nc.ns.channel.engine.worldQueue.add, callback); + Nc.trigger(Nc.ns.channel.engine.worldQueue.add, callback); } } - // only set lastMovedBy if player wasn't hurt by collision - if (damage === 0) { - item.setLastMovedBy(this.player); - } + item.setLastMovedBy(this.player); } } } @@ -102,18 +98,6 @@ function (Parent, Item, Box2D, nc, Assert) { this.body.SetLinearVelocity(update.lv); } }; - - Doll.prototype.getUpdateData = function(getSleeping) { - - var updateData = Parent.prototype.getUpdateData.call(this, getSleeping); - - if(updateData) { - updateData.as = this.getActionState(); - updateData.laxy = this.lookAtXY; - } - - return updateData; - }; return Doll; diff --git a/app/Game/Channel/GameObjects/GameObject.js b/app/Game/Channel/GameObjects/GameObject.js index 5d51afb..03b2a9b 100755 --- a/app/Game/Channel/GameObjects/GameObject.js +++ b/app/Game/Channel/GameObjects/GameObject.js @@ -1,39 +1,9 @@ define([ - "Game/Core/GameObjects/GameObject", - "Lib/Vendor/Box2D" + "Game/Core/GameObjects/GameObject" ], -function (Parent, Box2D) { +function(Parent) { - "use strict"; + return Parent; - function GameObject(physicsEngine, uid) { - Parent.call(this, physicsEngine, uid); - } - - GameObject.prototype = Object.create(Parent.prototype); - - GameObject.prototype.getUpdateData = function(getSleeping) { - - if (!this.body) { - return null; - } - - if (this.body.GetType() === Box2D.Dynamics.b2Body.b2_staticBody) { - return null; - } - - if (!getSleeping && !this.body.IsAwake()) { - return null; - } - - return { - p: this.body.GetPosition(), - a: this.body.GetAngle(), - lv: this.body.GetLinearVelocity(), - av: this.body.GetAngularVelocity() - }; - } - - return GameObject; }); \ No newline at end of file diff --git a/app/Game/Channel/GameObjects/Item.js b/app/Game/Channel/GameObjects/Item.js index 0bdb334..ce30779 100755 --- a/app/Game/Channel/GameObjects/Item.js +++ b/app/Game/Channel/GameObjects/Item.js @@ -1,9 +1,8 @@ define([ - "Game/Core/GameObjects/Item", - "Lib/Utilities/NotificationCenter", + "Game/Core/GameObjects/Item" ], -function (Parent, nc) { +function (Parent) { "use strict"; @@ -11,17 +10,10 @@ function (Parent, nc) { Parent.call(this, physicsEngine, uid, options); this.heldByPlayers = []; this.lastMoved = null; - - this.ncTokens = (this.ncTokens || []).concat([ - nc.on(nc.ns.channel.events.game.player.clearFingerPrints, this.clearOfPlayerFingerPrints, this) - ]); } Item.prototype = Object.create(Parent.prototype); - Item.prototype.getLastMovedBy = function() { - return this.lastMoved; - } Item.prototype.setLastMovedBy = function(player) { @@ -64,13 +56,6 @@ function (Parent, nc) { } }; - Item.prototype.clearOfPlayerFingerPrints = function(player) { - if (this.getLastMovedBy() && this.getLastMovedBy().player === player) { - console.checkpoint('Removing fingerprints from ' + this.options.image); - this.setLastMovedBy(null); - } - }; - Item.prototype.onCollisionChange = function(isColliding, fixture) { if(isColliding) { diff --git a/app/Game/Channel/GameObjects/Items/RagDoll.js b/app/Game/Channel/GameObjects/Items/RagDoll.js index 1c02792..9576a73 100644 --- a/app/Game/Channel/GameObjects/Items/RagDoll.js +++ b/app/Game/Channel/GameObjects/Items/RagDoll.js @@ -4,7 +4,7 @@ define([ "Lib/Utilities/NotificationCenter" ], -function (Parent, Settings, nc) { +function (Parent, Settings, Nc) { "use strict"; @@ -35,7 +35,7 @@ function (Parent, Settings, nc) { var self = this; this.scheduledForDestruction = true; this.destructionTimeout = setTimeout(function() { - nc.trigger(nc.ns.channel.to.client.gameCommand.broadcast, 'removeGameObject', { + Nc.trigger(Nc.ns.channel.to.client.gameCommand.broadcast, 'removeGameObject', { type: 'animated', uid: self.uid }); diff --git a/app/Game/Channel/GameObjects/Items/Rube.js b/app/Game/Channel/GameObjects/Items/Rube.js new file mode 100644 index 0000000..455467b --- /dev/null +++ b/app/Game/Channel/GameObjects/Items/Rube.js @@ -0,0 +1,11 @@ +define([ + "Game/Core/GameObjects/Items/Rube" +], + +function (Parent) { + + "use strict"; + + return Parent; + +}); \ No newline at end of file diff --git a/app/Game/Channel/GameObjects/Items/RubeDoll.js b/app/Game/Channel/GameObjects/Items/RubeDoll.js deleted file mode 100644 index c03199e..0000000 --- a/app/Game/Channel/GameObjects/Items/RubeDoll.js +++ /dev/null @@ -1,79 +0,0 @@ -define([ - "Game/Core/GameObjects/Items/RubeDoll", - "Game/Config/Settings", - "Lib/Utilities/NotificationCenter" -], - -function (Parent, Settings, nc) { - - "use strict"; - - function RubeDoll(physicsEngine, uid, options) { - this.scheduledForDestruction = false; - this.destructionTimeout = null; - - Parent.call(this, physicsEngine, uid, options); - } - - RubeDoll.prototype = Object.create(Parent.prototype); - - RubeDoll.prototype.beingGrabbed = function(player) { - Parent.prototype.beingGrabbed.call(this, player); - if(this.scheduledForDestruction) { - clearTimeout(this.destructionTimeout); - } - }; - - RubeDoll.prototype.beingReleased = function(player) { - Parent.prototype.beingReleased.call(this, player); - if(this.scheduledForDestruction) { - this.delayedDestroy(); - } - }; - - RubeDoll.prototype.delayedDestroy = function() { - var self = this; - this.scheduledForDestruction = true; - this.destructionTimeout = setTimeout(function() { - nc.trigger(nc.ns.channel.to.client.gameCommand.broadcast, 'removeGameObject', { - type: 'animated', - uid: self.uid - }); - self.destroy(); - }, Settings.RAGDOLL_DESTRUCTION_TIME * 1000); - }; - - RubeDoll.prototype.getUpdateData = function(getSleeping) { - var updateData = Parent.prototype.getUpdateData.call(this, getSleeping); - - // if parent is asleep it sends null, to do no update - if(!updateData) { - return updateData; - } - - // adding limb update data - var limbUpdateData = {}; - - for(var name in this.limbs) { - limbUpdateData[name] = { - p: this.limbs[name].GetPosition(), - a: this.limbs[name].GetAngle(), - lv: this.limbs[name].GetLinearVelocity(), - av: this.limbs[name].GetAngularVelocity() - }; - } - updateData['limbs'] = limbUpdateData; - - return updateData; - } - - RubeDoll.prototype.destroy = function() { - if(this.scheduledForDestruction) { - clearTimeout(this.destructionTimeout); - } - Parent.prototype.destroy.call(this); - }; - - return RubeDoll; - -}); \ No newline at end of file diff --git a/app/Game/Channel/Loader/Level.js b/app/Game/Channel/Loader/Level.js index 4271cd3..855fea3 100755 --- a/app/Game/Channel/Loader/Level.js +++ b/app/Game/Channel/Loader/Level.js @@ -8,8 +8,8 @@ function (Parent, Settings, FileSystem) { "use strict"; - function Level (uid, engine) { - Parent.call(this, uid, engine); + function Level (uid, engine, gameObjects) { + Parent.call(this, uid, engine, gameObjects); } Level.prototype = Object.create(Parent.prototype); diff --git a/app/Game/Channel/PipeToServer.js b/app/Game/Channel/PipeToServer.js index c25e34d..760a08b 100755 --- a/app/Game/Channel/PipeToServer.js +++ b/app/Game/Channel/PipeToServer.js @@ -5,7 +5,7 @@ define([ "fs" ], -function (nc, Channel, Settings, fs) { +function (Nc, Channel, Settings, fs) { "use strict"; @@ -14,7 +14,7 @@ function (nc, Channel, Settings, fs) { this.process = process; this.recordingFileName = null; - nc.on(nc.ns.channel.to.server.controlCommand.send, this.send, this); + Nc.on(Nc.ns.channel.to.server.controlCommand.send, this.send, this); process.on("message", this.onProcessMessage.bind(this)); } @@ -82,10 +82,10 @@ function (nc, Channel, Settings, fs) { PipeToServer.prototype.onMessage = function (message) { switch(message.recipient) { case "channel": - nc.trigger(nc.ns.channel.events.controlCommand.channel, message); + Nc.trigger(Nc.ns.channel.events.controlCommand.channel, message); break; default: - nc.trigger(nc.ns.channel.events.controlCommand.user + message.recipient, message); + Nc.trigger(Nc.ns.channel.events.controlCommand.user + message.recipient, message); break; } diff --git a/app/Game/Channel/Player.js b/app/Game/Channel/Player.js index 7c32014..eb0bf2b 100755 --- a/app/Game/Channel/Player.js +++ b/app/Game/Channel/Player.js @@ -1,17 +1,14 @@ define([ "Game/Core/Player", - "Lib/Utilities/NotificationCenter", - "Game/Channel/Control/PlayerController" + "Lib/Utilities/NotificationCenter" ], -function (Parent, nc, PlayerController) { +function (Parent, Nc) { "use strict"; - function Player(id, physicsEngine, user, revealedGameController) { - Parent.call(this, id, physicsEngine, user, revealedGameController); - - this.playerController = new PlayerController(this); + function Player(id, physicsEngine, user) { + Parent.call(this, id, physicsEngine, user); } Player.prototype = Object.create(Parent.prototype); @@ -44,7 +41,7 @@ function (Parent, nc, PlayerController) { this.throw(options, item); options.action = "throw"; - nc.trigger(nc.ns.channel.to.client.gameCommand.broadcast, "handActionResponse", options); + Nc.trigger(Nc.ns.channel.to.client.gameCommand.broadcast, "handActionResponse", options); } } else { // grab @@ -52,7 +49,7 @@ function (Parent, nc, PlayerController) { this.grab(item); options.action = "grab"; - nc.trigger(nc.ns.channel.to.client.gameCommand.broadcast, "handActionResponse", options); + Nc.trigger(Nc.ns.channel.to.client.gameCommand.broadcast, "handActionResponse", options); } } }; @@ -64,12 +61,6 @@ function (Parent, nc, PlayerController) { }; Player.prototype.addDamage = function(damage, enemy, byItem) { - - // Prevent stats change (kills) after round has ended - if (this.revealedGameController.isInBetweenRounds()) { - return; - } - this.stats.health -= damage; if(this.stats.health < 0) this.stats.health = 0; @@ -93,14 +84,14 @@ function (Parent, nc, PlayerController) { var ragDollId = this.stats.deaths; Parent.prototype.kill.call(this, killedByPlayer, ragDollId); - nc.trigger(nc.ns.channel.to.client.gameCommand.broadcast, "playerKill", { + Nc.trigger(Nc.ns.channel.to.client.gameCommand.broadcast, "playerKill", { playerId: this.id, killedByPlayerId: killedByPlayer.id, ragDollId: ragDollId, item: byItem ? byItem.options.name : "Suicide" }); - nc.trigger(nc.ns.channel.events.game.player.killed, this, killedByPlayer); // sends endround + Nc.trigger(Nc.ns.channel.events.game.player.killed, this, killedByPlayer); // sends endround if(this.ragDoll) { this.ragDoll.delayedDestroy(); @@ -112,18 +103,19 @@ function (Parent, nc, PlayerController) { }; Player.prototype.broadcastStats = function(enemy) { - nc.trigger(nc.ns.channel.to.client.gameCommand.broadcast, "updateStats", { + Nc.trigger(Nc.ns.channel.to.client.gameCommand.broadcast, "updateStats", { playerId: this.id, stats: this.stats }); if(enemy && enemy != this) { - nc.trigger(nc.ns.channel.to.client.gameCommand.broadcast, "updateStats", { + Nc.trigger(Nc.ns.channel.to.client.gameCommand.broadcast, "updateStats", { playerId: enemy.id, stats: enemy.stats }); } }; + return Player; diff --git a/app/Game/Channel/User.js b/app/Game/Channel/User.js index fe8b56e..1bc4b60 100755 --- a/app/Game/Channel/User.js +++ b/app/Game/Channel/User.js @@ -5,7 +5,7 @@ define([ "Lib/Utilities/Protocol/Parser", ], -function(Parent, nc, ProtocolHelper, ProtocolParser) { +function(Parent, Nc, ProtocolHelper, ProtocolParser) { function User(id, options) { Parent.call(this, id, options); @@ -14,15 +14,15 @@ function(Parent, nc, ProtocolHelper, ProtocolParser) { this.isReady = false; var self = this; - nc.on(nc.ns.channel.to.client.user.controlCommand.joinSuccess + this.id, function(options) { + Nc.on(Nc.ns.channel.to.client.user.controlCommand.joinSuccess + this.id, function(options) { self.sendControlCommand("joinSuccess", options); }); - nc.on(nc.ns.channel.events.controlCommand.user + this.id, function(message) { + Nc.on(Nc.ns.channel.events.controlCommand.user + this.id, function(message) { ProtocolHelper.applyCommand(message.data, self); }); - nc.on(nc.ns.channel.to.client.user.gameCommand.send + this.id, function(command, options) { + Nc.on(Nc.ns.channel.to.client.user.gameCommand.send + this.id, function(command, options) { self.sendGameCommand(command, options); }); @@ -44,10 +44,10 @@ function(Parent, nc, ProtocolHelper, ProtocolParser) { } // FIXME: move this to Protocol helper as a function if(command.hasOwnProperty("resetLevel")) { - nc.trigger(nc.ns.channel.events.user.level.reset, this.id); + Nc.trigger(Nc.ns.channel.events.user.level.reset, this.id); } else if(command.hasOwnProperty("clientReady")) { this.isReady = true; - nc.trigger(nc.ns.channel.events.user.client.ready, this.id); + Nc.trigger(Nc.ns.channel.events.user.client.ready, this.id); } else { this.player.playerController.applyCommand(command); } @@ -61,17 +61,7 @@ function(Parent, nc, ProtocolHelper, ProtocolParser) { var recipient = this.id; var data = ProtocolHelper.encodeCommand(command, options); - /** - * Listen for beginRound control command - * to set client to be unready again - * so it can load its new level without getting - * any gameCommands like worldUpdate - */ - if(command == "beginRound") { - this.isReady = false; - } - - nc.trigger(nc.ns.channel.to.server.controlCommand.send, recipient, data); + Nc.trigger(Nc.ns.channel.to.server.controlCommand.send, recipient, data); }; User.prototype.sendGameCommand = function(command, options) { diff --git a/app/Game/Client/Control/Input.js b/app/Game/Client/Control/Input.js index b163541..242a689 100755 --- a/app/Game/Client/Control/Input.js +++ b/app/Game/Client/Control/Input.js @@ -2,7 +2,7 @@ define([ "Lib/Utilities/NotificationCenter" ], -function (nc) { +function (Nc) { function Input(playerController) { this.playerController = playerController; diff --git a/app/Game/Client/Control/Inputs/KeyboardAndMouse.js b/app/Game/Client/Control/Inputs/KeyboardAndMouse.js index 50af8a1..998e94f 100644 --- a/app/Game/Client/Control/Inputs/KeyboardAndMouse.js +++ b/app/Game/Client/Control/Inputs/KeyboardAndMouse.js @@ -6,7 +6,7 @@ define([ "Game/Client/Control/Swiper" ], -function (Parent, KeyboardInput, domController, Settings, Swiper) { +function (Parent, KeyboardInput, DomController, Settings, Swiper) { "use strict"; @@ -122,7 +122,7 @@ function (Parent, KeyboardInput, domController, Settings, Swiper) { }; KeyboardAndMouse.prototype.mouseInit = function() { - var canvas = domController.getCanvas(); + var canvas = DomController.getCanvas(); var self = this; canvas.onmousedown = function(e) { @@ -216,7 +216,6 @@ function (Parent, KeyboardInput, domController, Settings, Swiper) { KeyboardAndMouse.prototype.activateModifier = function() { this.modifier = true; - this.playerController.activateModifier(); }; KeyboardAndMouse.prototype.deactivateModifier = function() { @@ -224,7 +223,6 @@ function (Parent, KeyboardInput, domController, Settings, Swiper) { this.x = this.lastLookDirection * Settings.VIEWPORT_LOOK_AHEAD; this.y = 0; this.onXyChange(this.x, this.y); - this.playerController.deactivateModifier(); }; return KeyboardAndMouse; diff --git a/app/Game/Client/Control/PlayerController.js b/app/Game/Client/Control/PlayerController.js index 82db175..02a9d92 100755 --- a/app/Game/Client/Control/PlayerController.js +++ b/app/Game/Client/Control/PlayerController.js @@ -6,7 +6,7 @@ define([ "Game/Client/PointerLockManager" ], -function (Parent, nc, KeyboardAndMouse, Gamepad, pointerLockManager) { +function (Parent, Nc, KeyboardAndMouse, Gamepad, PointerLockManager) { "use strict"; @@ -27,98 +27,76 @@ function (Parent, nc, KeyboardAndMouse, Gamepad, pointerLockManager) { }; PlayerController.prototype.moveLeft = function () { - if (!this.isPlayerInputAllowed()) return; + if (!PointerLockManager.isLocked()) return; Parent.prototype.moveLeft.call(this); - nc.trigger(nc.ns.client.to.server.gameCommand.send, 'moveLeft'); + Nc.trigger(Nc.ns.client.to.server.gameCommand.send, 'moveLeft'); } PlayerController.prototype.moveRight = function () { - if (!this.isPlayerInputAllowed()) return; + if (!PointerLockManager.isLocked()) return; Parent.prototype.moveRight.call(this); - nc.trigger(nc.ns.client.to.server.gameCommand.send, 'moveRight'); + Nc.trigger(Nc.ns.client.to.server.gameCommand.send, 'moveRight'); } - // always allow to stop, to prevent endless running PlayerController.prototype.stop = function () { Parent.prototype.stop.call(this); - nc.trigger(nc.ns.client.to.server.gameCommand.send, 'stop'); + Nc.trigger(Nc.ns.client.to.server.gameCommand.send, 'stop'); } PlayerController.prototype.jump = function () { - if (!this.isPlayerInputAllowed()) return; + if (!PointerLockManager.isLocked()) return; Parent.prototype.jump.call(this); - nc.trigger(nc.ns.client.to.server.gameCommand.send, 'jump'); + Nc.trigger(Nc.ns.client.to.server.gameCommand.send, 'jump'); } - // always allow to stop. PlayerController.prototype.jumpStop = function () { + if (!PointerLockManager.isLocked()) return; Parent.prototype.jumpStop.call(this); - nc.trigger(nc.ns.client.to.server.gameCommand.send, 'jumpStop'); + Nc.trigger(Nc.ns.client.to.server.gameCommand.send, 'jumpStop'); } PlayerController.prototype.setXY = function(x, y) { - if (!this.isPlayerInputAllowed()) return; + if (!PointerLockManager.isLocked()) return; var options = {x:x, y:y}; Parent.prototype.lookAt.call(this, options); - nc.trigger(nc.ns.client.to.server.gameCommand.send, 'lookAt', options); + Nc.trigger(Nc.ns.client.to.server.gameCommand.send, 'lookAt', options); }; PlayerController.prototype.suicide = function() { - if (!this.isPlayerInputAllowed()) return; - nc.trigger(nc.ns.client.to.server.gameCommand.send, "suicide"); + if (!PointerLockManager.isLocked()) return; + Nc.trigger(Nc.ns.client.to.server.gameCommand.send, "suicide"); }; PlayerController.prototype.handActionRequest = function(options) { - if (!this.isPlayerInputAllowed()) return; - nc.trigger(nc.ns.client.to.server.gameCommand.send, "handActionRequest", options); + if (!PointerLockManager.isLocked()) return; + Nc.trigger(Nc.ns.client.to.server.gameCommand.send, "handActionRequest", options); }; PlayerController.prototype.showInfo = function() { - if (!this.isPlayerInputAllowed()) return; - nc.trigger(nc.ns.client.game.gameStats.toggle, true); + if (!PointerLockManager.isLocked()) return; + Nc.trigger(Nc.ns.client.game.gameStats.toggle, true); }; PlayerController.prototype.hideInfo = function() { - if (!this.isPlayerInputAllowed()) return; - nc.trigger(nc.ns.client.game.gameStats.toggle, false); + if (!PointerLockManager.isLocked()) return; + Nc.trigger(Nc.ns.client.game.gameStats.toggle, false); }; PlayerController.prototype.zoomIn = function() { - if (!this.isPlayerInputAllowed()) return; - nc.trigger(nc.ns.client.game.zoomIn, true); + if (!PointerLockManager.isLocked()) return; + Nc.trigger(Nc.ns.client.game.zoomIn, true); }; PlayerController.prototype.zoomOut = function() { - if (!this.isPlayerInputAllowed()) return; - nc.trigger(nc.ns.client.game.zoomOut, false); + if (!PointerLockManager.isLocked()) return; + Nc.trigger(Nc.ns.client.game.zoomOut, false); }; PlayerController.prototype.zoomReset = function() { - if (!this.isPlayerInputAllowed()) return; - nc.trigger(nc.ns.client.game.zoomReset, false); + if (!PointerLockManager.isLocked()) return; + Nc.trigger(Nc.ns.client.game.zoomReset, false); }; - - PlayerController.prototype.activateModifier = function() { - if (!this.isPlayerInputAllowed()) return; - Parent.prototype.activateModifier.call(this); - nc.trigger(nc.ns.client.to.server.gameCommand.send, "activateModifier"); - }; - - PlayerController.prototype.deactivateModifier = function() { - if (!this.isPlayerInputAllowed()) return; - Parent.prototype.deactivateModifier.call(this); - nc.trigger(nc.ns.client.to.server.gameCommand.send, "deactivateModifier"); - }; - - /* - * Client overwrite - allow player input if PointerLock is locked to canvas - * and is not in between games - */ - PlayerController.prototype.isPlayerInputAllowed = function() { - return pointerLockManager.isLocked() - && Parent.prototype.isPlayerInputAllowed.call(this); - }; - + return PlayerController; }); \ No newline at end of file diff --git a/app/Game/Client/Control/Swiper.js b/app/Game/Client/Control/Swiper.js index 7e0909f..5017639 100644 --- a/app/Game/Client/Control/Swiper.js +++ b/app/Game/Client/Control/Swiper.js @@ -2,7 +2,7 @@ define([ "Lib/Utilities/NotificationCenter", ], -function (nc) { +function (Nc) { var MAX_LENGTH = 200; var MIN_LENGTH = 5; @@ -42,7 +42,7 @@ function (nc) { } var i = points.length - 1; - nc.trigger(nc.ns.client.view.swiper.swipe, points[i].x, points[i].y); + Nc.trigger(Nc.ns.client.view.swiper.swipe, points[i].x, points[i].y); } Swiper.prototype.updateLengthSum = function(currentLength) { @@ -135,7 +135,7 @@ function (nc) { var sumx = 0; var sumy = 0; - nc.trigger(nc.ns.client.view.swiper.end); + Nc.trigger(Nc.ns.client.view.swiper.end); for(var i=0, count = this.points.length; i < count; i++) { var p = this.points[i]; @@ -166,7 +166,7 @@ function (nc) { Swiper.prototype.destroy = function() { for (var i = 0; i < this.ncTokens.length; i++) { - nc.off(this.ncTokens[i]); + Nc.off(this.ncTokens[i]); }; }; diff --git a/app/Game/Client/GameController.js b/app/Game/Client/GameController.js index 9d85885..8b01659 100755 --- a/app/Game/Client/GameController.js +++ b/app/Game/Client/GameController.js @@ -18,7 +18,7 @@ define([ "Lib/Utilities/Exception" ], -function (Parent, Box2D, PhysicsEngine, ViewManager, PlayerController, nc, requestAnimFrame, Settings, GameObject, Doll, domController, ProtocolHelper, Me, AudioPlayer, pointerLockManager, Assert, Exception) { +function (Parent, Box2D, PhysicsEngine, ViewManager, PlayerController, Nc, requestAnimFrame, Settings, GameObject, Doll, DomController, ProtocolHelper, Me, AudioPlayer, PointerLockManager, Assert, Exception) { "use strict"; @@ -33,7 +33,7 @@ function (Parent, Box2D, PhysicsEngine, ViewManager, PlayerController, nc, reque Parent.call(this, options); this.ncTokens = this.ncTokens.concat([ - nc.on(nc.ns.client.game.gameStats.toggle, this.toggleGameStats, this) + Nc.on(Nc.ns.client.game.gameStats.toggle, this.toggleGameStats, this) ]); } @@ -52,34 +52,43 @@ function (Parent, Box2D, PhysicsEngine, ViewManager, PlayerController, nc, reque if(this.me) { this.me.update(); - this.mePositionStateOverride(); + this.mePositionStateUpdate(); } - nc.trigger(nc.ns.client.game.events.render); + for (var i = 0; i < this.gameObjects.animated.length; i++) { + this.gameObjects.animated[i].render(); + } this.view.render(); - domController.fpsStep(); + DomController.fpsStep(); }; - GameController.prototype.mePositionStateOverride = function() { - if(this.me.isPositionStateOverrideNeeded()) { - nc.trigger( - nc.ns.client.to.server.gameCommand.send, - "mePositionStateOverride", - this.me.getPositionStateOverride() - ); + GameController.prototype.mePositionStateUpdate = function() { + if(this.me.isPositionStateUpdateNeeded()) { + Nc.trigger(Nc.ns.client.to.server.gameCommand.send, "mePositionStateUpdate", this.me.getPositionStateUpdate()); } }; GameController.prototype.onClientReadyResponse = function(options) { var i; + if (options.worldUpdate) { + this.onWorldUpdate(options.worldUpdate); + } + if (options.runtimeItems) { for (i = 0; i < options.runtimeItems.length; i++) { - var itemDef = options.runtimeItems[i]; - if(!this.getItemByUid(itemDef.uid)) { + var alreadyExists = false; + for (var j = 0; j < this.gameObjects.animated.length; j++) { + if(this.gameObjects.animated[j].uid == itemDef.uid) { + alreadyExists = true; + break; + } + } + + if(!alreadyExists) { // When creating from synchronization we need to bring it into level format (px) itemDef.options.x *= Settings.RATIO; itemDef.options.y *= Settings.RATIO; @@ -99,21 +108,10 @@ function (Parent, Box2D, PhysicsEngine, ViewManager, PlayerController, nc, reque } } - if (options.worldUpdate) { // needs to stay after onSpawnPlayer otherwise others doll will not be there - this.onWorldUpdate(options.worldUpdate); - } - //this.audioPlayer = new AudioPlayer(Settings.AUDIO_PATH + "city.mp3"); //this.audioPlayer.play(); }; - - /* - - TODO : - - remove this - - overwrite setUpdateData inside client / Me with an empty function - GameController.prototype.onWorldUpdateGameObject = function(body, gameObject, update) { if(gameObject === this.me.doll) { this.me.setLastServerPositionState(update); @@ -124,22 +122,6 @@ function (Parent, Box2D, PhysicsEngine, ViewManager, PlayerController, nc, reque Parent.prototype.onWorldUpdateGameObject.call(this, body, gameObject, update); }; - */ - - GameController.prototype.onRemoveGameObject = function(options) { - - }; - - GameController.prototype.updateGameObject = function (gameObject, gameObjectUpdate) { - if(gameObject === this.me.doll) { - this.me.setLastServerPositionState(gameObjectUpdate); - if(!this.me.acceptPositionStateUpdateFromServer()) { - return; // this is to ignore own doll updates from world update - } - } - - Parent.prototype.updateGameObject.call(this, gameObject, gameObjectUpdate); - } GameController.prototype.createMe = function(user) { this.me = new Me(user.id, this.physicsEngine, user); @@ -147,6 +129,7 @@ function (Parent, Box2D, PhysicsEngine, ViewManager, PlayerController, nc, reque }; GameController.prototype.setMe = function() { + this.me.setPlayerController(new PlayerController(this.me)); this.view.setMe(this.me); }; @@ -178,7 +161,15 @@ function (Parent, Box2D, PhysicsEngine, ViewManager, PlayerController, nc, reque GameController.prototype.onHandActionResponse = function(options) { var player = this.players[options.playerId]; - var item = this.getItemByUid(options.itemUid); + + var item = null; + for (var i = 0; i < this.gameObjects.animated.length; i++) { + var currentItem = this.gameObjects.animated[i]; + if(currentItem.uid == options.itemUid) { + item = currentItem; + break; + } + } if(item) { if(options.action == "throw") { @@ -214,7 +205,7 @@ function (Parent, Box2D, PhysicsEngine, ViewManager, PlayerController, nc, reque return 0; }); - nc.trigger(nc.ns.client.view.gameStats.update, sortedPlayers); + Nc.trigger(Nc.ns.client.view.gameStats.update, sortedPlayers); }; GameController.prototype.onPlayerKill = function(options) { @@ -222,7 +213,7 @@ function (Parent, Box2D, PhysicsEngine, ViewManager, PlayerController, nc, reque var killedByPlayer = this.players[options.killedByPlayerId]; player.kill(killedByPlayer, options.ragDollId); - nc.trigger(nc.ns.client.view.gameStats.kill, { + Nc.trigger(Nc.ns.client.view.gameStats.kill, { victim: { name: player.user.options.nickname, isMe: player === this.me @@ -239,25 +230,32 @@ function (Parent, Box2D, PhysicsEngine, ViewManager, PlayerController, nc, reque this.me.resetPositionState(options); }; + GameController.prototype.onRemoveGameObject = function(options) { + var object = null; + for (var i = 0; i < this.gameObjects[options.type].length; i++) { + if(this.gameObjects[options.type][i].uid == options.uid) { + object = this.gameObjects[options.type][i]; + break; + } + } + if(object) { + //this.onGameObjectRemove(options.type, object); + object.destroy(); + } else { + console.warn("GameObject for removal can not be found locally. " + options.uid); + } + }; + GameController.prototype.loadLevel = function (path) { Parent.prototype.loadLevel.call(this, path); }; GameController.prototype.onLevelLoaded = function () { - pointerLockManager.update(null, {start:true}); + PointerLockManager.update(null, {start:true}); }; GameController.prototype.toggleGameStats = function(show) { - nc.trigger(nc.ns.client.view.gameStats.toggle, show); - }; - - GameController.prototype.beginRound = function() { - this.me.setInBetweenRounds(false); - }; - - GameController.prototype.endRound = function() { - this.me.setInBetweenRounds(true); - this.toggleGameStats(true); + Nc.trigger(Nc.ns.client.view.gameStats.toggle, show); }; GameController.prototype.destroy = function() { diff --git a/app/Game/Client/GameObjects/Doll.js b/app/Game/Client/GameObjects/Doll.js index a5ea6b4..a617746 100755 --- a/app/Game/Client/GameObjects/Doll.js +++ b/app/Game/Client/GameObjects/Doll.js @@ -7,7 +7,7 @@ define([ "Game/Client/View/Abstract/Layer", ], -function (Parent, Settings, nc, Exception, ColorConverter, Layer) { +function (Parent, Settings, Nc, Exception, ColorConverter, Layer) { "use strict"; @@ -50,14 +50,14 @@ function (Parent, Settings, nc, Exception, ColorConverter, Layer) { if(!state) throw new Exception("action state is undefined"); if(this.animatedMeshes[this.actionState]) { - nc.trigger( - nc.ns.client.view.mesh.update, + Nc.trigger( + Nc.ns.client.view.mesh.update, this.layerId, this.animatedMeshesContainer.withArms[this.actionState], { visible: false } ); - nc.trigger( - nc.ns.client.view.mesh.update, + Nc.trigger( + Nc.ns.client.view.mesh.update, this.layerId, this.animatedMeshesContainer.withoutArms[this.actionState], { visible: false } @@ -66,8 +66,8 @@ function (Parent, Settings, nc, Exception, ColorConverter, Layer) { Parent.prototype.setActionState.call(this, state); - nc.trigger( - nc.ns.client.view.mesh.update, + Nc.trigger( + Nc.ns.client.view.mesh.update, this.layerId, this.animatedMeshes[this.actionState], { @@ -82,7 +82,7 @@ function (Parent, Settings, nc, Exception, ColorConverter, Layer) { var self = this; var setShirtColor = function (mesh) { - nc.trigger(nc.ns.client.view.mesh.addFilter, self.layerId, mesh, 'colorRangeReplace', { + Nc.trigger(Nc.ns.client.view.mesh.addFilter, self.layerId, mesh, 'colorRangeReplace', { minColor: 0x3b4a31, maxColor: 0x657f54, newColor: self.primaryColor, @@ -131,12 +131,12 @@ function (Parent, Settings, nc, Exception, ColorConverter, Layer) { var callback = function(mesh) { self.animatedMeshesContainer[arm][key] = mesh; - nc.trigger(nc.ns.client.view.mesh.add, self.layerId, mesh); + Nc.trigger(Nc.ns.client.view.mesh.add, self.layerId, mesh); setShirtColor(mesh); }; - nc.trigger(nc.ns.client.view.animatedMesh.create, this.layerId, texturePaths, callback, { + Nc.trigger(Nc.ns.client.view.animatedMesh.create, this.layerId, texturePaths, callback, { visible: false, pivot: { x: 0, @@ -159,9 +159,9 @@ function (Parent, Settings, nc, Exception, ColorConverter, Layer) { var texturePath = Settings.GRAPHICS_PATH + "Characters/Chuck/head.png"; var callback = function (mesh) { self.headMesh = mesh; - nc.trigger(nc.ns.client.view.mesh.add, self.layerId, mesh); + Nc.trigger(Nc.ns.client.view.mesh.add, self.layerId, mesh); } - nc.trigger(nc.ns.client.view.mesh.create, this.layerId, texturePath, callback, { + Nc.trigger(Nc.ns.client.view.mesh.create, this.layerId, texturePath, callback, { pivot: { x: 5, y: 12 @@ -179,10 +179,10 @@ function (Parent, Settings, nc, Exception, ColorConverter, Layer) { texturePath = Settings.GRAPHICS_PATH + "Characters/Chuck/holdingArm.png"; var callback = function (mesh) { self.holdingArmMesh = mesh; - nc.trigger(nc.ns.client.view.mesh.add, self.layerId, mesh); + Nc.trigger(Nc.ns.client.view.mesh.add, self.layerId, mesh); setShirtColor(mesh); } - nc.trigger(nc.ns.client.view.mesh.create, this.layerId, texturePath, callback, { + Nc.trigger(Nc.ns.client.view.mesh.create, this.layerId, texturePath, callback, { visible: false, pivot: { //x: 35/2 * 4, @@ -206,7 +206,7 @@ function (Parent, Settings, nc, Exception, ColorConverter, Layer) { if(oldLookDirection != this.lookDirection) { for(var key in this.animatedMeshes) { - nc.trigger(nc.ns.client.view.mesh.update, + Nc.trigger(Nc.ns.client.view.mesh.update, this.layerId, this.animatedMeshes[key], { @@ -215,7 +215,7 @@ function (Parent, Settings, nc, Exception, ColorConverter, Layer) { ); } - nc.trigger(nc.ns.client.view.mesh.update, + Nc.trigger(Nc.ns.client.view.mesh.update, this.layerId, this.holdingArmMesh, { @@ -226,7 +226,7 @@ function (Parent, Settings, nc, Exception, ColorConverter, Layer) { var angle = Math.atan2(this.lookAtXY.x, this.lookAtXY.y) / 2 - 0.7855 * this.lookDirection; // 0.7855 = 45° - nc.trigger(nc.ns.client.view.mesh.update, + Nc.trigger(Nc.ns.client.view.mesh.update, this.layerId, this.headMesh, { @@ -240,22 +240,22 @@ function (Parent, Settings, nc, Exception, ColorConverter, Layer) { Parent.prototype.grab.call(this, item); this.animatedMeshes = this.animatedMeshesContainer.withoutArms; this.setActionState(this.actionState, true); - nc.trigger(nc.ns.client.view.mesh.update, this.layerId, this.holdingArmMesh, { visible: true }); + Nc.trigger(Nc.ns.client.view.mesh.update, this.layerId, this.holdingArmMesh, { visible: true }); }; Doll.prototype.throw = function(item, options) { Parent.prototype.throw.call(this, item, options); this.animatedMeshes = this.animatedMeshesContainer.withArms; this.setActionState(this.actionState, true); - nc.trigger(nc.ns.client.view.mesh.update, this.layerId, this.holdingArmMesh, { visible: false }); + Nc.trigger(Nc.ns.client.view.mesh.update, this.layerId, this.holdingArmMesh, { visible: false }); }; Doll.prototype.destroy = function () { for (var key in this.animatedMeshes) { - nc.trigger(nc.ns.client.view.mesh.remove, this.layerId, this.animatedMeshes[key]); + Nc.trigger(Nc.ns.client.view.mesh.remove, this.layerId, this.animatedMeshes[key]); } - nc.trigger(nc.ns.client.view.mesh.remove, this.layerId, this.headMesh); + Nc.trigger(Nc.ns.client.view.mesh.remove, this.layerId, this.headMesh); Parent.prototype.destroy.call(this); } @@ -272,7 +272,7 @@ function (Parent, Settings, nc, Exception, ColorConverter, Layer) { var factor = stepLength / 30; - nc.trigger(nc.ns.client.view.mesh.update, + Nc.trigger(Nc.ns.client.view.mesh.update, this.layerId, this.animatedMeshes[this.actionState], { @@ -283,7 +283,7 @@ function (Parent, Settings, nc, Exception, ColorConverter, Layer) { } ); - nc.trigger(nc.ns.client.view.mesh.update, + Nc.trigger(Nc.ns.client.view.mesh.update, this.layerId, this.headMesh, { @@ -292,7 +292,7 @@ function (Parent, Settings, nc, Exception, ColorConverter, Layer) { } ) - nc.trigger(nc.ns.client.view.mesh.update, + Nc.trigger(Nc.ns.client.view.mesh.update, this.layerId, this.holdingArmMesh, { diff --git a/app/Game/Client/GameObjects/GameObject.js b/app/Game/Client/GameObjects/GameObject.js index f193bbc..d20405e 100755 --- a/app/Game/Client/GameObjects/GameObject.js +++ b/app/Game/Client/GameObjects/GameObject.js @@ -4,7 +4,7 @@ define([ "Lib/Utilities/NotificationCenter" ], -function (Parent, Exception, nc) { +function (Parent, Exception, Nc) { "use strict"; @@ -27,7 +27,7 @@ function (Parent, Exception, nc) { GameObject.prototype.createMesh = function() { throw new Exception('Abstract method GameObject.createMesh not overwritten'); }; - + return GameObject; }); \ No newline at end of file diff --git a/app/Game/Client/GameObjects/Item.js b/app/Game/Client/GameObjects/Item.js index f798416..f49fb8a 100755 --- a/app/Game/Client/GameObjects/Item.js +++ b/app/Game/Client/GameObjects/Item.js @@ -5,17 +5,13 @@ define([ "Game/Client/View/Abstract/Layer" ], -function (Parent, Settings, nc, Layer) { +function (Parent, Settings, Nc, Layer) { "use strict"; function Item(physicsEngine, uid, options) { this.layerId = Layer.ID.ITEM; Parent.call(this, physicsEngine, uid, options); - - this.ncTokens = this.ncTokens.concat([ - nc.on(nc.ns.client.game.events.render, this.render, this) - ]); } Item.prototype = Object.create(Parent.prototype); @@ -30,10 +26,10 @@ function (Parent, Settings, nc, Layer) { var callback = function(mesh) { self.mesh = mesh; - nc.trigger(nc.ns.client.view.mesh.add, self.layerId, mesh); + Nc.trigger(Nc.ns.client.view.mesh.add, self.layerId, mesh); } - nc.trigger(nc.ns.client.view.mesh.create, + Nc.trigger(Nc.ns.client.view.mesh.create, this.layerId, texturePath, callback, @@ -49,13 +45,13 @@ function (Parent, Settings, nc, Layer) { }; Item.prototype.destroy = function() { - nc.trigger(nc.ns.client.view.mesh.remove, this.layerId, this.mesh); + Nc.trigger(Nc.ns.client.view.mesh.remove, this.layerId, this.mesh); Parent.prototype.destroy.call(this); }; Item.prototype.render = function() { - nc.trigger(nc.ns.client.view.mesh.update, + Nc.trigger(Nc.ns.client.view.mesh.update, this.layerId, this.mesh, { @@ -72,7 +68,7 @@ function (Parent, Settings, nc, Layer) { Parent.prototype.flip.call(this, direction); if(oldFlipDirection != direction) { - nc.trigger(nc.ns.client.view.mesh.update, + Nc.trigger(Nc.ns.client.view.mesh.update, this.layerId, this.mesh, { diff --git a/app/Game/Client/GameObjects/Items/RagDoll.js b/app/Game/Client/GameObjects/Items/RagDoll.js index 73e0b83..c5bf84a 100644 --- a/app/Game/Client/GameObjects/Items/RagDoll.js +++ b/app/Game/Client/GameObjects/Items/RagDoll.js @@ -6,7 +6,7 @@ define([ "Game/Client/View/Abstract/Layer" ], -function (Parent, CoreItem, Settings, nc, Layer) { +function (Parent, CoreItem, Settings, Nc, Layer) { "use strict"; @@ -40,10 +40,10 @@ function (Parent, CoreItem, Settings, nc, Layer) { self.limbMeshes[name] = mesh; } - nc.trigger(nc.ns.client.view.mesh.add, self.layerId, mesh); + Nc.trigger(Nc.ns.client.view.mesh.add, self.layerId, mesh); } - nc.trigger(nc.ns.client.view.mesh.create, + Nc.trigger(Nc.ns.client.view.mesh.create, this.layerId, texturePath + name + ".png", callback, @@ -64,7 +64,7 @@ function (Parent, CoreItem, Settings, nc, Layer) { if(this.limbs) { for(var name in this.limbMeshes) { if(this.limbs[name]) { - nc.trigger(nc.ns.client.view.mesh.update, + Nc.trigger(Nc.ns.client.view.mesh.update, this.layerId, this.limbMeshes[name], { @@ -85,7 +85,7 @@ function (Parent, CoreItem, Settings, nc, Layer) { CoreItem.prototype.flip.call(this, direction); if(oldFlipDirection != direction) { - nc.trigger(nc.ns.client.view.mesh.update, + Nc.trigger(Nc.ns.client.view.mesh.update, this.layerId, this.mesh, { @@ -94,7 +94,7 @@ function (Parent, CoreItem, Settings, nc, Layer) { ); for (var name in this.limbMeshes) { - nc.trigger(nc.ns.client.view.mesh.update, + Nc.trigger(Nc.ns.client.view.mesh.update, this.layerId, this.limbMeshes[name], { @@ -108,7 +108,7 @@ function (Parent, CoreItem, Settings, nc, Layer) { RagDoll.prototype.destroy = function() { for (var name in this.limbMeshes) { - nc.trigger(nc.ns.client.view.mesh.remove, this.layerId, this.limbMeshes[name]); + Nc.trigger(Nc.ns.client.view.mesh.remove, this.layerId, this.limbMeshes[name]); }; Parent.prototype.destroy.call(this); diff --git a/app/Game/Client/GameObjects/Items/Rube.js b/app/Game/Client/GameObjects/Items/Rube.js new file mode 100644 index 0000000..4aa825b --- /dev/null +++ b/app/Game/Client/GameObjects/Items/Rube.js @@ -0,0 +1,28 @@ +define([ + "Game/Core/GameObjects/Items/Rube" +], + +function (Parent) { + + "use strict"; + + function Rube(physicsEngine, uid, options) { + Parent.call(this, physicsEngine, uid, options); + } + + Rube.prototype = Object.create(Parent.prototype); + + Rube.prototype.createMesh = function() { + }; + + Rube.prototype.destroy = function() { + }; + + Rube.prototype.render = function() { + } + + Rube.prototype.flip = function(direction) { + }; + + return Rube; +}); \ No newline at end of file diff --git a/app/Game/Client/GameObjects/Items/RubeDoll.js b/app/Game/Client/GameObjects/Items/RubeDoll.js deleted file mode 100644 index 6c6034b..0000000 --- a/app/Game/Client/GameObjects/Items/RubeDoll.js +++ /dev/null @@ -1,254 +0,0 @@ -define([ - "Game/Core/GameObjects/Items/RubeDoll", - "Game/Client/View/Abstract/Layer", - "Game/Config/Settings", - "Lib/Utilities/NotificationCenter", -], - -function (Parent, Layer, Settings, nc) { - - "use strict"; - - function RubeDoll(physicsEngine, uid, options) { - - this.primaryColor = options.primaryColor; - - var limbOptions = {}; - - limbOptions.chest = { - width: 6, - height: 18, - x: 0, - y: 0 - }; - - limbOptions.head = { - width: 10, - height: 12, - x: 0, - y: - limbOptions.chest.height / 2 - 7 - }; - - limbOptions.upperLeftLeg = { - width: 5, - height: 8, - x: -2, - y: limbOptions.chest.height / 2 - }; - - limbOptions.upperRightLeg = { - width: 5, - height: 8, - x: 2, - y: limbOptions.chest.height / 2 - }; - - limbOptions.lowerLeftLeg = { - width: 5, - height: 4, - x: -2, - y: limbOptions.chest.height / 2 + limbOptions.upperLeftLeg.height - }; - - limbOptions.lowerRightLeg = { - width: 5, - height: 4, - x: 2, - y: limbOptions.chest.height / 2 + limbOptions.upperRightLeg.height - }; - - - - limbOptions.upperLeftArm = { - width: 4, - height: 8, - x: -2, - y: -limbOptions.chest.height / 2 - }; - - limbOptions.upperRightArm = { - width: 4, - height: 8, - x: 2, - y: -limbOptions.chest.height / 2 - }; - - limbOptions.lowerLeftArm = { - width: 4, - height: 5, - x: -2, - y: -limbOptions.chest.height / 2 + limbOptions.upperLeftArm.height - }; - - limbOptions.lowerRightArm = { - width: 4, - height: 5, - x: 2, - y: -limbOptions.chest.height / 2 + limbOptions.upperRightArm.height - }; - - this.limbOptions = limbOptions; - - this.layerId = Layer.ID.SPAWN; - this.limbMeshes = {}; - this.baseMeshName = "chest"; - this.characterName = "Chuck"; - this.lastFlipDirection = -options.direction || 1; - - Parent.call(this, physicsEngine, uid, options); - } - - RubeDoll.prototype = Object.create(Parent.prototype); - - RubeDoll.prototype.createMesh = function() { - - this.createLimbMesh("lowerRightLeg"); - this.createLimbMesh("upperRightLeg"); - this.createLimbMesh("lowerRightArm"); - this.createLimbMesh("upperRightArm"); - - this.createLimbMesh("chest"); - this.createLimbMesh("head"); - - this.createLimbMesh("lowerLeftLeg"); - this.createLimbMesh("upperLeftLeg"); - this.createLimbMesh("lowerLeftArm"); - this.createLimbMesh("upperLeftArm"); - - }; - - RubeDoll.prototype.createLimbMesh = function(name) { - var self = this; - var texturePath = Settings.GRAPHICS_PATH - + Settings.GRAPHICS_SUBPATH_CHARACTERS + "" - + this.characterName + '/'; - - - var callback = function(mesh) { - if(name == self.baseMeshName) { - self.mesh = mesh; - } - - self.limbMeshes[name] = mesh; - - nc.trigger(nc.ns.client.view.mesh.add, self.layerId, mesh); - - // setting shirt color - nc.trigger(nc.ns.client.view.mesh.addFilter, self.layerId, mesh, "colorRangeReplace", { - minColor: 0x3b4a31, - maxColor: 0x6d855d, - newColor: self.primaryColor, - brightnessOffset: 0.56 - }); - }; - - nc.trigger(nc.ns.client.view.mesh.create, - this.layerId, - texturePath + name + ".png", - callback, - { - width: this.limbOptions[name].width, - height: this.limbOptions[name].height, - pivot: { - x: this.limbOptions[name].width / 2, - y: this.limbOptions[name].height / 2 - } - } - ); - }; - - RubeDoll.prototype.destroy = function() { - - for (var name in this.limbMeshes) { - nc.trigger(nc.ns.client.view.mesh.remove, this.layerId, this.limbMeshes[name]); - }; - - Parent.prototype.destroy.call(this); - }; - - RubeDoll.prototype.render = function() { - //Parent.prototype.render.call(this); - - nc.trigger(nc.ns.client.view.mesh.update, - this.layerId, - this.mesh, - { - x: this.body.GetPosition().x * Settings.RATIO, - y: this.body.GetPosition().y * Settings.RATIO, - rotation: this.body.GetAngle() - } - ); - - if(this.limbs) { - for(var name in this.limbMeshes) { - if(this.limbs[name]) { - nc.trigger(nc.ns.client.view.mesh.update, - this.layerId, - this.limbMeshes[name], - { - x: this.limbs[name].GetPosition().x * Settings.RATIO, - y: this.limbs[name].GetPosition().y * Settings.RATIO, - rotation: this.limbs[name].GetAngle() - } - ); - } - } - } - }; - - RubeDoll.prototype.flip = function(direction) { - - Parent.prototype.flip.call(this, direction); - - // flipping depth of right body side arm/leg images with left - if (this.lastFlipDirection != direction) { // FIXME : this is a bit broken. - - this.lastFlipDirection = direction; - - nc.trigger(nc.ns.client.view.mesh.swapMeshIndexes, - this.layerId, - this.limbMeshes["lowerRightLeg"], - this.limbMeshes["lowerLeftLeg"] - ); - nc.trigger(nc.ns.client.view.mesh.swapMeshIndexes, - this.layerId, - this.limbMeshes["upperRightLeg"], - this.limbMeshes["upperLeftLeg"] - ); - nc.trigger(nc.ns.client.view.mesh.swapMeshIndexes, - this.layerId, - this.limbMeshes["lowerRightArm"], - this.limbMeshes["lowerLeftArm"] - ); - nc.trigger(nc.ns.client.view.mesh.swapMeshIndexes, - this.layerId, - this.limbMeshes["upperRightArm"], - this.limbMeshes["upperLeftArm"] - ); - - // swap short images - nc.trigger(nc.ns.client.view.mesh.swapMeshes, - this.layerId, - this.limbMeshes["upperRightLeg"], - this.limbMeshes["upperLeftLeg"] - ); - } - - // x flipping has to happen after (see swapMeshes) - if(this.limbs) { - for(var name in this.limbMeshes) { - if(this.limbs[name]) { - nc.trigger(nc.ns.client.view.mesh.update, - this.layerId, - this.limbMeshes[name], - { - xScale: direction, - } - ); - } - } - } - }; - - return RubeDoll; -}); \ No newline at end of file diff --git a/app/Game/Client/GameObjects/Tile.js b/app/Game/Client/GameObjects/Tile.js index 1ca9984..a92d455 100755 --- a/app/Game/Client/GameObjects/Tile.js +++ b/app/Game/Client/GameObjects/Tile.js @@ -5,7 +5,7 @@ define([ "Game/Client/View/Abstract/Layer" ], -function (Parent, Settings, nc, Layer) { +function (Parent, Settings, Nc, Layer) { "use strict"; @@ -31,10 +31,10 @@ function (Parent, Settings, nc, Layer) { var callback = function(mesh) { self.mesh = mesh; - nc.trigger(nc.ns.client.view.mesh.add, self.layerId, mesh); + Nc.trigger(Nc.ns.client.view.mesh.add, self.layerId, mesh); } - nc.trigger(nc.ns.client.view.mesh.create, + Nc.trigger(Nc.ns.client.view.mesh.create, this.layerId, texturePath, callback, @@ -50,13 +50,13 @@ function (Parent, Settings, nc, Layer) { }; Tile.prototype.destroy = function() { - nc.trigger(nc.ns.client.view.mesh.remove, this.layerId, this.mesh); + Nc.trigger(Nc.ns.client.view.mesh.remove, this.layerId, this.mesh); Parent.prototype.destroy.call(this); }; Tile.prototype.render = function() { - nc.trigger(nc.ns.client.view.mesh.update, + Nc.trigger(Nc.ns.client.view.mesh.update, this.layerId, this.mesh, { diff --git a/app/Game/Client/Loader/Level.js b/app/Game/Client/Loader/Level.js index 832d9f0..e763d92 100755 --- a/app/Game/Client/Loader/Level.js +++ b/app/Game/Client/Loader/Level.js @@ -6,7 +6,7 @@ define([ "Game/Client/View/Abstract/Layer" ], -function (Parent, Settings, nc, PIXI, AbstractLayer) { +function (Parent, Settings, Nc, PIXI, AbstractLayer) { "use strict"; @@ -46,7 +46,7 @@ function (Parent, Settings, nc, PIXI, AbstractLayer) { loader.onComplete = function() { callback(levelData); }; loader.onProgress = function() { var progress = parseInt(100 / numPaths * ++count, 10) + 1; - nc.trigger(nc.ns.client.view.preloadBar.update, progress); + Nc.trigger(Nc.ns.client.view.preloadBar.update, progress); } loader.load(); }; @@ -116,8 +116,8 @@ function (Parent, Settings, nc, PIXI, AbstractLayer) { if (options.properties && options.properties.parallaxSpeed) { parallaxSpeed = parseFloat(options.properties.parallaxSpeed); } - nc.trigger( - nc.ns.client.view.layer.createAndInsert, + Nc.trigger( + Nc.ns.client.view.layer.createAndInsert, options.layerId, { parallaxSpeed: parallaxSpeed, diff --git a/app/Game/Client/Loader/TiledLevel.js b/app/Game/Client/Loader/TiledLevel.js index df451d8..ae1299c 100644 --- a/app/Game/Client/Loader/TiledLevel.js +++ b/app/Game/Client/Loader/TiledLevel.js @@ -4,13 +4,13 @@ define([ "Lib/Utilities/NotificationCenter", ], -function (Parent, Settings, nc) { +function (Parent, Settings, Nc) { "use strict"; - function TiledLevel(uid, engine) { + function TiledLevel(uid, engine, gameObjects) { this.layerId = "background"; - Parent.call(this, uid, engine); + Parent.call(this, uid, engine, gameObjects); } TiledLevel.prototype = Object.create(Parent.prototype); @@ -22,7 +22,7 @@ function (Parent, Settings, nc) { height: tilesLayerData.height * Settings.TILE_SIZE }; - nc.trigger(nc.ns.client.view.layer.levelSizeUpdate, this.levelSize); + Nc.trigger(Nc.ns.client.view.layer.levelSizeUpdate, this.levelSize); Parent.prototype.setup.call(this, levelData); }; @@ -78,8 +78,8 @@ function (Parent, Settings, nc) { var texturePath = Settings.MAPS_PATH + options.image; var callback = function(mesh) { - nc.trigger(nc.ns.client.view.mesh.add, options.layerId, mesh); - nc.trigger(nc.ns.client.view.mesh.update, options.layerId, mesh, { + Nc.trigger(Nc.ns.client.view.mesh.add, options.layerId, mesh); + Nc.trigger(Nc.ns.client.view.mesh.update, options.layerId, mesh, { x: 0,//self.levelData.width * Settings.TILE_SIZE / 2, y: 0,//self.levelData.height * Settings.TILE_SIZE / 2, pivot: { @@ -91,7 +91,7 @@ function (Parent, Settings, nc) { }); } - nc.trigger(nc.ns.client.view.mesh.create, + Nc.trigger(Nc.ns.client.view.mesh.create, options.layerId, texturePath, callback, @@ -123,10 +123,10 @@ function (Parent, Settings, nc) { var tileType = parts[parts.length - 1].split(".")[0].split("") var callback = function(mesh) { - nc.trigger(nc.ns.client.view.mesh.add, options.layerId, mesh); + Nc.trigger(Nc.ns.client.view.mesh.add, options.layerId, mesh); } - nc.trigger(nc.ns.client.view.mesh.create, + Nc.trigger(Nc.ns.client.view.mesh.create, options.layerId, Settings.MAPS_PATH + imagePath, callback, diff --git a/app/Game/Client/Me.js b/app/Game/Client/Me.js index a904c04..047befd 100644 --- a/app/Game/Client/Me.js +++ b/app/Game/Client/Me.js @@ -2,11 +2,10 @@ define([ "Game/Client/Player", "Game/Config/Settings", "Lib/Utilities/NotificationCenter", - "Lib/Utilities/Assert", - "Game/Client/Control/PlayerController", + "Lib/Utilities/Assert" ], -function (Parent, Settings, nc, Assert, PlayerController) { +function (Parent, Settings, Nc, Assert) { "use strict"; @@ -28,7 +27,6 @@ function (Parent, Settings, nc, Assert, PlayerController) { this.arrowMesh = null; this.createAndAddArrow(); - this.playerController = new PlayerController(this); } Me.prototype = Object.create(Parent.prototype); @@ -53,8 +51,7 @@ function (Parent, Settings, nc, Assert, PlayerController) { this.lastServerPositionState = update; }; - // Checks if client should send out its position to server - Me.prototype.isPositionStateOverrideNeeded = function() { + Me.prototype.isPositionStateUpdateNeeded = function() { if(!this.doll) { return false; @@ -76,7 +73,7 @@ function (Parent, Settings, nc, Assert, PlayerController) { return false; }; - Me.prototype.getPositionStateOverride = function() { + Me.prototype.getPositionStateUpdate = function() { return { p: this.doll.body.GetPosition().Copy(), lv: this.doll.body.GetLinearVelocity().Copy() @@ -108,7 +105,7 @@ function (Parent, Settings, nc, Assert, PlayerController) { var callback = function(arrowMesh) { self.arrowMesh = arrowMesh; }; - nc.trigger(nc.ns.client.view.playerArrow.createAndAdd, callback, options); + Nc.trigger(Nc.ns.client.view.playerArrow.createAndAdd, callback, options); }; Me.prototype.render = function() { @@ -120,7 +117,7 @@ function (Parent, Settings, nc, Assert, PlayerController) { x: position.x * Settings.RATIO, y: position.y * Settings.RATIO, }; - nc.trigger(nc.ns.client.view.playerArrow.update, this.arrowMesh, options); + Nc.trigger(Nc.ns.client.view.playerArrow.update, this.arrowMesh, options); }; return Me; diff --git a/app/Game/Client/Networker.js b/app/Game/Client/Networker.js index 4e27382..a63582f 100755 --- a/app/Game/Client/Networker.js +++ b/app/Game/Client/Networker.js @@ -7,7 +7,7 @@ define([ "Game/Client/View/DomController" ], -function (ProtocolHelper, GameController, User, nc, Settings, domController) { +function (ProtocolHelper, GameController, User, Nc, Settings, DomController) { "use strict"; @@ -25,32 +25,20 @@ function (ProtocolHelper, GameController, User, nc, Settings, domController) { var self = this; this.socketLink.on('message', function (message) { var m = JSON.parse(message) - if(Settings.NETWORK_LOG_INCOMING) { - var shouldBeFiltered = false; - var keyword; - for (var i = 0; i < Settings.NETWORK_LOG_FILTER.length; i++) { - keyword = Settings.NETWORK_LOG_FILTER[i]; - if(message.search(keyword) != -1) { - shouldBeFiltered = true; - break; - } - }; - - if(!shouldBeFiltered) { + if (message.indexOf('worldUpdate') == -1 && message.indexOf('pong') == -1) { console.log('INCOMING', message); } + } - - ProtocolHelper.applyCommand(message, self); }); - nc.on(nc.ns.client.to.server.gameCommand.send, this.sendGameCommand, this); - nc.on(nc.ns.core.game.events.level.loaded, this.onLevelLoaded, this); + Nc.on(Nc.ns.client.to.server.gameCommand.send, this.sendGameCommand, this); + Nc.on(Nc.ns.core.game.events.level.loaded, this.onLevelLoaded, this); - domController.setNick(nickname); + DomController.setNick(nickname); } // Socket callbacks @@ -63,7 +51,7 @@ function (ProtocolHelper, GameController, User, nc, Settings, domController) { nickname: this.nickname } this.sendCommand('join', options); - domController.setConnected(true); + DomController.setConnected(true); } else { alert("Error: no channel name"); window.location.href = "/"; @@ -74,7 +62,7 @@ function (ProtocolHelper, GameController, User, nc, Settings, domController) { //if(this.gameController) this.gameController.destruct(); //this.gameController = null; console.log('disconnected. game destroyed. no auto-reconnect'); - domController.setConnected(false); + DomController.setConnected(false); } Networker.prototype.onJoinSuccess = function (options) { @@ -129,18 +117,23 @@ function (ProtocolHelper, GameController, User, nc, Settings, domController) { this.socketLink.send(message); if(Settings.NETWORK_LOG_OUTGOING) { - var shouldBeFiltered = false; - var keyword; + if(Settings.NETWORK_LOG_FILTER.length > 0) { - for (var i = 0; i < Settings.NETWORK_LOG_FILTER.length; i++) { - keyword = Settings.NETWORK_LOG_FILTER[i]; - if(message.search(keyword) != -1) { - shouldBeFiltered = true; - break; + var shouldBeFiltered = false; + var keyword; + + for (var i = 0; i < Settings.NETWORK_LOG_FILTER.length; i++) { + keyword = Settings.NETWORK_LOG_FILTER[i]; + if(message.search(keyword) != -1) { + shouldBeFiltered = true; + break; + } + }; + + if(!shouldBeFiltered) { + console.log('OUTGOING', message); } - }; - - if(!shouldBeFiltered) { + } else { console.log('OUTGOING', message); } } @@ -183,7 +176,7 @@ function (ProtocolHelper, GameController, User, nc, Settings, domController) { Networker.prototype.onPong = function(timestamp) { var ping = (Date.now() - parseInt(timestamp, 10)); - domController.setPing(ping); + DomController.setPing(ping); setTimeout(this.ping.bind(this), 1000); }; @@ -191,6 +184,7 @@ function (ProtocolHelper, GameController, User, nc, Settings, domController) { if(this.gameController) { this.gameController.destroy(); + delete this.gameController; } this.gameController = new GameController(options); @@ -202,12 +196,10 @@ function (ProtocolHelper, GameController, User, nc, Settings, domController) { this.gameController.createPlayer(this.users[userId]); } } - - this.gameController.beginRound(); }; Networker.prototype.onEndRound = function() { - this.gameController.endRound(); + this.gameController.toggleGameStats(true); }; return Networker; diff --git a/app/Game/Client/Physics/Engine.js b/app/Game/Client/Physics/Engine.js index 6e93609..231bf1d 100755 --- a/app/Game/Client/Physics/Engine.js +++ b/app/Game/Client/Physics/Engine.js @@ -8,7 +8,7 @@ define([ "Game/Client/View/Pixi/Layers/Debug" ], -function (Parent, Settings, domController, Box2D, nc, DebugDraw, debugLayer) { +function (Parent, Settings, DomController, Box2D, Nc, DebugDraw, debugLayer) { "use strict"; @@ -17,7 +17,7 @@ function (Parent, Settings, domController, Box2D, nc, DebugDraw, debugLayer) { this.debugMode = false; - nc.on(nc.ns.client.view.debugMode.toggle, this.onToggleDebugMode, this); + Nc.on(Nc.ns.client.view.debugMode.toggle, this.onToggleDebugMode, this); } Engine.prototype = Object.create(Parent.prototype); diff --git a/app/Game/Client/Player.js b/app/Game/Client/Player.js index f7484cc..5170f63 100755 --- a/app/Game/Client/Player.js +++ b/app/Game/Client/Player.js @@ -4,21 +4,17 @@ define([ "Game/Config/Settings" ], -function (Parent, nc, Settings) { +function (Parent, Nc, Settings) { "use strict"; - function Player(id, physicsEngine, user, isMe) { + function Player(id, physicsEngine, user) { Parent.call(this, id, physicsEngine, user); this.healthBarView = null; this.healthBarViewVisibleTimeout = null; this.healthBarViewVisible = false; this.initHealthBar(); - - this.ncTokens = (this.ncTokens || []).concat([ - nc.on(nc.ns.client.game.events.render, this.render, this) - ]); } Player.prototype = Object.create(Parent.prototype); @@ -47,7 +43,7 @@ function (Parent, nc, Settings) { var callback = function(healthBarView) { self.healthBarView = healthBarView; } - nc.trigger(nc.ns.client.view.healthBar.createAndAdd, callback, options); + Nc.trigger(Nc.ns.client.view.healthBar.createAndAdd, callback, options); }; Player.prototype.onHealthChange = function() { @@ -75,18 +71,22 @@ function (Parent, nc, Settings) { healthFactor: this.stats.health / 100, visible: this.healthBarViewVisible }; - nc.trigger(nc.ns.client.view.healthBar.update, this.healthBarView, options); + Nc.trigger(Nc.ns.client.view.healthBar.update, this.healthBarView, options); this.healthBarViewVisibleTimeout = setTimeout(function() { self.healthBarViewVisible = false; - nc.trigger(nc.ns.client.view.healthBar.update, self.healthBarView, {visible: self.healthBarViewVisible}); + Nc.trigger(Nc.ns.client.view.healthBar.update, self.healthBarView, {visible: self.healthBarViewVisible}); }, Settings.HEALTH_DISPLAY_TIME * 1000); } else { - nc.trigger(nc.ns.client.view.healthBar.update, this.healthBarView, {visible: this.healthBarViewVisible}); + Nc.trigger(Nc.ns.client.view.healthBar.update, this.healthBarView, {visible: this.healthBarViewVisible}); } }; + Player.prototype.getNickname = function() { + return this.user.options.nickname; + }; + Player.prototype.render = function() { if(this.doll) { @@ -100,7 +100,7 @@ function (Parent, nc, Settings) { x: position.x * Settings.RATIO, y: position.y * Settings.RATIO, } - nc.trigger(nc.ns.client.view.healthBar.update, this.healthBarView, options); + Nc.trigger(Nc.ns.client.view.healthBar.update, this.healthBarView, options); } }; @@ -110,8 +110,7 @@ function (Parent, nc, Settings) { Player.prototype.destroy = function() { clearTimeout(this.healthBarViewVisibleTimeout); - nc.trigger(nc.ns.client.view.healthBar.remove, this.healthBarView); - nc.off(this.ncTokens); + Nc.trigger(Nc.ns.client.view.healthBar.remove, this.healthBarView); Parent.prototype.destroy.call(this); }; diff --git a/app/Game/Client/PointerLockManager.js b/app/Game/Client/PointerLockManager.js index ff0ac96..8959fad 100644 --- a/app/Game/Client/PointerLockManager.js +++ b/app/Game/Client/PointerLockManager.js @@ -3,12 +3,12 @@ define([ "Lib/Utilities/NotificationCenter" ], -function (qs, nc) { +function (Qs, Nc) { "use strict"; function PointerLockManager() { - this.canvas = qs.$("#canvas"); + this.canvas = Qs.$("#canvas"); this.listeners = []; @@ -21,7 +21,7 @@ function (qs, nc) { document.addEventListener('webkitpointerlockchange', this.update.bind(this), false); this.ncTokens = [ - nc.on(nc.ns.client.pointerLock.request, this.request, this) + Nc.on(Nc.ns.client.pointerLock.request, this.request, this) ]; } @@ -40,7 +40,7 @@ function (qs, nc) { // called by the browser event and others PointerLockManager.prototype.update = function(e, options) { options = options ? options : {}; - nc.trigger(nc.ns.client.pointerLock.change, this.isLocked(), options); + Nc.trigger(Nc.ns.client.pointerLock.change, this.isLocked(), options); }; PointerLockManager.prototype.isLocked = function() { diff --git a/app/Game/Client/View/Abstract/Layer.js b/app/Game/Client/View/Abstract/Layer.js index 5e1521e..435e3a3 100644 --- a/app/Game/Client/View/Abstract/Layer.js +++ b/app/Game/Client/View/Abstract/Layer.js @@ -3,7 +3,7 @@ define([ "Lib/Utilities/NotificationCenter" ], -function (Abstract, nc) { +function (Abstract, Nc) { "use strict"; @@ -59,7 +59,7 @@ function (Abstract, nc) { Layer.prototype.destroy = function() { for (var i = 0; i < this.ncTokens.length; i++) { - nc.off(this.ncTokens[i]); + Nc.off(this.ncTokens[i]); }; }; diff --git a/app/Game/Client/View/Abstract/View.js b/app/Game/Client/View/Abstract/View.js index a226801..15dd098 100755 --- a/app/Game/Client/View/Abstract/View.js +++ b/app/Game/Client/View/Abstract/View.js @@ -6,7 +6,7 @@ define([ "Lib/Utilities/NotificationCenter" ], -function (Abstract, domController, Settings, Exception, nc) { +function (Abstract, DomController, Settings, Exception, Nc) { "use strict"; @@ -16,14 +16,14 @@ function (Abstract, domController, Settings, Exception, nc) { this.debugMode = false; this.ncTokens = [ - nc.on(nc.ns.client.view.display.change, this.onDisplaySizeChange, this), - nc.on(nc.ns.client.view.debugMode.toggle, this.onToggleDebugMode, this), + Nc.on(Nc.ns.client.view.display.change, this.onDisplaySizeChange, this), + Nc.on(Nc.ns.client.view.debugMode.toggle, this.onToggleDebugMode, this), - nc.on(nc.ns.client.game.zoomIn, this.onZoomIn, this), - nc.on(nc.ns.client.game.zoomOut, this.onZoomOut, this), - nc.on(nc.ns.client.game.zoomReset, this.onZoomReset, this), + Nc.on(Nc.ns.client.game.zoomIn, this.onZoomIn, this), + Nc.on(Nc.ns.client.game.zoomOut, this.onZoomOut, this), + Nc.on(Nc.ns.client.game.zoomReset, this.onZoomReset, this), - nc.on(nc.ns.client.view.preloadBar.update, this.onUpdateLoader, this), + Nc.on(Nc.ns.client.view.preloadBar.update, this.onUpdateLoader, this), ]; } @@ -47,7 +47,7 @@ function (Abstract, domController, Settings, Exception, nc) { AbstractView.prototype.initCanvas = function (canvas) { this.canvas = canvas; - domController.initCanvas(canvas); + DomController.initCanvas(canvas); } AbstractView.prototype.setMe = function(player) { @@ -98,7 +98,7 @@ function (Abstract, domController, Settings, Exception, nc) { AbstractView.prototype.destroy = function() { for (var i = 0; i < this.ncTokens.length; i++) { - nc.off(this.ncTokens[i]); + Nc.off(this.ncTokens[i]); }; }; diff --git a/app/Game/Client/View/DomController.js b/app/Game/Client/View/DomController.js index 90d5f52..bb4c74d 100755 --- a/app/Game/Client/View/DomController.js +++ b/app/Game/Client/View/DomController.js @@ -6,7 +6,7 @@ define([ "Game/Client/PointerLockManager" ], -function (Settings, nc, Screenfull, Graph, pointerLockManager) { +function (Settings, Nc, Screenfull, Graph, PointerLockManager) { "use strict"; @@ -15,19 +15,18 @@ function (Settings, nc, Screenfull, Graph, pointerLockManager) { this.stats = null; this.ping = null; this.nickContainer = null; - this.fpsContainer = null; + this.fpsContainer = ""; this.devToolsContainer = null; - this.frames = 0; - - this.canvas = document.getElementById("canvas"); this.initDevTools(); } DomController.prototype.initDevTools = function() { + var self = this; var li, button, label; + this.canvas = document.getElementById("canvas"); this.devToolsContainer = document.getElementById("menuBar"); // create back to menu button @@ -49,16 +48,6 @@ function (Settings, nc, Screenfull, Graph, pointerLockManager) { this.devToolsContainer.appendChild(li); this.nickContainer = label; - - // create fps label with updater - li = document.createElement("li"); - label = document.createElement("label"); - label.id = "label-fps"; - li.appendChild(label); - this.devToolsContainer.appendChild(li); - this.fpsContainer = label; - -/* // create new fps meter li = document.createElement("li"); var fpsCanvas = document.createElement("canvas"); @@ -70,6 +59,14 @@ function (Settings, nc, Screenfull, Graph, pointerLockManager) { this.fpsGraph = new Graph(fpsCanvas.getContext("2d"), true); + // create fps label with updater + li = document.createElement("li"); + label = document.createElement("label"); + label.id = "label-fps"; + li.appendChild(label); + this.devToolsContainer.appendChild(li); + this.fpsContainer = label; + this.fpsGraph.onUpdate(function(value){ self.fpsContainer.innerHTML = "FPS:" + value; @@ -102,12 +99,6 @@ function (Settings, nc, Screenfull, Graph, pointerLockManager) { scaleStepWidth: 0, scaleSteps: 0 }); -*/ - - setInterval(function() { - self.fpsContainer.innerHTML = "FPS:" + self.frames; - self.frames = 0; - }, 1000); // create Ping: container li = document.createElement("li"); @@ -122,7 +113,7 @@ function (Settings, nc, Screenfull, Graph, pointerLockManager) { var checkbox = document.createElement("input"); checkbox.type = "checkbox"; checkbox.onclick = function(e) { - nc.trigger(nc.ns.client.view.debugMode.toggle, e.target.checked); + Nc.trigger(Nc.ns.client.view.debugMode.toggle, e.target.checked); }; label.appendChild(checkbox); label.appendChild(document.createTextNode("Debug")); @@ -137,7 +128,7 @@ function (Settings, nc, Screenfull, Graph, pointerLockManager) { button.innerHTML = "Fullscreen"; button.onclick = function() { if(Screenfull.enabled) { - pointerLockManager.request(); + PointerLockManager.request(); Screenfull.request(self.canvas); } }; @@ -147,7 +138,7 @@ function (Settings, nc, Screenfull, Graph, pointerLockManager) { // FIXME : isn't this a weird place for this? window.onresize = function() { - nc.trigger(nc.ns.client.view.display.change); + Nc.trigger(Nc.ns.client.view.display.change); }; }; @@ -156,13 +147,12 @@ function (Settings, nc, Screenfull, Graph, pointerLockManager) { }; DomController.prototype.fpsStep = function() { - this.frames++; - // this.fpsGraph.step(); + this.fpsGraph.step(); }; DomController.prototype.setPing = function(ping) { this.ping.innerHTML = "Ping:" + ping; - // this.pingGraph.addValue(ping); + this.pingGraph.addValue(ping); }; DomController.prototype.getCanvasContainer = function () { @@ -180,7 +170,7 @@ function (Settings, nc, Screenfull, Graph, pointerLockManager) { }; DomController.prototype.initCanvas = function (canvas) { - nc.trigger(nc.ns.client.view.display.change, Screenfull.isFullscreen); + Nc.trigger(Nc.ns.client.view.display.change, Screenfull.isFullscreen); }; DomController.prototype.setConnected = function(connected) { @@ -190,14 +180,13 @@ function (Settings, nc, Screenfull, Graph, pointerLockManager) { document.body.style.backgroundColor = '#aaaaaa'; this.ping.innerHTML = "Disconnected. ".replace(/ /g, ' '); this.ping.style.color = "#ff0000"; - /* + self = this; setTimeout(function(){self.ping.innerHTML = "Reload Page...".replace(/ /g, ' ');}, 3000); setTimeout(function(){self.ping.innerHTML = "Reload in 3...".replace(/ /g, ' ');}, 6000); setTimeout(function(){self.ping.innerHTML = "Reload in 2...".replace(/ /g, ' ');}, 7000); setTimeout(function(){self.ping.innerHTML = "Reload in 1...".replace(/ /g, ' ');}, 8000); setTimeout(function(){self.ping.innerHTML = "Reload now. ".replace(/ /g, ' '); location.reload(); }, 9000); - */ } }; diff --git a/app/Game/Client/View/LayerManager.js b/app/Game/Client/View/LayerManager.js index 2e2d34f..3ad6dea 100644 --- a/app/Game/Client/View/LayerManager.js +++ b/app/Game/Client/View/LayerManager.js @@ -4,7 +4,7 @@ define([ "Game/Client/View/Pixi/Layer" ], -function (nc, Exception, Layer) { +function (Nc, Exception, Layer) { "use strict"; @@ -13,16 +13,14 @@ function (nc, Exception, Layer) { this.container = container; this.ncTokens = [ - nc.on(nc.ns.client.view.layer.createAndInsert, this.createAndInsert, this), - nc.on(nc.ns.client.view.mesh.create, this.createMesh, this), - nc.on(nc.ns.client.view.animatedMesh.create, this.createAnimatedMesh, this), - nc.on(nc.ns.client.view.mesh.add, this.addMesh, this), - nc.on(nc.ns.client.view.mesh.remove, this.removeMesh, this), - nc.on(nc.ns.client.view.mesh.update, this.updateMesh, this), - nc.on(nc.ns.client.view.mesh.addFilter, this.addFilter, this), - nc.on(nc.ns.client.view.mesh.removeFilter, this.removeFilter, this), - nc.on(nc.ns.client.view.mesh.swapMeshIndexes, this.swapMeshIndexes, this), - nc.on(nc.ns.client.view.mesh.swapMeshes, this.swapMeshes, this) + Nc.on(Nc.ns.client.view.layer.createAndInsert, this.createAndInsert, this), + Nc.on(Nc.ns.client.view.mesh.create, this.createMesh, this), + Nc.on(Nc.ns.client.view.animatedMesh.create, this.createAnimatedMesh, this), + Nc.on(Nc.ns.client.view.mesh.add, this.addMesh, this), + Nc.on(Nc.ns.client.view.mesh.remove, this.removeMesh, this), + Nc.on(Nc.ns.client.view.mesh.update, this.updateMesh, this), + Nc.on(Nc.ns.client.view.mesh.addFilter, this.addFilter, this), + Nc.on(Nc.ns.client.view.mesh.removeFilter, this.removeFilter, this) ]; } @@ -159,19 +157,9 @@ function (nc, Exception, Layer) { this.delegate.apply(this, arguments); }; - LayerManager.prototype.swapMeshIndexes = function() { - Array.prototype.splice.call(arguments, 0, 0, 'swapMeshIndexes') - this.delegate.apply(this, arguments); - }; - - LayerManager.prototype.swapMeshes = function() { - Array.prototype.splice.call(arguments, 0, 0, 'swapMeshes') - this.delegate.apply(this, arguments); - }; - LayerManager.prototype.destroy = function() { for (var i = 0; i < this.ncTokens.length; i++) { - nc.off(this.ncTokens[i]); + Nc.off(this.ncTokens[i]); }; for (var i = this.layers.length - 1; i >= 0; i--) { var layer = this.layers[i]; diff --git a/app/Game/Client/View/Mesh.js b/app/Game/Client/View/Mesh.js index 9290593..d261e36 100644 --- a/app/Game/Client/View/Mesh.js +++ b/app/Game/Client/View/Mesh.js @@ -5,7 +5,7 @@ define([ "Lib/Vendor/Screenfull" ], -function (Settings, nc, Stats, Screenfull) { +function (Settings, Nc, Stats, Screenfull) { "use strict"; diff --git a/app/Game/Client/View/Pixi/GameStats.js b/app/Game/Client/View/Pixi/GameStats.js index 55d520c..d1842e0 100644 --- a/app/Game/Client/View/Pixi/GameStats.js +++ b/app/Game/Client/View/Pixi/GameStats.js @@ -5,11 +5,11 @@ define([ "Lib/Utilities/ColorConverter" ], -function (PIXI, nc, Settings, ColorConverter) { +function (PIXI, Nc, Settings, ColorConverter) { "use strict"; - function GameStats(view) { + function GameStats(gameContainer) { this.style = { borderWidth: 3, @@ -27,7 +27,7 @@ function (PIXI, nc, Settings, ColorConverter) { fontSize: 12 }; - this.view = view; + this.gameContainer = gameContainer; this.container = new PIXI.DisplayObjectContainer(); @@ -63,8 +63,8 @@ function (PIXI, nc, Settings, ColorConverter) { this.sortedPlayers = []; this.ncTokens = [ - nc.on(nc.ns.client.view.gameStats.toggle, this.toggle, this), - nc.on(nc.ns.client.view.gameStats.update, this.update, this) + Nc.on(Nc.ns.client.view.gameStats.toggle, this.toggle, this), + Nc.on(Nc.ns.client.view.gameStats.update, this.update, this) ]; } @@ -77,12 +77,11 @@ function (PIXI, nc, Settings, ColorConverter) { this.redraw(); // show stats with filters this.container.visible = true; - - this.view.addFilters(this.filters); + this.gameContainer.filters = this.filters; this.filters.forEach(function(filter) { filter.dirty = true; }); } else { this.container.visible = false; - this.view.removeFilters(this.filters); + this.gameContainer.filters = null; } } @@ -197,7 +196,7 @@ function (PIXI, nc, Settings, ColorConverter) { GameStats.prototype.destroy = function() { for (var i = 0; i < this.ncTokens.length; i++) { - nc.off(this.ncTokens[i]); + Nc.off(this.ncTokens[i]); }; }; diff --git a/app/Game/Client/View/Pixi/Layer.js b/app/Game/Client/View/Pixi/Layer.js index 5a44988..acd0f98 100644 --- a/app/Game/Client/View/Pixi/Layer.js +++ b/app/Game/Client/View/Pixi/Layer.js @@ -7,7 +7,7 @@ define([ "Lib/Utilities/NotificationCenter" ], -function (Parent, PIXI, ColorRangeReplaceFilter, Settings, ColorConverter, nc) { +function (Parent, PIXI, ColorRangeReplaceFilter, Settings, ColorConverter, Nc) { "use strict"; @@ -23,7 +23,7 @@ function (Parent, PIXI, ColorRangeReplaceFilter, Settings, ColorConverter, nc) { } this.ncTokens = this.ncTokens.concat([ - nc.on(nc.ns.client.view.layer.levelSizeUpdate, this.onLevelSizeUpdate, this) + Nc.on(Nc.ns.client.view.layer.levelSizeUpdate, this.onLevelSizeUpdate, this) ]); if (Settings.SHOW_LAYER_INFO) { @@ -95,30 +95,6 @@ function (Parent, PIXI, ColorRangeReplaceFilter, Settings, ColorConverter, nc) { this.container.removeChild(mesh); }; - Layer.prototype.swapMeshIndexes = function(meshA, meshB) { - var indexA = this.container.getChildIndex(meshA); - var indexB = this.container.getChildIndex(meshB); - - this.container.setChildIndex(meshA, indexB); - this.container.setChildIndex(meshB, indexA); - }; - - Layer.prototype.swapMeshes = function(meshA, meshB) { - var textureA = meshA.texture; - var textureB = meshB.texture; - - meshA.setTexture(textureB); - meshA.onTextureUpdate(); - meshA.scale.x = 1; - meshA.scale.y = 1; - - meshB.setTexture(textureA); - meshB.onTextureUpdate(); - meshB.scale.x = 1; - meshB.scale.y = 1; - - }; - Layer.prototype.createMesh = function (texturePath, callback, options) { var texture = (options && options.fromFrame) @@ -174,11 +150,6 @@ function (Parent, PIXI, ColorRangeReplaceFilter, Settings, ColorConverter, nc) { Layer.prototype.addFilter = function(mesh, filterName, options) { - // use game container if mesh null - if(mesh === null) { - - } - if (!this.getAvailableMeshFilters().hasOwnProperty(filterName)) { throw new Exception('Filter ' + filterName + ' is not available'); } @@ -233,8 +204,6 @@ function (Parent, PIXI, ColorRangeReplaceFilter, Settings, ColorConverter, nc) { return; } - // FIXME this should throw an error i think since "options" is not defined here - // maybe we never actually call this method? var MeshFilter = this.getAvailableMeshFilters()[options.filter]; filters = filters.filter(function(filter){ diff --git a/app/Game/Client/View/Pixi/Layers/Debug.js b/app/Game/Client/View/Pixi/Layers/Debug.js index c5b650e..c7ae643 100644 --- a/app/Game/Client/View/Pixi/Layers/Debug.js +++ b/app/Game/Client/View/Pixi/Layers/Debug.js @@ -16,5 +16,12 @@ function (Parent, PIXI) { Debug.prototype = Object.create(Parent.prototype); + Debug.prototype.render = function(centerPosition, zoom) { + Parent.prototype.render.call(this, centerPosition, zoom); + + this.container.x -= 300 * zoom; + this.container.y -= 200 * zoom; + }; + return new Debug(); }); \ No newline at end of file diff --git a/app/Game/Client/View/Pixi/Layers/Ghost.js b/app/Game/Client/View/Pixi/Layers/Ghost.js index 8260f6f..f45635d 100644 --- a/app/Game/Client/View/Pixi/Layers/Ghost.js +++ b/app/Game/Client/View/Pixi/Layers/Ghost.js @@ -5,7 +5,7 @@ define([ "Game/Config/Settings" ], -function (Parent, PIXI, nc, Settings) { +function (Parent, PIXI, Nc, Settings) { "use strict"; @@ -13,12 +13,12 @@ function (Parent, PIXI, nc, Settings) { Parent.call(this, "ghost", {parallaxSpeed: 0}); this.ncTokens = this.ncTokens.concat([ - nc.on(nc.ns.client.view.layer.levelSizeUpdate, this.onLevelSizeUpdate, this), - nc.on(nc.ns.client.view.playerArrow.createAndAdd, this.onCreateAndAddPlayerArrow, this), - nc.on(nc.ns.client.view.playerArrow.update, this.onUpdatePlayerArrow, this), - nc.on(nc.ns.client.view.healthBar.createAndAdd, this.onCreateAndAddHealthBar, this), - nc.on(nc.ns.client.view.healthBar.update, this.onUpdateHealthBar, this), - nc.on(nc.ns.client.view.healthBar.remove, this.onRemoveHealthBar, this), + Nc.on(Nc.ns.client.view.layer.levelSizeUpdate, this.onLevelSizeUpdate, this), + Nc.on(Nc.ns.client.view.playerArrow.createAndAdd, this.onCreateAndAddPlayerArrow, this), + Nc.on(Nc.ns.client.view.playerArrow.update, this.onUpdatePlayerArrow, this), + Nc.on(Nc.ns.client.view.healthBar.createAndAdd, this.onCreateAndAddHealthBar, this), + Nc.on(Nc.ns.client.view.healthBar.update, this.onUpdateHealthBar, this), + Nc.on(Nc.ns.client.view.healthBar.remove, this.onRemoveHealthBar, this), ]); } @@ -36,10 +36,10 @@ function (Parent, PIXI, nc, Settings) { arrow.visible = false; this.container.addChild(arrow); - var width = 10, - height = 10; + var width = 12, + height = 12; - arrow.beginFill(0xffffff, 0.4); + arrow.beginFill(0xffffff, 0.1); arrow.lineStyle(0, 0x000000); arrow.moveTo(0, 0); arrow.lineTo(width, 0); @@ -56,7 +56,7 @@ function (Parent, PIXI, nc, Settings) { Ghost.prototype.onUpdatePlayerArrow = function(arrow, options) { var offsetX = 0, - offsetY = -55, + offsetY = -60, x = offsetX + options.x, y = offsetY + options.y; diff --git a/app/Game/Client/View/Pixi/Layers/Messages.js b/app/Game/Client/View/Pixi/Layers/Messages.js index a9a547c..08c4f99 100644 --- a/app/Game/Client/View/Pixi/Layers/Messages.js +++ b/app/Game/Client/View/Pixi/Layers/Messages.js @@ -5,7 +5,7 @@ define([ "Game/Config/Settings" ], -function (Parent, PIXI, nc, Settings) { +function (Parent, PIXI, Nc, Settings) { "use strict"; @@ -13,7 +13,7 @@ function (Parent, PIXI, nc, Settings) { Parent.call(this, "messages", {parallaxSpeed:-1}); this.ncTokens = this.ncTokens.concat([ - nc.on(nc.ns.client.view.gameStats.kill, this.onKill, this) + Nc.on(Nc.ns.client.view.gameStats.kill, this.onKill, this) ]); this.mainTextOptions = { diff --git a/app/Game/Client/View/Pixi/Layers/Swiper.js b/app/Game/Client/View/Pixi/Layers/Swiper.js index 9c89d95..bd62fb5 100644 --- a/app/Game/Client/View/Pixi/Layers/Swiper.js +++ b/app/Game/Client/View/Pixi/Layers/Swiper.js @@ -5,7 +5,7 @@ define([ "Game/Config/Settings" ], -function (Parent, PIXI, nc, Settings) { +function (Parent, PIXI, Nc, Settings) { function Swiper() { Parent.call(this, "swiper", {parallaxSpeed:0}); @@ -13,8 +13,8 @@ function (Parent, PIXI, nc, Settings) { this.static = true; this.ncTokens = this.ncTokens.concat([ - nc.on(nc.ns.client.view.swiper.swipe, this.swipe, this), - nc.on(nc.ns.client.view.swiper.end, this.end, this) + Nc.on(Nc.ns.client.view.swiper.swipe, this.swipe, this), + Nc.on(Nc.ns.client.view.swiper.end, this.end, this) ]); this.sprite = new PIXI.Graphics(); diff --git a/app/Game/Client/View/Pixi/View.js b/app/Game/Client/View/Pixi/View.js index d7c7f11..d191bae 100755 --- a/app/Game/Client/View/Pixi/View.js +++ b/app/Game/Client/View/Pixi/View.js @@ -14,7 +14,7 @@ define([ "Game/Client/View/Pixi/Layers/Messages" ], -function (Parent, domController, PIXI, Settings, nc, Exception, GameStats, LayerManager, Ghost, Swiper, pointerLockManager, Debug, Messages) { +function (Parent, DomController, PIXI, Settings, Nc, Exception, GameStats, LayerManager, Ghost, Swiper, PointerLockManager, Debug, Messages) { "use strict"; @@ -35,8 +35,8 @@ function (Parent, domController, PIXI, Settings, nc, Exception, GameStats, Layer this.init(); this.ncTokens = this.ncTokens.concat([ - nc.on(nc.ns.client.pointerLock.change, this.onPointerLockChange, this), - nc.on(nc.ns.core.game.events.level.loaded, this.showDefaultLayers, this) + Nc.on(Nc.ns.client.pointerLock.change, this.onPointerLockChange, this), + Nc.on(Nc.ns.core.game.events.level.loaded, this.showDefaultLayers, this) ]); PIXI.scaleModes.DEFAULT = PIXI.scaleModes.NEAREST; @@ -47,7 +47,7 @@ function (Parent, domController, PIXI, Settings, nc, Exception, GameStats, Layer PixiView.prototype.init = function () { var rendererOptions = { - view: domController.getCanvas(), + view: DomController.getCanvas(), antialiasing: false, transparent: false, resolution: 1 @@ -82,7 +82,7 @@ function (Parent, domController, PIXI, Settings, nc, Exception, GameStats, Layer this.initPointerLockView(); // Tab Overlay (not using layer manager, cause of filters) - this.gameStats = new GameStats(this); + this.gameStats = new GameStats(this.container); this.stage.addChild(this.gameStats.getInfoContainer()); this.ghostLayer = new Ghost(); @@ -121,8 +121,7 @@ function (Parent, domController, PIXI, Settings, nc, Exception, GameStats, Layer } PixiView.prototype.initPointerLockView = function() { - if (!Settings.ENABLE_POINTER_LOCK_FILTER) return; - + var blurFilter = new PIXI.BlurFilter(); blurFilter.blurX = 42 * this.currentZoom; blurFilter.blurY = 42 * this.currentZoom; @@ -140,11 +139,8 @@ function (Parent, domController, PIXI, Settings, nc, Exception, GameStats, Layer }; PixiView.prototype.onPointerLockChange = function(isLocked, options) { - if (!Settings.ENABLE_POINTER_LOCK_FILTER) return; - if(isLocked) { - this.removeFilters(this.pointerLockFilters); - + this.container.filters = null; this.clickToEnable.visible = false; this.onZoomReset(); } else { @@ -160,7 +156,7 @@ function (Parent, domController, PIXI, Settings, nc, Exception, GameStats, Layer strokeThickness: 6 * this.currentZoom }); - this.addFilters(this.pointerLockFilters); + this.container.filters = this.pointerLockFilters; this.pointerLockFilters.forEach(function(filter) { filter.dirty = true; }); this.clickToEnable.position = new PIXI.Point(Settings.STAGE_WIDTH / 2 - this.clickToEnable.width / 2, Settings.STAGE_HEIGHT / 2 - this.clickToEnable.height / 2) @@ -171,46 +167,6 @@ function (Parent, domController, PIXI, Settings, nc, Exception, GameStats, Layer } }; - PixiView.prototype.removeFilters = function(filters) { - - if(this.container && this.container.filters && this.container.filters.length) { - for (var i = this.container.filters.length - 1; i >= 0; i--) { - - for (var j = filters.length - 1; j >= 0; j--) { - if (filters[j] === this.container.filters[i]) { - this.container.filters.splice(i, 1); - } - } - } - - // weird bug, filters.length cant be 0, must be set to null - if(this.container.filters.length < 1) { - this.container.filters = null; - } - } - - }; - - PixiView.prototype.addFilters = function(filters) { - if (filters.length < 1) return; - if (!this.container) { - return; - } - - if (!this.container.filters) { - /* - * slice does a copy, which is important here - - * otherwise this.pointerLockFilters will be manipulated too on remove. - */ - this.container.filters = filters.slice(); - return; - } - - for (var i = 0; i < filters.length; i++) { - this.container.filters.push(filters[i]); - } - }; - PixiView.prototype.calculateCenterPosition = function() { var target = this.me.getHeadPosition(); @@ -231,7 +187,7 @@ function (Parent, domController, PIXI, Settings, nc, Exception, GameStats, Layer this.renderer.resize(window.innerWidth, window.innerHeight); this.currentZoom = window.innerWidth / 600; - pointerLockManager.update(null, {}); // only to reposition clickToEnable text + PointerLockManager.update(null, {}); // only to reposition clickToEnable text }; PixiView.prototype.initLoader = function() { diff --git a/app/Game/Client/View/Three/View.js b/app/Game/Client/View/Three/View.js index e653802..3255a28 100755 --- a/app/Game/Client/View/Three/View.js +++ b/app/Game/Client/View/Three/View.js @@ -1,10 +1,11 @@ define([ "Game/Client/View/Abstract/View", + "Game/Client/View/DomController", "Lib/Vendor/Three", "Game/Config/Settings" ], -function (Parent, Three, Settings) { +function (Parent, DomController, Three, Settings) { "use strict"; diff --git a/app/Game/Client/View/ViewManager.js b/app/Game/Client/View/ViewManager.js index f935357..2f30bd5 100755 --- a/app/Game/Client/View/ViewManager.js +++ b/app/Game/Client/View/ViewManager.js @@ -7,7 +7,7 @@ define([ "Lib/Utilities/NotificationCenter" ], -function (Settings, Exception, AbstractView, PixiView, nc) { +function (Settings, Exception, AbstractView, PixiView, Nc) { "use strict"; diff --git a/app/Game/Config/ItemSettings.js b/app/Game/Config/ItemSettings.js index 8724c0a..0546123 100644 --- a/app/Game/Config/ItemSettings.js +++ b/app/Game/Config/ItemSettings.js @@ -411,17 +411,19 @@ function () { }, - "RubeDoll": + + + "Rube": { "category": "kitchen", "image": "banana.gif", - - "weight": "3", - "width": "15", + + // "type": "rube", + "weight": "1", + "width": "5", "height": "9", - "type": "rubedoll", - "grabAngle": "0.001", // seems to be a bug, that 0 does not work! + "grabAngle": "0.5", } }; diff --git a/app/Game/Config/Settings.js b/app/Game/Config/Settings.js index 10cf76f..993e3e4 100755 --- a/app/Game/Config/Settings.js +++ b/app/Game/Config/Settings.js @@ -16,8 +16,8 @@ function () { BOX2D_WORLD_AABB_SIZE: 3000, BOX2D_ALLOW_SLEEP: true, BOX2D_GRAVITY: 26, - BOX2D_VELOCITY_ITERATIONS: 20, - BOX2D_POSITION_ITERATIONS: 10, // 200/100 created problems (awful teleporting when repositioning joints) + BOX2D_VELOCITY_ITERATIONS: 5, + BOX2D_POSITION_ITERATIONS: 5, BOX2D_TIME_STEP: 1 / 60, // PATHS @@ -39,7 +39,6 @@ function () { VIEW_CONTROLLER: 0 ? "Three" : "Pixi", ARROW_GLIDE: 30, // % of the way per frame SHOW_LAYER_INFO: false, - ENABLE_POINTER_LOCK_FILTER: true, // GAME PLAY WALK_SPEED: 4, @@ -88,10 +87,10 @@ function () { CHANNEL_MAX_USERS: 20, CHANNEL_DESTRUCTION_TIME: 0.5 * 60, CHANNEL_END_ROUND_TIME: 20, //10, - CHANNEL_DEFAULT_MAX_USERS: 10, - CHANNEL_DEFAULT_SCORE_LIMIT: 5, + CHANNEL_DEFAULT_MAX_USERS: 40, + CHANNEL_DEFAULT_SCORE_LIMIT: 10, CHANNEL_DEFAULT_LEVELS: ["debug"], - CHANNEL_RECORD_SESSION: false, + CHANNEL_RECORD_SESSION: true, // ME STATE ME_STATE_MAX_DIFFERENCE_METERS: 1, diff --git a/app/Game/Core/Control/PlayerController.js b/app/Game/Core/Control/PlayerController.js index d264152..8915fc3 100755 --- a/app/Game/Core/Control/PlayerController.js +++ b/app/Game/Core/Control/PlayerController.js @@ -4,18 +4,20 @@ define([ function () { function PlayerController (player) { + this.player = player; + + this._shift; + this._isJumping; this._walkingDirectionStatus = 0; } PlayerController.prototype.moveLeft = function () { - if(!this.isPlayerInputAllowed()) return; this.player.move(-1); this._walkingDirectionStatus = -1; } PlayerController.prototype.moveRight = function () { - if(!this.isPlayerInputAllowed()) return; this.player.move(1); this._walkingDirectionStatus = 1; } @@ -26,7 +28,7 @@ function () { } PlayerController.prototype.jump = function () { - if(!this.isPlayerInputAllowed()) return; + this._isJumping = true; this.player.jump(); } @@ -35,31 +37,15 @@ function () { } PlayerController.prototype.lookAt = function (options) { - if(!this.isPlayerInputAllowed()) return; if(options) this.player.lookAt(options.x, options.y); } - PlayerController.prototype.activateModifier = function() { - if (!this.isPlayerInputAllowed()) return; - this.player.activateModifier(); - }; - - PlayerController.prototype.deactivateModifier = function() { - if (!this.isPlayerInputAllowed()) return; - this.player.deactivateModifier(); - }; - PlayerController.prototype.update = function () { if(this._walkingDirectionStatus != 0) { this.player.move(this._walkingDirectionStatus); } } - // Default behaviour - may be needed later? - PlayerController.prototype.isPlayerInputAllowed = function() { - return true; - }; - PlayerController.prototype.destroy = function() { // extend if necessary }; diff --git a/app/Game/Core/GameController.js b/app/Game/Core/GameController.js index caea9c3..4c4bf71 100755 --- a/app/Game/Core/GameController.js +++ b/app/Game/Core/GameController.js @@ -5,11 +5,10 @@ define([ "Lib/Utilities/NotificationCenter", "Game/" + GLOBALS.context + "/GameObjects/Doll", "Game/" + GLOBALS.context + "/GameObjects/GameObject", - "Game/" + GLOBALS.context + "/GameObjects/Item", - "Lib/Utilities/Assert", + "Lib/Utilities/Assert" ], -function (PhysicsEngine, TiledLevel, Player, nc, Doll, GameObject, Item, Assert) { +function (PhysicsEngine, TiledLevel, Player, Nc, Doll, GameObject, Assert) { "use strict"; @@ -18,14 +17,15 @@ function (PhysicsEngine, TiledLevel, Player, nc, Doll, GameObject, Item, Assert) this.options = options; this.players = {}; this.level = null; - this.worldUpdateObjects = {}; + this.gameObjects = null; + this.resetGameObjects(); this.physicsEngine = new PhysicsEngine(); this.physicsEngine.setCollisionDetector(); this.ncTokens = [ - nc.on(nc.ns.core.game.worldUpdateObjects.add, this.onWorldUpdateObjectAdd, this), - nc.on(nc.ns.core.game.worldUpdateObjects.remove, this.onWorldUpdateObjectRemove, this) + Nc.on(Nc.ns.core.game.gameObject.add, this.onGameObjectAdd, this), + Nc.on(Nc.ns.core.game.gameObject.remove, this.onGameObjectRemove, this) ]; this.loadLevel(options.levelUid); @@ -37,61 +37,89 @@ function (PhysicsEngine, TiledLevel, Player, nc, Doll, GameObject, Item, Assert) // extend for both sides if necessary }; - GameController.prototype.onWorldUpdateObjectAdd = function(object) { - this.worldUpdateObjects[object.uid] = object; + GameController.prototype.resetGameObjects = function() { + this.gameObjects = { + fixed: [], + animated: [] + }; }; - GameController.prototype.onWorldUpdateObjectRemove = function(object) { - delete this.worldUpdateObjects[object.uid]; + GameController.prototype.onGameObjectAdd = function(type, object) { + this.gameObjects[type].push(object); + }; + + GameController.prototype.onGameObjectRemove = function(type, object) { + var i = this.gameObjects[type].indexOf(object); + if(i>=0) this.gameObjects[type].splice(i, 1); }; GameController.prototype.getPhysicsEngine = function () { return this.physicsEngine; }; - GameController.prototype.getItemByUid = function(uid) { - // FIXME : maybe divide this into a dedicated item pool? - return this.worldUpdateObjects[uid]; - }; - GameController.prototype.loadLevel = function (levelUid) { if (this.level) { this.level.destroy(); - this.worldUpdateObjects = {}; + this.resetGameObjects(); } - this.level = new TiledLevel(levelUid, this.physicsEngine); + this.level = new TiledLevel(levelUid, this.physicsEngine, this.gameObjects); }; - /* - * This is now in core, because the recorder/player - * uses the world update mechanism on the channel side - */ GameController.prototype.onWorldUpdate = function (updateData) { - for (var uid in updateData) { - - var gameObject = this.worldUpdateObjects[uid]; - - if (!(gameObject instanceof GameObject)) { - console.warn('Can\'t find object ' + uid + ' in worldUpdateObjects pool:', Object.keys(this.worldUpdateObjects)); - continue; + var body = this.physicsEngine.world.GetBodyList(); + do { + var userData = body.GetUserData(); + if (userData instanceof GameObject) { + var gameObject = userData; + if(updateData[gameObject.uid]) { + var update = updateData[gameObject.uid]; + this.onWorldUpdateGameObject(body, gameObject, update); + } } - this.updateGameObject(gameObject, updateData[uid]); - } + } while (body = body.GetNext()); + }; + GameController.prototype.onWorldUpdateGameObject = function(body, gameObject, update) { + if (gameObject instanceof Doll) { + /* + if(gameObject === this.me.doll) { + this.me.setLastServerPositionState(update); + if(!this.me.acceptPositionStateUpdateFromServer()) { + return; // this is to ignore own doll updates from world update + } + } + */ + gameObject.setActionState(update.as); + gameObject.lookAt(update.laxy.x, update.laxy.y); + } - GameController.prototype.updateGameObject = function(gameObject, gameObjectUpdate) { - gameObject.setUpdateData(gameObjectUpdate); - } + Assert.number(update.p.x, update.p.y); + Assert.number(update.a); + Assert.number(update.lv.x, update.lv.y); + Assert.number(update.av); + + body.SetAwake(true); + body.SetPosition(update.p); + body.SetAngle(update.a); + body.SetLinearVelocity(update.lv); + body.SetAngularVelocity(update.av); + }; GameController.prototype.onResetLevel = function() { this.loadLevel(this.level.uid); }; + /* + GameController.prototype.userJoined = function (user) { + this.players[user.id] = this.createPlayer(user); + } + */ + GameController.prototype.onUserLeft = function (userId) { var player = this.players[userId]; if(!player) { @@ -103,31 +131,48 @@ function (PhysicsEngine, TiledLevel, Player, nc, Doll, GameObject, Item, Assert) delete this.players[userId]; }; - GameController.prototype.createPlayer = function(user, revealedGameController) { - var player = new Player(user.id, this.physicsEngine, user, revealedGameController); + GameController.prototype.createPlayer = function(user) { + var player = new Player(user.id, this.physicsEngine, user); this.players[user.id] = player; return player; }; - GameController.prototype.destroy = function () { + var i = 0; + + /* for(var player in this.players) { - this.players[player].destroy(); + // this.players[player].destroy(); + + // FIXME: + // commented out for now, because players are in gameObjects array. + // try using a real gameobject for the health bar + }*/ + + + for (i = 0; i < this.ncTokens.length; i++) { + Nc.off(this.ncTokens[i]); } - // FIXME ns.client in core? - nc.trigger(nc.ns.client.game.events.destroy); + /* + * Contents of gameObject: Players, Items, Tiles, RagDolls + * No Dolls. + */ - // Testing after destroy if worldUpdateObjects is empty - // events.game.destroy -> gameobjects.destroy() -> nc.trigger(worldUpdateObjects.remove) - if(Object.keys(this.worldUpdateObjects).length > 0) { - console.warn('Not all worldUpdateObjects have been removed... ', Object.keys(this.worldUpdateObjects)); + for (var key in this.gameObjects) { + for (i = 0; i < this.gameObjects[key].length; i++) { + var gameObject = this.gameObjects[key][i]; + + gameObject.destroy(); + } } + this.gameObjects = { + fixed: [], + animated: [] + }; + this.physicsEngine.destroy(); - this.worldUpdateObjects = null; - - nc.off(this.ncTokens); }; return GameController; diff --git a/app/Game/Core/GameObjects/Doll.js b/app/Game/Core/GameObjects/Doll.js index 32c3e05..8090fb8 100755 --- a/app/Game/Core/GameObjects/Doll.js +++ b/app/Game/Core/GameObjects/Doll.js @@ -9,7 +9,7 @@ define([ "Lib/Utilities/Assert" ], -function (Parent, Exception, Box2D, Settings, CollisionDetector, Item, nc, Assert) { +function (Parent, Exception, Box2D, Settings, CollisionDetector, Item, Nc, Assert) { "use strict"; @@ -40,12 +40,11 @@ function (Parent, Exception, Box2D, Settings, CollisionDetector, Item, nc, Asser this.holdingJoint = null; this.holdingItem = null; - this.ragDoll = {head: null, body: null}; // FIXME: wtf is this? can we remove it? + this.ragDoll = {head: null, body: null}; this.createFixtures(); this.body.SetActive(false); - nc.trigger(nc.ns.core.game.worldUpdateObjects.add, this); } Doll.prototype = Object.create(Parent.prototype); @@ -228,14 +227,14 @@ function (Parent, Exception, Box2D, Settings, CollisionDetector, Item, nc, Asser } }; - Doll.prototype.move = function (direction, modifierActivated) { + Doll.prototype.move = function (direction) { this.moveDirection = direction; var speed; var isHoldingHeavyItem = this.holdingItem && this.holdingItem.options.weight > Settings.MAX_RUNNING_WEIGHT; switch(true) { - case direction == this.lookDirection && this.isStanding() && !isHoldingHeavyItem && !modifierActivated: + case direction == this.lookDirection && this.isStanding() && !isHoldingHeavyItem: speed = Settings.RUN_SPEED; break; @@ -264,7 +263,7 @@ function (Parent, Exception, Box2D, Settings, CollisionDetector, Item, nc, Asser if(this.isStanding()) { if(this.moveDirection == this.lookDirection) { - if(isHoldingHeavyItem || modifierActivated) { + if(isHoldingHeavyItem) { this.setActionState("walk"); } else { this.setActionState("run"); @@ -472,16 +471,7 @@ function (Parent, Exception, Box2D, Settings, CollisionDetector, Item, nc, Asser } }; - Doll.prototype.setUpdateData = function(update) { - - Parent.prototype.setUpdateData.call(this, update); - - this.setActionState(update.as); - this.lookAt(update.laxy.x, update.laxy.y); - }; - Doll.prototype.destroy = function() { - nc.trigger(nc.ns.core.game.worldUpdateObjects.remove, this); Parent.prototype.destroy.call(this); }; diff --git a/app/Game/Core/GameObjects/GameObject.js b/app/Game/Core/GameObjects/GameObject.js index a1eb12d..d0c26bf 100755 --- a/app/Game/Core/GameObjects/GameObject.js +++ b/app/Game/Core/GameObjects/GameObject.js @@ -1,11 +1,9 @@ define([ "Lib/Vendor/Box2D", - "Lib/Utilities/Exception", - "Lib/Utilities/Assert", - "Lib/Utilities/NotificationCenter" + "Lib/Utilities/Exception" ], -function (Box2D, Exception, Assert, nc) { +function (Box2D, Exception) { "use strict"; @@ -14,11 +12,7 @@ function (Box2D, Exception, Assert, nc) { var def = this.getBodyDef(); def.userData = this; - this.body = physicsEngine.createBody(def); - - this.ncTokens = (this.ncTokens || []).concat([ - nc.on(nc.ns.client.game.events.destroy, this.destroy, this) - ]); + this.body = physicsEngine.getWorld().CreateBody(def); } GameObject.prototype.getBodyDef = function() { @@ -26,14 +20,11 @@ function (Box2D, Exception, Assert, nc) { }; GameObject.prototype.destroy = function() { - if(this.body instanceof Box2D.Dynamics.b2Body) { this.body.GetWorld().DestroyBody(this.body); } else { throw new Exception("can not destroy body"); } - - nc.off(this.ncTokens); }; GameObject.prototype.getBody = function() { @@ -43,20 +34,6 @@ function (Box2D, Exception, Assert, nc) { GameObject.prototype.getPosition = function() { return this.body.GetPosition().Copy(); }; - - GameObject.prototype.setUpdateData = function(update) { - - Assert.number(update.p.x, update.p.y); - Assert.number(update.a); - Assert.number(update.lv.x, update.lv.y); - Assert.number(update.av); - - this.body.SetAwake(true); - this.body.SetPosition(update.p); - this.body.SetAngle(update.a); - this.body.SetLinearVelocity(update.lv); - this.body.SetAngularVelocity(update.av); - }; return GameObject; diff --git a/app/Game/Core/GameObjects/Item.js b/app/Game/Core/GameObjects/Item.js index 4e25fb0..b766a6f 100644 --- a/app/Game/Core/GameObjects/Item.js +++ b/app/Game/Core/GameObjects/Item.js @@ -1,14 +1,14 @@ define([ "Game/" + GLOBALS.context + "/GameObjects/GameObject", "Lib/Vendor/Box2D", - "Lib/Utilities/OptionsHelper", + "Lib/Utilities/Options", "Game/Config/Settings", "Lib/Utilities/Exception", "Lib/Utilities/NotificationCenter", "Lib/Utilities/Assert" ], -function (Parent, Box2D, optionsHelper, Settings, Exception, nc, Assert) { +function (Parent, Box2D, Options, Settings, Exception, Nc, Assert) { "use strict"; @@ -26,7 +26,7 @@ function (Parent, Box2D, optionsHelper, Settings, Exception, nc, Assert) { y: parseFloat(options.y) }; - this.options = optionsHelper.merge(floatOptions, options); + this.options = Options.merge(floatOptions, options); if(!this.options.category) { // FIXME add more validation @@ -41,7 +41,7 @@ function (Parent, Box2D, optionsHelper, Settings, Exception, nc, Assert) { this.body.SetBullet(true); } - nc.trigger(nc.ns.core.game.worldUpdateObjects.add, this); + Nc.trigger(Nc.ns.core.game.gameObject.add, "animated", this); } Item.prototype = Object.create(Parent.prototype); @@ -128,8 +128,8 @@ function (Parent, Box2D, optionsHelper, Settings, Exception, nc, Assert) { handPosition.y ); this.body.SetPosition(position); - this.body.SetAngle((this.options.grabAngle || 0.0) * direction); this.flip(direction); + this.body.SetAngle((this.options.grabAngle || 0) * direction); }; Item.prototype.getGrabPoint = function() { @@ -158,7 +158,7 @@ function (Parent, Box2D, optionsHelper, Settings, Exception, nc, Assert) { }; Item.prototype.destroy = function() { - nc.trigger(nc.ns.core.game.worldUpdateObjects.remove, this); + Nc.trigger(Nc.ns.core.game.gameObject.remove, "animated", this); Parent.prototype.destroy.call(this); }; diff --git a/app/Game/Core/GameObjects/Items/RagDoll.js b/app/Game/Core/GameObjects/Items/RagDoll.js index 48faba6..1d5a53e 100644 --- a/app/Game/Core/GameObjects/Items/RagDoll.js +++ b/app/Game/Core/GameObjects/Items/RagDoll.js @@ -4,11 +4,11 @@ define([ "Game/Config/Settings", "Lib/Utilities/NotificationCenter", "Lib/Utilities/Assert", - "Lib/Utilities/OptionsHelper", + "Lib/Utilities/Options", "Game/Config/ItemSettings", ], -function (Parent, Box2D, Settings, nc, Assert, optionsHelper, ItemSettings) { +function (Parent, Box2D, Settings, Nc, Assert, Options, ItemSettings) { "use strict"; @@ -96,8 +96,8 @@ function (Parent, Box2D, Settings, nc, Assert, optionsHelper, ItemSettings) { // FIXME - var ragdollOptions = optionsHelper.merge(ItemSettings.RagDoll, ItemSettings.Default); - options = optionsHelper.merge(options, ragdollOptions); + var ragdollOptions = Options.merge(ItemSettings.RagDoll, ItemSettings.Default); + options = Options.merge(options, ragdollOptions); Parent.call(this, physicsEngine, uid, options); //this.createSensor(); @@ -352,7 +352,7 @@ function (Parent, Box2D, Settings, nc, Assert, optionsHelper, ItemSettings) { chestPosition.y + this.options.limbs.head.y / Settings.RATIO ); this.limbs.head.SetPosition(position); - this.limbs.head.SetAngle((this.options.grabAngle || 0.0) * direction); + this.limbs.head.SetAngle((this.options.grabAngle || 0) * direction); }; RagDoll.prototype.throw = function(options, carrierVelocity) { @@ -378,6 +378,7 @@ function (Parent, Box2D, Settings, nc, Assert, optionsHelper, ItemSettings) { RagDoll.prototype.destroy = function() { + Nc.trigger(Nc.ns.core.game.gameObject.remove, "animated", this); var world = this.body.GetWorld(); for (var name in this.limbs) { diff --git a/app/Game/Core/GameObjects/Items/Rube.js b/app/Game/Core/GameObjects/Items/Rube.js new file mode 100644 index 0000000..ccc06a6 --- /dev/null +++ b/app/Game/Core/GameObjects/Items/Rube.js @@ -0,0 +1,1412 @@ +define([ + "Game/" + GLOBALS.context + "/GameObjects/Item", + "Lib/Vendor/RubeLoader", + "Lib/Vendor/Box2D", + "Game/Config/Settings", + "Lib/Utilities/Assert" +], + +function (Parent, RubeLoader, Box2D, Settings, Assert) { + + "use strict"; + + // Fixme - make this loadable + var __ragdollJson; + + function Rube(physicsEngine, uid, options) { + Assert.number(options.x, options.y); + + this.rubeLoader = null; + this.body = null; + + Parent.call(this, physicsEngine, uid, options); + var world = physicsEngine.getWorld(); + world.DestroyBody(this.body); + + var json = __ragdollJson; + + this.rubeLoader = new RubeLoader(json, world); + var scene = this.rubeLoader.getScene(); + + for (var i in scene.bodies) { + var body = scene.bodies[i]; + var position = body.GetPosition().Copy(); + position.Add(new Box2D.Common.Math.b2Vec2( + options.x / Settings.RATIO, + options.y / Settings.RATIO + )); + body.SetPosition(position); + + if(body.name == "chest"){ + this.body = body; + } + } + + var def = this.body.GetDefinition(); + def.userData = this; + this.body.SetUserData(this); + } + + Rube.prototype = Object.create(Parent.prototype); + + Rube.prototype.flip = function(direction) { + Parent.prototype.flip.call(this, direction); + // Extend + }; + + __ragdollJson = + +{ + "allowSleep" : true, + "autoClearForces" : true, + "body" : + [ + + { + "angle" : 0, + "angularVelocity" : 0, + "awake" : true, + "fixture" : + [ + + { + "density" : 1, + "filter-groupIndex" : -55, + "friction" : 0.2, + "name" : "fixture3", + "polygon" : + { + "vertices" : + { + "x" : + [ + 0.05748672783374786, + 0.05748672783374786, + -0.05748683214187622, + -0.05748683214187622 + ], + "y" : + [ + -0.2322469353675842, + 0.2322462797164917, + 0.2322462797164917, + -0.2322469353675842 + ] + } + } + } + ], + "linearVelocity" : 0, + "massData-I" : 0.001019014045596123, + "massData-center" : + { + "x" : -5.215406062575312e-08, + "y" : -3.278255462646484e-07 + }, + "massData-mass" : 0.05340443924069405, + "name" : "upperArmLeft", + "position" : + { + "x" : -0.1699507087469101, + "y" : 1.113796472549438 + }, + "type" : 2 + }, + + { + "angle" : 0, + "angularVelocity" : 0, + "awake" : true, + "fixture" : + [ + + { + "density" : 1, + "filter-groupIndex" : -55, + "friction" : 0.2, + "name" : "fixture0", + "polygon" : + { + "vertices" : + { + "x" : + [ + 0.1718577891588211, + 0.1684816330671310, + 0.001688212156295776, + -0.1718577295541763, + -0.1718577295541763, + 0.001460619270801544 + ], + "y" : + [ + -0.3928470611572266, + 0.4921868443489075, + 0.4921868443489075, + 0.3841522336006165, + -0.4204435348510742, + -0.4519201517105103 + ] + } + } + }, + + { + "density" : 1, + "filter-groupIndex" : -55, + "friction" : 0.2, + "name" : "fixture2", + "polygon" : + { + "vertices" : + { + "x" : + [ + 0.1679489463567734, + 0.1679489463567734, + -0.004204027354717255, + -0.004204027354717255 + ], + "y" : + [ + 0.4449140429496765, + 0.6170670390129089, + 0.6170670390129089, + 0.4449140429496765 + ] + } + } + } + ], + "linearVelocity" : 0, + "massData-I" : 0.03228222951292992, + "massData-center" : + { + "x" : 0.008858840912580490, + "y" : 0.06282533705234528 + }, + "massData-mass" : 0.3355117142200470, + "name" : "chest", + "position" : + { + "x" : -0.05338868126273155, + "y" : 0.9620395302772522 + }, + "type" : 2 + }, + + { + "angle" : 0, + "angularVelocity" : 0, + "awake" : true, + "fixture" : + [ + + { + "circle" : + { + "center" : + { + "x" : -0.007499951869249344, + "y" : 0.003749847412109375 + }, + "radius" : 0.2746430933475494 + }, + "density" : 0.2204959988594055, + "filter-groupIndex" : -55, + "friction" : 0.2, + "name" : "fixture1" + }, + + { + "circle" : + { + "center" : + { + "x" : -0.03327952325344086, + "y" : -0.1384725570678711 + }, + "radius" : 0.2485582530498505 + }, + "density" : 0.2204959988594055, + "filter-groupIndex" : -55, + "friction" : 0.2, + "name" : "fixture1" + } + ], + "linearVelocity" : 0, + "massData-I" : 0.004164268728345633, + "massData-center" : + { + "x" : -0.01910765282809734, + "y" : -0.06028826907277107 + }, + "massData-mass" : 0.09504657238721848, + "name" : "head", + "position" : + { + "x" : 0.04257059469819069, + "y" : 1.812389135360718 + }, + "type" : 2 + }, + + { + "angle" : 0, + "angularVelocity" : 0, + "awake" : true, + "fixture" : + [ + + { + "density" : 1, + "filter-groupIndex" : -55, + "friction" : 0.2, + "name" : "fixture3", + "polygon" : + { + "vertices" : + { + "x" : + [ + 0.05748683214187622, + 0.05748683214187622, + -0.05748690664768219, + -0.05748690664768219 + ], + "y" : + [ + -0.1419981122016907, + 0.1419981718063354, + 0.1419981718063354, + -0.1419981122016907 + ] + } + } + } + ], + "linearVelocity" : 0, + "massData-I" : 0.0002554289239924401, + "massData-center" : + { + "x" : -3.725290298461914e-08, + "y" : 2.980232238769531e-08 + }, + "massData-mass" : 0.03265211358666420, + "name" : "lowerArmRight", + "position" : + { + "x" : 0.1177217364311218, + "y" : 0.8479318022727966 + }, + "type" : 2 + }, + + { + "angle" : 0, + "angularVelocity" : 0, + "awake" : true, + "fixture" : + [ + + { + "density" : 1, + "filter-groupIndex" : -55, + "friction" : 0.2, + "name" : "fixture3", + "polygon" : + { + "vertices" : + { + "x" : + [ + 0.1415265351533890, + 0.1415265351533890, + -0.08457186818122864, + -0.08457186818122864 + ], + "y" : + [ + -0.1143886670470238, + -0.05680520832538605, + -0.05680520832538605, + -0.1143886670470238 + ] + } + } + }, + + { + "density" : 1, + "filter-groupIndex" : -55, + "friction" : 0.2, + "name" : "fixture3", + "polygon" : + { + "vertices" : + { + "x" : + [ + 0.08623030036687851, + 0.08623030036687851, + -0.08623020350933075, + -0.08623020350933075 + ], + "y" : + [ + -0.1138511821627617, + 0.1565139442682266, + 0.1565139442682266, + -0.1138511821627617 + ] + } + } + } + ], + "linearVelocity" : 0, + "massData-I" : 0.0005858240183442831, + "massData-center" : + { + "x" : 0.006215983536094427, + "y" : -0.002008607611060143 + }, + "massData-mass" : 0.05964682996273041, + "name" : "lowerLegLeft", + "position" : + { + "x" : -0.08319067955017090, + "y" : 0.1298431605100632 + }, + "type" : 2 + }, + + { + "angle" : 0, + "angularVelocity" : 0, + "awake" : true, + "fixture" : + [ + + { + "density" : 1, + "filter-groupIndex" : -55, + "friction" : 0.2, + "name" : "fixture3", + "polygon" : + { + "vertices" : + { + "x" : + [ + 0.05748684704303741, + 0.05748684704303741, + -0.05748672783374786, + -0.05748672783374786 + ], + "y" : + [ + -0.1419981122016907, + 0.1419981718063354, + 0.1419981718063354, + -0.1419981122016907 + ] + } + } + } + ], + "linearVelocity" : 0, + "massData-I" : 0.0002554284874349833, + "massData-center" : + { + "x" : 5.960464477539062e-08, + "y" : 2.980232238769531e-08 + }, + "massData-mass" : 0.03265206888318062, + "name" : "lowerArmLeft", + "position" : + { + "x" : -0.1699528992176056, + "y" : 0.8479318022727966 + }, + "type" : 2 + }, + + { + "angle" : 0, + "angularVelocity" : 0, + "awake" : true, + "fixture" : + [ + + { + "density" : 1, + "filter-groupIndex" : -55, + "friction" : 0.2, + "name" : "fixture3", + "polygon" : + { + "vertices" : + { + "x" : + [ + 0.05748683214187622, + 0.05748683214187622, + -0.05748690664768219, + -0.05748690664768219 + ], + "y" : + [ + -0.2322469353675842, + 0.2322462797164917, + 0.2322462797164917, + -0.2322469353675842 + ] + } + } + } + ], + "linearVelocity" : 0, + "massData-I" : 0.001019015791825950, + "massData-center" : + { + "x" : -3.725290298461914e-08, + "y" : -3.278255462646484e-07 + }, + "massData-mass" : 0.05340452119708061, + "name" : "upperArmRight", + "position" : + { + "x" : 0.1177217364311218, + "y" : 1.113796472549438 + }, + "type" : 2 + }, + + { + "angle" : 0, + "angularVelocity" : 0, + "awake" : true, + "fixture" : + [ + + { + "density" : 1, + "filter-groupIndex" : -55, + "friction" : 0.2, + "name" : "fixture3", + "polygon" : + { + "vertices" : + { + "x" : + [ + 0.08623021841049194, + 0.08623021841049194, + -0.08623008430004120, + -0.08623008430004120 + ], + "y" : + [ + -0.2315792292356491, + 0.2315795421600342, + 0.2315795421600342, + -0.2315792292356491 + ] + } + } + } + ], + "linearVelocity" : 0, + "massData-I" : 0.001625877106562257, + "massData-center" : + { + "x" : 6.705522537231445e-08, + "y" : 1.564621925354004e-07 + }, + "massData-mass" : 0.07987650483846664, + "name" : "upperLegRight", + "position" : + { + "x" : 0.03142313286662102, + "y" : 0.4171121716499329 + }, + "type" : 2 + }, + + { + "angle" : 0, + "angularVelocity" : 0, + "awake" : true, + "fixture" : + [ + + { + "density" : 1, + "filter-groupIndex" : -55, + "friction" : 0.2, + "name" : "fixture3", + "polygon" : + { + "vertices" : + { + "x" : + [ + 0.08623032271862030, + 0.08623032271862030, + -0.08623017370700836, + -0.08623017370700836 + ], + "y" : + [ + -0.2315792292356491, + 0.2315795421600342, + 0.2315795421600342, + -0.2315792292356491 + ] + } + } + } + ], + "linearVelocity" : 0, + "massData-I" : 0.001625879434868693, + "massData-center" : + { + "x" : 7.450580596923828e-08, + "y" : 1.564621925354004e-07 + }, + "massData-mass" : 0.07987659424543381, + "name" : "upperLegLeft", + "position" : + { + "x" : -0.08319067955017090, + "y" : 0.4171121716499329 + }, + "type" : 2 + }, + + { + "angle" : 0, + "angularVelocity" : 0, + "awake" : true, + "fixture" : + [ + + { + "density" : 1, + "filter-groupIndex" : -55, + "friction" : 0.2, + "name" : "fixture3", + "polygon" : + { + "vertices" : + { + "x" : + [ + 0.08623021841049194, + 0.08623021841049194, + -0.08623008430004120, + -0.08623008430004120 + ], + "y" : + [ + -0.1138515025377274, + 0.1563164740800858, + 0.1563164740800858, + -0.1138515025377274 + ] + } + } + }, + + { + "density" : 1, + "filter-groupIndex" : -55, + "friction" : 0.2, + "name" : "fixture3", + "polygon" : + { + "vertices" : + { + "x" : + [ + 0.1415264606475830, + 0.1415264606475830, + -0.08457189798355103, + -0.08457189798355103 + ], + "y" : + [ + -0.1143886670470238, + -0.05680520832538605, + -0.05680520832538605, + -0.1143886670470238 + ] + } + } + } + ], + "linearVelocity" : 0, + "massData-I" : 0.0005849063745699823, + "massData-center" : + { + "x" : 0.006219535600394011, + "y" : -0.002099231118336320 + }, + "massData-mass" : 0.05961277708411217, + "name" : "lowerLegRight", + "position" : + { + "x" : 0.03142313286662102, + "y" : 0.1298431605100632 + }, + "type" : 2 + } + ], + "collisionbitplanes" : + { + "names" : + [ + "bitplane1", + "bitplane2", + "bitplane3", + "bitplane4", + "bitplane5", + "bitplane6", + "bitplane7", + "bitplane8", + "bitplane9", + "bitplane10", + "bitplane11", + "bitplane12", + "bitplane13", + "bitplane14", + "bitplane15", + "bitplane16", + "bitplane17", + "bitplane18", + "bitplane19", + "bitplane20", + "bitplane21", + "bitplane22", + "bitplane23", + "bitplane24", + "bitplane25", + "bitplane26", + "bitplane27", + "bitplane28", + "bitplane29", + "bitplane30", + "bitplane31", + "bitplane32" + ] + }, + "continuousPhysics" : true, + "gravity" : + { + "x" : 0, + "y" : -10 + }, + "image" : + [ + + { + "aspectScale" : 1, + "body" : 9, + "center" : + { + "x" : 0.02911517955362797, + "y" : -0.0009155124425888062 + }, + "corners" : + { + "x" : + [ + -0.08536797016859055, + 0.1435983330011368, + 0.1435983330011368, + -0.08536797016859055 + ], + "y" : + [ + -0.1153986603021622, + -0.1153986603021622, + 0.1135676354169846, + 0.1135676354169846 + ] + }, + "file" : "../../img/Characters/Chuck/lowerLeftLeg.png", + "filter" : 0, + "glDrawElements" : [ 0, 1, 2, 2, 3, 0 ], + "glTexCoordPointer" : [ 0.0, 0.0, 1, 0.0, 1, 1, 0.0, 1 ], + "glVertexPointer" : + [ + -0.08536797016859055, + -0.1153986603021622, + 0.1435983330011368, + -0.1153986603021622, + 0.1435983330011368, + 0.1135676354169846, + -0.08536797016859055, + 0.1135676354169846 + ], + "name" : "image5", + "opacity" : 1, + "scale" : 0.2289662957191467 + }, + + { + "aspectScale" : 1, + "body" : 7, + "center" : + { + "x" : -0.02732392773032188, + "y" : 0.02671334147453308 + }, + "corners" : + { + "x" : + [ + -0.1425068378448486, + 0.08785898983478546, + 0.08785898983478546, + -0.1425068378448486 + ], + "y" : + [ + -0.2324482202529907, + -0.2324482202529907, + 0.2858749032020569, + 0.2858749032020569 + ] + }, + "file" : "../../img/Characters/Chuck/upperRightLeg.png", + "filter" : 0, + "glDrawElements" : [ 0, 1, 2, 2, 3, 0 ], + "glTexCoordPointer" : [ 0.0, 0.0, 1, 0.0, 1, 1, 0.0, 1 ], + "glVertexPointer" : + [ + -0.1425068378448486, + -0.2324482202529907, + 0.08785898983478546, + -0.2324482202529907, + 0.08785898983478546, + 0.2858749032020569, + -0.1425068378448486, + 0.2858749032020569 + ], + "name" : "image6", + "opacity" : 1, + "scale" : 0.5183231234550476 + }, + + { + "aspectScale" : 1, + "body" : 6, + "center" : + { + "x" : 0.0003027096390724182, + "y" : 0.0006600618362426758 + }, + "corners" : + { + "x" : + [ + -0.05836960300803185, + 0.05897502228617668, + 0.05897502228617668, + -0.05836960300803185 + ], + "y" : + [ + -0.2340291887521744, + -0.2340291887521744, + 0.2353493124246597, + 0.2353493124246597 + ] + }, + "file" : "../../img/Characters/Chuck/upperLeftArm.png", + "filter" : 0, + "glDrawElements" : [ 0, 1, 2, 2, 3, 0 ], + "glTexCoordPointer" : [ 0.0, 0.0, 1, 0.0, 1, 1, 0.0, 1 ], + "glVertexPointer" : + [ + -0.05836960300803185, + -0.2340291887521744, + 0.05897502228617668, + -0.2340291887521744, + 0.05897502228617668, + 0.2353493124246597, + -0.05836960300803185, + 0.2353493124246597 + ], + "name" : "image4", + "opacity" : 1, + "renderOrder" : 1, + "scale" : 0.4693785011768341 + }, + + { + "aspectScale" : 1, + "body" : 3, + "center" : + { + "x" : 0.0007003694772720337, + "y" : 0.001779437065124512 + }, + "corners" : + { + "x" : + [ + -0.05596264451742172, + 0.05736338347196579, + 0.05736338347196579, + -0.05596264451742172 + ], + "y" : + [ + -0.1398780941963196, + -0.1398780941963196, + 0.1434369683265686, + 0.1434369683265686 + ] + }, + "file" : "../../img/Characters/Chuck/lowerLeftArm.png", + "filter" : 0, + "glDrawElements" : [ 0, 1, 2, 2, 3, 0 ], + "glTexCoordPointer" : [ 0.0, 0.0, 1, 0.0, 1, 1, 0.0, 1 ], + "glVertexPointer" : + [ + -0.05596264451742172, + -0.1398780941963196, + 0.05736338347196579, + -0.1398780941963196, + 0.05736338347196579, + 0.1434369683265686, + -0.05596264451742172, + 0.1434369683265686 + ], + "name" : "image3", + "opacity" : 1, + "renderOrder" : 1, + "scale" : 0.2833150625228882 + }, + + { + "aspectScale" : 1, + "body" : 1, + "center" : + { + "x" : -0.0008481591939926147, + "y" : -0.001265347003936768 + }, + "corners" : + { + "x" : + [ + -0.1698881536722183, + 0.1681918352842331, + 0.1681918352842331, + -0.1698881536722183 + ], + "y" : + [ + -0.480212002992630, + -0.480212002992630, + 0.4776813089847565, + 0.4776813089847565 + ] + }, + "file" : "../../img/Characters/Chuck/chest.png", + "filter" : 0, + "glDrawElements" : [ 0, 1, 2, 2, 3, 0 ], + "glTexCoordPointer" : [ 0.0, 0.0, 1, 0.0, 1, 1, 0.0, 1 ], + "glVertexPointer" : + [ + -0.1698881536722183, + -0.480212002992630, + 0.1681918352842331, + -0.480212002992630, + 0.1681918352842331, + 0.4776813089847565, + -0.1698881536722183, + 0.4776813089847565 + ], + "name" : "image2", + "opacity" : 1, + "renderOrder" : 5, + "scale" : 0.9578933119773865 + }, + + { + "aspectScale" : 1, + "body" : 8, + "center" : + { + "x" : 0.003173574805259705, + "y" : -0.001172244548797607 + }, + "corners" : + { + "x" : + [ + -0.1414211541414261, + 0.1477683037519455, + 0.1477683037519455, + -0.1414211541414261 + ], + "y" : + [ + -0.2325238138437271, + -0.2325238138437271, + 0.2301793247461319, + 0.2301793247461319 + ] + }, + "file" : "../../img/Characters/Chuck/upperLeftLeg.png", + "filter" : 0, + "glDrawElements" : [ 0, 1, 2, 2, 3, 0 ], + "glTexCoordPointer" : [ 0.0, 0.0, 1, 0.0, 1, 1, 0.0, 1 ], + "glVertexPointer" : + [ + -0.1414211541414261, + -0.2325238138437271, + 0.1477683037519455, + -0.2325238138437271, + 0.1477683037519455, + 0.2301793247461319, + -0.1414211541414261, + 0.2301793247461319 + ], + "name" : "image6", + "opacity" : 1, + "renderOrder" : 6, + "scale" : 0.4627031385898590 + }, + + { + "aspectScale" : 1, + "body" : 4, + "center" : + { + "x" : 0.02851789817214012, + "y" : -0.0009155124425888062 + }, + "corners" : + { + "x" : + [ + -0.08596524596214294, + 0.1430010497570038, + 0.1430010497570038, + -0.08596524596214294 + ], + "y" : + [ + -0.1153986603021622, + -0.1153986603021622, + 0.1135676354169846, + 0.1135676354169846 + ] + }, + "file" : "../../img/Characters/Chuck/lowerLeftLeg.png", + "filter" : 0, + "glDrawElements" : [ 0, 1, 2, 2, 3, 0 ], + "glTexCoordPointer" : [ 0.0, 0.0, 1, 0.0, 1, 1, 0.0, 1 ], + "glVertexPointer" : + [ + -0.08596524596214294, + -0.1153986603021622, + 0.1430010497570038, + -0.1153986603021622, + 0.1430010497570038, + 0.1135676354169846, + -0.08596524596214294, + 0.1135676354169846 + ], + "name" : "image5", + "opacity" : 1, + "renderOrder" : 6, + "scale" : 0.2289662957191467 + }, + + { + "aspectScale" : 1, + "body" : 2, + "center" : + { + "x" : 0.01975236460566521, + "y" : -0.07194232940673828 + }, + "corners" : + { + "x" : + [ + -0.2679373621940613, + 0.3074420690536499, + 0.3074420690536499, + -0.2679373621940613 + ], + "y" : + [ + -0.4171699881553650, + -0.4171699881553650, + 0.2732853293418884, + 0.2732853293418884 + ] + }, + "file" : "../../img/Characters/Chuck/head.png", + "filter" : 0, + "glDrawElements" : [ 0, 1, 2, 2, 3, 0 ], + "glTexCoordPointer" : [ 0.0, 0.0, 1, 0.0, 1, 1, 0.0, 1 ], + "glVertexPointer" : + [ + -0.2679373621940613, + -0.4171699881553650, + 0.3074420690536499, + -0.4171699881553650, + 0.3074420690536499, + 0.2732853293418884, + -0.2679373621940613, + 0.2732853293418884 + ], + "name" : "image1", + "opacity" : 1, + "renderOrder" : 6, + "scale" : 0.6904553174972534 + }, + + { + "aspectScale" : 1, + "body" : 0, + "center" : + { + "x" : 0.002138927578926086, + "y" : 0.0006600618362426758 + }, + "corners" : + { + "x" : + [ + -0.05653338506817818, + 0.06081124022603035, + 0.06081124022603035, + -0.05653338506817818 + ], + "y" : + [ + -0.2340291887521744, + -0.2340291887521744, + 0.2353493124246597, + 0.2353493124246597 + ] + }, + "file" : "../../img/Characters/Chuck/upperLeftArm.png", + "filter" : 0, + "glDrawElements" : [ 0, 1, 2, 2, 3, 0 ], + "glTexCoordPointer" : [ 0.0, 0.0, 1, 0.0, 1, 1, 0.0, 1 ], + "glVertexPointer" : + [ + -0.05653338506817818, + -0.2340291887521744, + 0.06081124022603035, + -0.2340291887521744, + 0.06081124022603035, + 0.2353493124246597, + -0.05653338506817818, + 0.2353493124246597 + ], + "name" : "image4", + "opacity" : 1, + "renderOrder" : 8, + "scale" : 0.4693785011768341 + }, + + { + "aspectScale" : 1, + "body" : 5, + "center" : + { + "x" : 0.002538725733757019, + "y" : 0.001779437065124512 + }, + "corners" : + { + "x" : + [ + -0.05412428826093674, + 0.05920173972845078, + 0.05920173972845078, + -0.05412428826093674 + ], + "y" : + [ + -0.1398780941963196, + -0.1398780941963196, + 0.1434369683265686, + 0.1434369683265686 + ] + }, + "file" : "../../img/Characters/Chuck/lowerLeftArm.png", + "filter" : 0, + "glDrawElements" : [ 0, 1, 2, 2, 3, 0 ], + "glTexCoordPointer" : [ 0.0, 0.0, 1, 0.0, 1, 1, 0.0, 1 ], + "glVertexPointer" : + [ + -0.05412428826093674, + -0.1398780941963196, + 0.05920173972845078, + -0.1398780941963196, + 0.05920173972845078, + 0.1434369683265686, + -0.05412428826093674, + 0.1434369683265686 + ], + "name" : "image3", + "opacity" : 1, + "renderOrder" : 8, + "scale" : 0.2833150625228882 + } + ], + "joint" : + [ + + { + "anchorA" : + { + "x" : 0.001047849655151367, + "y" : -0.1790249347686768 + }, + "anchorB" : + { + "x" : 0.001048207283020020, + "y" : 0.08683943748474121 + }, + "bodyA" : 0, + "bodyB" : 5, + "enableLimit" : true, + "enableMotor" : false, + "jointSpeed" : 0, + "lowerLimit" : 0, + "maxMotorTorque" : 1, + "motorSpeed" : 0, + "name" : "joint4", + "refAngle" : 0, + "type" : "revolute", + "upperLimit" : 1.919862151145935 + }, + + { + "anchorA" : + { + "x" : -0.1165831685066223, + "y" : 0.3330366015434265 + }, + "anchorB" : + { + "x" : -2.135336399078369e-05, + "y" : 0.1812803745269775 + }, + "bodyA" : 1, + "bodyB" : 0, + "enableLimit" : false, + "enableMotor" : false, + "jointSpeed" : 0, + "lowerLimit" : -2.268928050994873, + "maxMotorTorque" : 1, + "motorSpeed" : 0, + "name" : "joint3", + "refAngle" : 0, + "type" : "revolute", + "upperLimit" : 3.141592741012573 + }, + + { + "anchorA" : + { + "x" : 0.07454992830753326, + "y" : 0.5068108439445496 + }, + "anchorB" : + { + "x" : -0.02141102217137814, + "y" : -0.3435407876968384 + }, + "bodyA" : 1, + "bodyB" : 2, + "enableLimit" : true, + "enableMotor" : false, + "jointSpeed" : 0, + "lowerLimit" : -1.221730470657349, + "maxMotorTorque" : 1, + "motorSpeed" : 0, + "name" : "joint0", + "refAngle" : 0, + "type" : "revolute", + "upperLimit" : 0.6981316804885864 + }, + + { + "anchorA" : + { + "x" : 0.1367489844560623, + "y" : -0.3606387376785278 + }, + "anchorB" : + { + "x" : 0.05056380107998848, + "y" : 0.1842886805534363 + }, + "bodyA" : 1, + "bodyB" : 7, + "enableLimit" : true, + "enableMotor" : false, + "jointSpeed" : 0, + "lowerLimit" : -0.6981316804885864, + "maxMotorTorque" : 1, + "motorSpeed" : 0, + "name" : "joint5", + "refAngle" : 0, + "type" : "revolute", + "upperLimit" : 1.919862151145935 + }, + + { + "anchorA" : + { + "x" : -0.08329562842845917, + "y" : -0.3541148304939270 + }, + "anchorB" : + { + "x" : -0.05503869056701660, + "y" : 0.1909851431846619 + }, + "bodyA" : 1, + "bodyB" : 8, + "enableLimit" : true, + "enableMotor" : false, + "jointSpeed" : 0, + "lowerLimit" : -0.6981316804885864, + "maxMotorTorque" : 1, + "motorSpeed" : 0, + "name" : "joint6", + "refAngle" : 0, + "type" : "revolute", + "upperLimit" : 1.919862151145935 + }, + + { + "anchorA" : + { + "x" : 0.1710196435451508, + "y" : 0.3308989405632019 + }, + "anchorB" : + { + "x" : -9.131431579589844e-05, + "y" : 0.1791421175003052 + }, + "bodyA" : 1, + "bodyB" : 6, + "enableLimit" : false, + "enableMotor" : false, + "jointSpeed" : 0, + "lowerLimit" : -2.268928050994873, + "maxMotorTorque" : 1, + "motorSpeed" : 0, + "name" : "joint2", + "refAngle" : 0, + "type" : "revolute", + "upperLimit" : 3.141592741012573 + }, + + { + "anchorA" : + { + "x" : 0.0004334598779678345, + "y" : 0.08706557750701904 + }, + "anchorB" : + { + "x" : 0.0004332214593887329, + "y" : -0.1787990331649780 + }, + "bodyA" : 3, + "bodyB" : 6, + "enableLimit" : true, + "enableMotor" : false, + "jointSpeed" : 0, + "lowerLimit" : 0, + "maxMotorTorque" : 1, + "motorSpeed" : 0, + "name" : "joint1", + "refAngle" : 0, + "type" : "revolute", + "upperLimit" : 1.919862151145935 + }, + + { + "anchorA" : + { + "x" : 0.002425249665975571, + "y" : -0.1845821887254715 + }, + "anchorB" : + { + "x" : 0.002425376325845718, + "y" : 0.1026860624551773 + }, + "bodyA" : 7, + "bodyB" : 9, + "enableLimit" : true, + "enableMotor" : false, + "jointSpeed" : 0, + "lowerLimit" : -2.268928050994873, + "maxMotorTorque" : 1, + "motorSpeed" : 0, + "name" : "joint8", + "refAngle" : 0, + "type" : "revolute", + "upperLimit" : 0 + }, + + { + "anchorA" : + { + "x" : -0.0009558200836181641, + "y" : -0.1818936169147491 + }, + "anchorB" : + { + "x" : -0.0009555891156196594, + "y" : 0.1055182516574860 + }, + "bodyA" : 8, + "bodyB" : 4, + "enableLimit" : true, + "enableMotor" : false, + "jointSpeed" : 0, + "lowerLimit" : -2.268928050994873, + "maxMotorTorque" : 1, + "motorSpeed" : 0, + "name" : "joint7", + "refAngle" : 0, + "type" : "revolute", + "upperLimit" : 0 + } + ], + "positionIterations" : 3, + "stepsPerSecond" : 60.0, + "subStepping" : false, + "velocityIterations" : 8, + "warmStarting" : true +}; + + + + + + + return Rube; + +}); \ No newline at end of file diff --git a/app/Game/Core/GameObjects/Items/RubeDoll.js b/app/Game/Core/GameObjects/Items/RubeDoll.js deleted file mode 100644 index 77b511d..0000000 --- a/app/Game/Core/GameObjects/Items/RubeDoll.js +++ /dev/null @@ -1,223 +0,0 @@ -define([ - "Game/" + GLOBALS.context + "/GameObjects/Item", - "Lib/Vendor/RubeLoader", - "Lib/Vendor/Box2D", - "Game/Config/Settings", - "Lib/Utilities/Assert", - "Lib/Utilities/NotificationCenter", - "Lib/Utilities/Matrix", - "json!Game/Asset/RubeDoll.json" // using requirejs json loader plugin -], - -function (Parent, RubeLoader, Box2D, Settings, Assert, nc, Matrix, RubeDollJson) { - - "use strict"; - - function RubeDoll(physicsEngine, uid, options) { - Assert.number(options.x, options.y); - - this.rubeLoader = null; - this.body = null; - this.limbs = {}; - this.joints = null; - this.limits = []; - - var chest = null; - this.rubeLoader = new RubeLoader(RubeDollJson, physicsEngine.getWorldForRubeLoader()); - - this.loadRubeDollFromScene(options); - - Parent.call(this, physicsEngine, uid, options); - physicsEngine.destroyBody(this.body); - this.body = this.limbs.chest; - delete this.limbs.chest; - - this.body.SetUserData(this); - - this.flip(options.direction || 1); - } - - RubeDoll.prototype = Object.create(Parent.prototype); - - RubeDoll.prototype.loadRubeDollFromScene = function(options) { - var scene = this.rubeLoader.getScene(); - - - - for (var i in scene.bodies) { - var body = scene.bodies[i]; - var position = body.GetPosition().Copy(); - position.Add(new Box2D.Common.Math.b2Vec2( - options.x / Settings.RATIO, - options.y / Settings.RATIO - )); - body.SetPosition(position); - this.limbs[body.name] = body; - - // code snipped possibly needed for filtering between doll and rubedoll while holding - //var filterData = new Box2D.Dynamics.b2FilterData(); - //filterData.groupIndex = -66; - //if(body.name != "head" && body.name != "chest") { - // for (var fixture = body.GetFixtureList(); fixture; fixture = fixture.GetNext()) { - // fixture.SetFilterData(filterData); - // } - //} - } - - this.joints = scene.joints; - - var count = 0; - for (var i in this.joints) { - this.limits[i] = { - lower: this.joints[i].GetLowerLimit(), - upper: this.joints[i].GetUpperLimit(), - }; -/* - this.joints[i].EnableLimit(false); - - if(count < 4 && this.joints[i] instanceof Box2D.Dynamics.Joints.b2RevoluteJoint) { - console.log(i); - } else { - body.GetWorld().DestroyJoint(this.joints[i]); - } - count++; - */ - } - }; - - RubeDoll.prototype.getFixtureDef = function() { - var fixtureDef = new Box2D.Dynamics.b2FixtureDef(); - fixtureDef.shape = new Box2D.Collision.Shapes.b2CircleShape(); - return fixtureDef; - }; - - RubeDoll.prototype.flip = function(direction) { - var oldFlipDirection = this.flipDirection; - - Parent.prototype.flip.call(this, direction); - - if(oldFlipDirection != direction) { - - for (var i in this.joints) { - var joint = this.joints[i]; - var limits = this.limits[i]; - - if (joint instanceof Box2D.Dynamics.Joints.b2RevoluteJoint) { - - if (direction > 0) { - joint.SetLimits(limits.lower, limits.upper); - continue; - } - - var a1 = limits.lower * -1; - var a2 = limits.upper * -1; - - if (a2 > a1) { - joint.SetLimits(a1, a2); - } else { - joint.SetLimits(a2, a1); - } - - // joint.SetAngle(joint.GetAngle() * -1); - } - } - } - }; - - RubeDoll.prototype.reposition = function(handPosition, direction) { - var oldPosition = this.getPosition(); - var oldAngle = this.body.GetAngle(); - var oldDirection = this.flipDirection; - - // calls flip() at the end of Parent reposition() - Parent.prototype.reposition.call(this, handPosition, direction); - - var differenceAngle = oldAngle - this.body.GetAngle(); - - //this.body.SetLinearVelocity(new Box2D.Common.Math.b2Vec2(0, 0)); - - var offset = Box2D.Common.Math.b2Math.SubtractVV(this.getPosition(), oldPosition); - var grabAngle = (this.options.grabAngle || 0.001); - - for(var key in this.limbs) { - var limb = this.limbs[key]; - - // Setting position offset first (floor to hand) - var position = limb.GetPosition().Copy(); - position.Add(offset); - limb.SetPosition(position); - - // grabing local point to "rotate" around (x, y position transform only) - var localPoint = this.body.GetLocalPoint(limb.GetPosition().Copy()); - - // create rotation matrix from chest rotation difference - var mat = Box2D.Common.Math.b2Mat22.FromAngle(differenceAngle); - - // matrix multiplication with local limb position - position = Box2D.Common.Math.b2Math.MulTMV(mat, localPoint); - - // translating back to global position - var globalPoint = this.body.GetWorldPoint(position); - limb.SetPosition(globalPoint); - - // relative limb rotating by chest rotation difference - var d = (oldDirection == direction) ? -1 : 1; - limb.SetAngle((limb.GetAngle() - differenceAngle) * d); - - //limb.SetType(Box2D.Dynamics.b2Body.b2_staticBody); - //limb.SetLinearVelocity(new Box2D.Common.Math.b2Vec2(0, 0)); - } - }; - - RubeDoll.prototype.setVelocities = function(options) { - Assert.number(options.linearVelocity.x, options.linearVelocity.y); - Assert.number(options.angularVelocity); - - this.body.SetLinearVelocity(options.linearVelocity); - this.body.SetAngularVelocity(options.angularVelocity); - for(var name in this.limbs) { - this.limbs[name].SetLinearVelocity(options.linearVelocity); - } - }; - - RubeDoll.prototype.getPosition = function() { - return this.body.GetPosition().Copy(); - }; - - RubeDoll.prototype.getHeadPosition = function() { - return this.limbs.head.GetPosition().Copy(); - }; - - RubeDoll.prototype.setUpdateData = function(update) { - - Parent.prototype.setUpdateData.call(this, update); - -/* - for(var name in update.limbs) { - Assert.number(update.limbs[name].p.x, update.limbs[name].p.y); - Assert.number(update.limbs[name].a); - Assert.number(update.limbs[name].lv.x, update.limbs[name].lv.y); - Assert.number(update.limbs[name].av); - - this.limbs[name].SetAwake(true); - this.limbs[name].SetPosition(update.limbs[name].p); - this.limbs[name].SetAngle(update.limbs[name].a); - this.limbs[name].SetLinearVelocity(update.limbs[name].lv); - this.limbs[name].SetAngularVelocity(update.limbs[name].av); - } - */ - } - - RubeDoll.prototype.destroy = function() { - - var world = this.body.GetWorld(); - - for (var name in this.limbs) { - world.DestroyBody(this.limbs[name]); - } - - Parent.prototype.destroy.call(this); - }; - - return RubeDoll; -}); \ No newline at end of file diff --git a/app/Game/Core/GameObjects/Items/Skateboard.js b/app/Game/Core/GameObjects/Items/Skateboard.js index 1e12df6..e6124c9 100755 --- a/app/Game/Core/GameObjects/Items/Skateboard.js +++ b/app/Game/Core/GameObjects/Items/Skateboard.js @@ -12,106 +12,16 @@ function (Parent, Box2D, Settings, Assert) { function Skateboard(physicsEngine, uid, options) { Parent.call(this, physicsEngine, uid, options); - } - - Skateboard.prototype = Object.create(Parent.prototype); - - Skateboard.prototype.createFixture = function () { - Assert.number(this.options.width, this.options.height); - Assert.number(this.options.weight); - - var deckShape = new Box2D.Collision.Shapes.b2PolygonShape(); - var w = this.options.width / Settings.RATIO; - var h = 2 / Settings.RATIO; - deckShape.SetAsOrientedBox(w / 2, h / 2, new Box2D.Common.Math.b2Vec2(0, -(4.5 / Settings.RATIO))); - - var fixtureDef = new Box2D.Dynamics.b2FixtureDef(); - fixtureDef.shape = deckShape; - - var offset = 4, - factor = 80; - var density = ((this.options.weight + offset) / this.options.width / this.options.height) * factor; - fixtureDef.density = density; - fixtureDef.friction = Settings.ITEM_FRICTION; - fixtureDef.restitution = 0.2; - fixtureDef.isSensor = false; - - this.body.CreateFixture(fixtureDef); - - - this.addWheel( - -8, - -2.5 - ); - - this.addWheel( - 7, - -2.5 - ); - - }; - - Skateboard.prototype.addWheel = function(x, y) { - Assert.number(x, y); - - var bodyDef = new Box2D.Dynamics.b2BodyDef(); - bodyDef.type = Box2D.Dynamics.b2Body.b2_dynamicBody; - bodyDef.position.x = x / Settings.RATIO; - bodyDef.position.y = y / Settings.RATIO; - bodyDef.angle = 0; - - var wheelShape = new Box2D.Collision.Shapes.b2CircleShape(); - wheelShape.SetRadius(2.5 / Settings.RATIO); - wheelShape.SetLocalPosition(new Box2D.Common.Math.b2Vec2(x / Settings.RATIO, y / Settings.RATIO)); - - - var fixtureDef = new Box2D.Dynamics.b2FixtureDef(); - var offset = 4, - factor = 80; - var density = ((0.1 + offset) / 3 / 3) * factor; - fixtureDef.density = density; - fixtureDef.shape = wheelShape; - fixtureDef.restitution = 0.2; - fixtureDef.isSensor = false; - fixtureDef.friction = 0.0005; - - this.body.CreateFixture(fixtureDef); - }; - - Skateboard.prototype.flip = function(direction) { - this.flipDirection = direction; - }; - - return Skateboard; - -}); - - -/* -define([ - "Game/" + GLOBALS.context + "/GameObjects/Item", - "Lib/Vendor/Box2D", - "Game/Config/Settings", - "Lib/Utilities/Assert" -], - -function (Parent, Box2D, Settings, Assert) { - - "use strict"; - - function Skateboard(physicsEngine, uid, options) { - - Parent.call(this, physicsEngine, uid, options); this.wheels = [ - this.addWheel( - options.x + 8, - options.y - 1.5 - ), - this.addWheel( - options.x - 8, - options.y - 1.5 - ) + this.addWheel( + options.x + 8, + options.y - 1.5 + ), + this.addWheel( + options.x - 8, + options.y - 1.5 + ) ]; } @@ -143,13 +53,13 @@ function (Parent, Box2D, Settings, Assert) { Skateboard.prototype.addWheel = function(x, y) { Assert.number(x, y); - var bodyDef = new Box2D.Dynamics.b2BodyDef(); + var bodyDef = new Box2D.Dynamics.b2BodyDef(); bodyDef.type = Box2D.Dynamics.b2Body.b2_dynamicBody; bodyDef.position.x = x / Settings.RATIO; bodyDef.position.y = y / Settings.RATIO; bodyDef.angle = 0; - var wheelShape = new Box2D.Collision.Shapes.b2CircleShape(); + var wheelShape = new Box2D.Collision.Shapes.b2CircleShape(); wheelShape.SetRadius(1.5 / Settings.RATIO); wheelShape.SetLocalPosition(new Box2D.Common.Math.b2Vec2(0, 0)); @@ -165,18 +75,18 @@ function (Parent, Box2D, Settings, Assert) { var wheelBody = this.body.GetWorld().CreateBody(bodyDef); wheelBody.CreateFixture(fixtureDef); - //var revoluteJointDef = new Box2D.Dynamics.Joints.b2RevoluteJointDef(); + //var revoluteJointDef = new Box2D.Dynamics.Joints.b2RevoluteJointDef(); var revoluteJointDef = new Box2D.Dynamics.Joints.b2WeldJointDef(); - //revoluteJointDef.enableMotor = false; + //revoluteJointDef.enableMotor = false; - revoluteJointDef.Initialize(this.body, wheelBody, wheelBody.GetWorldCenter()); - var j = this.body.GetWorld().CreateJoint(revoluteJointDef); + revoluteJointDef.Initialize(this.body, wheelBody, wheelBody.GetWorldCenter()); + var j = this.body.GetWorld().CreateJoint(revoluteJointDef); - // FIXME this means, that we will have bodies in the world, which must not be - // updated (wheels) because they are always connected to a body which will be updated. + // FIXME this means, that we will have bodies in the world, which must not be + // updated (wheels) because they are always connected to a body which will be updated. return wheelBody; }; @@ -206,5 +116,4 @@ function (Parent, Box2D, Settings, Assert) { return Skateboard; -}); -*/ \ No newline at end of file +}); \ No newline at end of file diff --git a/app/Game/Core/GameObjects/Tile.js b/app/Game/Core/GameObjects/Tile.js index dee3a1a..8a46fce 100755 --- a/app/Game/Core/GameObjects/Tile.js +++ b/app/Game/Core/GameObjects/Tile.js @@ -7,7 +7,7 @@ define([ "Lib/Utilities/Assert" ], -function (Parent, Box2D, Settings, Exception, nc, Assert) { +function (Parent, Box2D, Settings, Exception, Nc, Assert) { "use strict"; @@ -15,6 +15,8 @@ function (Parent, Box2D, Settings, Exception, nc, Assert) { this.options = options; Parent.call(this, physicsEngine, uid); this.createPhysicTile(this.options); + + Nc.trigger(Nc.ns.core.game.gameObject.add, "fixed", this); } Tile.prototype = Object.create(Parent.prototype); @@ -117,6 +119,10 @@ function (Parent, Box2D, Settings, Exception, nc, Assert) { Tile.prototype.addVec = function (vs, m1, m2) { return vs.push(new Box2D.Common.Math.b2Vec2(this.mkArg(m1), this.mkArg(m2))); }; + + Tile.prototype.destroy = function() { + Nc.trigger(Nc.ns.core.game.gameObject.remove, "fixed", this); + }; return Tile; diff --git a/app/Game/Core/Loader/Level.js b/app/Game/Core/Loader/Level.js index 83cabde..84b0c68 100755 --- a/app/Game/Core/Loader/Level.js +++ b/app/Game/Core/Loader/Level.js @@ -8,9 +8,9 @@ define([ "Game/" + GLOBALS.context + "/GameObjects/Item", "Game/" + GLOBALS.context + "/GameObjects/Items/Skateboard", "Game/" + GLOBALS.context + "/GameObjects/Items/RagDoll", - "Game/" + GLOBALS.context + "/GameObjects/Items/RubeDoll" + "Game/" + GLOBALS.context + "/GameObjects/Items/Rube" -], function (Settings, Box2D, nc, Abstract, CollisionDetector, Tile, Item, Skateboard, RagDoll, RubeDoll) { +], function (Settings, Box2D, Nc, Abstract, CollisionDetector, Tile, Item, Skateboard, RagDoll, Rube) { "use strict"; @@ -25,7 +25,6 @@ define([ Level.prototype.load = function (uid) { var self = this; - // FIXME: check if theres a security hazard here (user injected path) var path = Settings.MAPS_PATH + uid + ".json"; this.loadLevelDataFromPath(path, function (levelData) { self.setup(levelData); @@ -34,7 +33,7 @@ define([ Level.prototype.setup = function(levelData) { // jshint unused:false this.isLoaded = true; - nc.trigger(nc.ns.core.game.events.level.loaded); + Nc.trigger(Nc.ns.core.game.events.level.loaded); }; Level.prototype.createItems = function(options) { @@ -47,12 +46,12 @@ define([ Level.prototype.createItem = function(uid, options) { switch(options.type) { - case "skateboard": - return new Skateboard(this.engine, uid, options); + //case "skateboard": + // return new Skateboard(this.engine, uid, options); case "ragdoll": return new RagDoll(this.engine, uid, options); - case "rubedoll": - return new RubeDoll(this.engine, uid, options); + case "rube": + return new Rube(this.engine, uid, options); default: return new Item(this.engine, uid, options); } diff --git a/app/Game/Core/Loader/TiledLevel.js b/app/Game/Core/Loader/TiledLevel.js index 16834b0..761c7d4 100755 --- a/app/Game/Core/Loader/TiledLevel.js +++ b/app/Game/Core/Loader/TiledLevel.js @@ -3,7 +3,7 @@ define([ "Game/Config/Settings", "Game/Config/ItemSettings", "Lib/Vendor/Box2D", - "Lib/Utilities/OptionsHelper", + "Lib/Utilities/Options", "Lib/Utilities/Exception", "Lib/Utilities/NotificationCenter", "Lib/Utilities/Assert", @@ -13,7 +13,7 @@ define([ "Game/" + GLOBALS.context + "/GameObjects/Item", "Game/" + GLOBALS.context + "/GameObjects/Items/Skateboard", -], function (Parent, Settings, ItemSettings, Box2D, optionsHelper, Exception, nc, Assert, AbstractLayer, CollisionDetector, Tile, Item, Skateboard) { +], function (Parent, Settings, ItemSettings, Box2D, Options, Exception, Nc, Assert, AbstractLayer, CollisionDetector, Tile, Item, Skateboard) { "use strict"; @@ -187,7 +187,7 @@ define([ throw new Exception("Item name (" + name + ") cannot be found in item list"); } - return optionsHelper.merge(ItemSettings[name], ItemSettings.Default); + return Options.merge(ItemSettings[name], ItemSettings.Default); }; TiledLevel.prototype.getTileImagePath = function(gid) { diff --git a/app/Game/Core/Physics/Engine.js b/app/Game/Core/Physics/Engine.js index 4ec27b2..c47efc3 100755 --- a/app/Game/Core/Physics/Engine.js +++ b/app/Game/Core/Physics/Engine.js @@ -5,7 +5,7 @@ define([ "Lib/Utilities/NotificationCenter" ], -function (Settings, Box2D, CollisionDetector, nc) { +function (Settings, Box2D, CollisionDetector, Nc) { "use strict"; @@ -15,30 +15,33 @@ function (Settings, Box2D, CollisionDetector, nc) { Settings.BOX2D_ALLOW_SLEEP ); this.world.SetWarmStarting(true); + this.ground = null; this.lastStep = Date.now(); this.worldQueue = []; this.ncTokens = [ - nc.on(nc.ns.channel.engine.worldQueue.add, this.addToWorldQueue, this) + Nc.on(Nc.ns.channel.engine.worldQueue.add, this.addToWorldQueue, this) ]; } + Engine.prototype.getWorld = function () { + return this.world; + } + + Engine.prototype.getGround = function () { + return this.ground; + } + Engine.prototype.setCollisionDetector = function () { var detector = new CollisionDetector(); this.world.SetContactListener(detector.getListener()); } - Engine.prototype.getWorldForRubeLoader = function() { - return this.world; - }; - Engine.prototype.createBody = function (bodyDef) { - return this.world.CreateBody(bodyDef); - } - - Engine.prototype.destroyBody = function (body) { - return this.world.DestroyBody(body); + var body = this.world.CreateBody(bodyDef); + if(!this.ground) this.ground = body; + return body; } Engine.prototype.addToWorldQueue = function(callback) { @@ -62,8 +65,8 @@ function (Settings, Box2D, CollisionDetector, nc) { } Engine.prototype.destroy = function() { - nc.offAll(this.ncTokens); delete this.world; + Nc.offAll(this.ncTokens); }; diff --git a/app/Game/Core/Player.js b/app/Game/Core/Player.js index 996facb..e9a818a 100755 --- a/app/Game/Core/Player.js +++ b/app/Game/Core/Player.js @@ -1,19 +1,17 @@ define([ "Game/" + GLOBALS.context + "/GameObjects/Doll", - "Game/" + GLOBALS.context + "/Control/PlayerController", "Game/Config/Settings", "Lib/Utilities/NotificationCenter", "Lib/Utilities/Exception", - "Lib/Utilities/ColorConverter", "Game/" + GLOBALS.context + "/GameObjects/SpectatorDoll", - "Game/" + GLOBALS.context + "/GameObjects/Items/RubeDoll" + "Game/" + GLOBALS.context + "/GameObjects/Items/RagDoll" ], -function (Doll, PlayerController, Settings, nc, Exception, ColorConverter, SpectatorDoll, RubeDoll) { +function (Doll, Settings, Nc, Exception, SpectatorDoll, RagDoll) { "use strict"; - function Player (id, physicsEngine, user, revealedGameController) { + function Player (id, physicsEngine, user) { this.stats = { health: 100, deaths: 0, @@ -22,20 +20,15 @@ function (Doll, PlayerController, Settings, nc, Exception, ColorConverter, Spect this.user = user; this.physicsEngine = physicsEngine; - this.playerController = null; // pre-initialise with null, because client/players don't get one + this.playerController = null; this.doll; this.id = id; this.spawned = false; this.holdingItem = null; - this.inBetweenRounds = true; this.spectatorDoll = new SpectatorDoll(this.physicsEngine, "spectatorDoll-" + this.id, this); - this.revealedGameController = revealedGameController; - this.modifierActivated = false; - } - Player.prototype.getNickname = function() { - return this.user.options.nickname; - }; + Nc.trigger(Nc.ns.core.game.gameObject.add, 'animated', this); + } Player.prototype.getActiveDoll = function() { if(this.spawned) { @@ -67,7 +60,7 @@ function (Doll, PlayerController, Settings, nc, Exception, ColorConverter, Spect Player.prototype.move = function (direction) { if(!this.spawned) return false; - this.doll.move(direction, this.modifierActivated); + this.doll.move(direction); } Player.prototype.stop = function () { @@ -91,16 +84,6 @@ function (Doll, PlayerController, Settings, nc, Exception, ColorConverter, Spect this.doll.lookAt(x, y); } - Player.prototype.activateModifier = function () { - if(!this.spawned) return false; - this.modifierActivated = true; - } - - Player.prototype.deactivateModifier = function () { - if(!this.spawned) return false; - this.modifierActivated = false; - } - Player.prototype.grab = function(item) { if(!this.spawned) return false; this.doll.grab(item); @@ -129,10 +112,6 @@ function (Doll, PlayerController, Settings, nc, Exception, ColorConverter, Spect } // prepare for creating the ragdoll - - var converter = new ColorConverter(); - var primaryColor = converter.getColorByName(this.getNickname()); - var options = { x: this.getPosition().x * Settings.RATIO, y: this.getPosition().y * Settings.RATIO, @@ -141,23 +120,21 @@ function (Doll, PlayerController, Settings, nc, Exception, ColorConverter, Spect image: "chest.png", name: "RagDoll", rotation: 0, - type: "rubedoll", + type: "ragdoll", weight: 3, width: 5, - height: 12, - primaryColor: primaryColor, - direction: this.doll.lookDirection + height: 12 }; - var rubeDoll = new RubeDoll(this.physicsEngine, "rubeDoll-" + this.id + "-" + ragDollId, options); - rubeDoll.setVelocities(this.doll.getVelocities()); + var ragDoll = new RagDoll(this.physicsEngine, "ragDoll-" + this.id + "-" + ragDollId, options); + ragDoll.setVelocities(this.doll.getVelocities()); this.spawned = false; this.doll.destroy(); this.doll = null; - this.ragDoll = rubeDoll; + this.ragDoll = ragDoll; }; Player.prototype.update = function () { @@ -173,7 +150,7 @@ function (Doll, PlayerController, Settings, nc, Exception, ColorConverter, Spect Player.prototype.destroy = function () { - // FIXME add destroy nc hook + Nc.trigger(Nc.ns.core.game.gameObject.remove, 'animated', this); if(this.holdingItem) { var options = { @@ -186,10 +163,8 @@ function (Doll, PlayerController, Settings, nc, Exception, ColorConverter, Spect this.spectatorDoll.destroy(); - // doll destoys itself at the end cause its a gameobject - // but on userLeft, the player has to destroy it. if(this.doll) { - this.doll.destroy(); + this.doll.destroy(); } if(this.playerController) { @@ -197,13 +172,9 @@ function (Doll, PlayerController, Settings, nc, Exception, ColorConverter, Spect } } - Player.prototype.setInBetweenRounds = function(inBetweenRounds) { - this.inBetweenRounds = inBetweenRounds; - }; - - Player.prototype.isInBetweenRounds = function() { - return this.inBetweenRounds; - }; + Player.prototype.setPlayerController = function(playerController) { + this.playerController = playerController; + } return Player; }); diff --git a/app/Lib/Utilities/Matrix.js b/app/Lib/Utilities/Matrix.js deleted file mode 100644 index c912d41..0000000 --- a/app/Lib/Utilities/Matrix.js +++ /dev/null @@ -1,334 +0,0 @@ -define([ -], - -/* - Stolen from Pixi V2 -*/ - -function () { - - "use strict"; - - /** - * The Point object represents a location in a two-dimensional coordinate system, where x represents the horizontal axis and y represents the vertical axis. - * - * @class Point - * @constructor - * @param x {Number} position of the point on the x axis - * @param y {Number} position of the point on the y axis - */ - var Point = function(x, y) - { - /** - * @property x - * @type Number - * @default 0 - */ - this.x = x || 0; - - /** - * @property y - * @type Number - * @default 0 - */ - this.y = y || 0; - }; - - /** - * Creates a clone of this point - * - * @method clone - * @return {Point} a copy of the point - */ - Point.prototype.clone = function() - { - return new Point(this.x, this.y); - }; - - /** - * Sets the point to a new x and y position. - * If y is omitted, both x and y will be set to x. - * - * @method set - * @param [x=0] {Number} position of the point on the x axis - * @param [y=0] {Number} position of the point on the y axis - */ - Point.prototype.set = function(x, y) - { - this.x = x || 0; - this.y = y || ( (y !== 0) ? this.x : 0 ) ; - }; - - // constructor - Point.prototype.constructor = Point; - - /** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - - /** - * The Matrix class is now an object, which makes it a lot faster, - * here is a representation of it : - * | a | b | tx| - * | c | d | ty| - * | 0 | 0 | 1 | - * - * @class Matrix - * @constructor - */ - var Matrix = function() - { - /** - * @property a - * @type Number - * @default 1 - */ - this.a = 1; - - /** - * @property b - * @type Number - * @default 0 - */ - this.b = 0; - - /** - * @property c - * @type Number - * @default 0 - */ - this.c = 0; - - /** - * @property d - * @type Number - * @default 1 - */ - this.d = 1; - - /** - * @property tx - * @type Number - * @default 0 - */ - this.tx = 0; - - /** - * @property ty - * @type Number - * @default 0 - */ - this.ty = 0; - }; - - /** - * Creates a Matrix object based on the given array. The Element to Matrix mapping order is as follows: - * - * a = array[0] - * b = array[1] - * c = array[3] - * d = array[4] - * tx = array[2] - * ty = array[5] - * - * @method fromArray - * @param array {Array} The array that the matrix will be populated from. - */ - Matrix.prototype.fromArray = function(array) - { - this.a = array[0]; - this.b = array[1]; - this.c = array[3]; - this.d = array[4]; - this.tx = array[2]; - this.ty = array[5]; - }; - - /** - * Creates an array from the current Matrix object. - * - * @method toArray - * @param transpose {Boolean} Whether we need to transpose the matrix or not - * @return {Array} the newly created array which contains the matrix - */ - Matrix.prototype.toArray = function(transpose) - { - if(!this.array) this.array = new Float32Array(9); - var array = this.array; - - if(transpose) - { - array[0] = this.a; - array[1] = this.b; - array[2] = 0; - array[3] = this.c; - array[4] = this.d; - array[5] = 0; - array[6] = this.tx; - array[7] = this.ty; - array[8] = 1; - } - else - { - array[0] = this.a; - array[1] = this.c; - array[2] = this.tx; - array[3] = this.b; - array[4] = this.d; - array[5] = this.ty; - array[6] = 0; - array[7] = 0; - array[8] = 1; - } - - return array; - }; - - /** - * Get a new position with the current transformation applied. - * Can be used to go from a child's coordinate space to the world coordinate space. (e.g. rendering) - * - * @method apply - * @param pos {Point} The origin - * @param [newPos] {Point} The point that the new position is assigned to (allowed to be same as input) - * @return {Point} The new point, transformed through this matrix - */ - Matrix.prototype.apply = function(pos, newPos) - { - newPos = newPos || new Point(); - - newPos.x = this.a * pos.x + this.c * pos.y + this.tx; - newPos.y = this.b * pos.x + this.d * pos.y + this.ty; - - return newPos; - }; - - /** - * Get a new position with the inverse of the current transformation applied. - * Can be used to go from the world coordinate space to a child's coordinate space. (e.g. input) - * - * @method applyInverse - * @param pos {Point} The origin - * @param [newPos] {Point} The point that the new position is assigned to (allowed to be same as input) - * @return {Point} The new point, inverse-transformed through this matrix - */ - Matrix.prototype.applyInverse = function(pos, newPos) - { - newPos = newPos || new Point(); - - var id = 1 / (this.a * this.d + this.c * -this.b); - - newPos.x = this.d * id * pos.x + -this.c * id * pos.y + (this.ty * this.c - this.tx * this.d) * id; - newPos.y = this.a * id * pos.y + -this.b * id * pos.x + (-this.ty * this.a + this.tx * this.b) * id; - - return newPos; - }; - - /** - * Translates the matrix on the x and y. - * - * @method translate - * @param {Number} x - * @param {Number} y - * @return {Matrix} This matrix. Good for chaining method calls. - **/ - Matrix.prototype.translate = function(x, y) - { - this.tx += x; - this.ty += y; - - return this; - }; - - /** - * Applies a scale transformation to the matrix. - * - * @method scale - * @param {Number} x The amount to scale horizontally - * @param {Number} y The amount to scale vertically - * @return {Matrix} This matrix. Good for chaining method calls. - **/ - Matrix.prototype.scale = function(x, y) - { - this.a *= x; - this.d *= y; - this.c *= x; - this.b *= y; - this.tx *= x; - this.ty *= y; - - return this; - }; - - - /** - * Applies a rotation transformation to the matrix. - * @method rotate - * @param {Number} angle The angle in radians. - * @return {Matrix} This matrix. Good for chaining method calls. - **/ - Matrix.prototype.rotate = function(angle) - { - var cos = Math.cos( angle ); - var sin = Math.sin( angle ); - - var a1 = this.a; - var c1 = this.c; - var tx1 = this.tx; - - this.a = a1 * cos-this.b * sin; - this.b = a1 * sin+this.b * cos; - this.c = c1 * cos-this.d * sin; - this.d = c1 * sin+this.d * cos; - this.tx = tx1 * cos - this.ty * sin; - this.ty = tx1 * sin + this.ty * cos; - - return this; - }; - - /** - * Appends the given Matrix to this Matrix. - * - * @method append - * @param {Matrix} matrix - * @return {Matrix} This matrix. Good for chaining method calls. - */ - Matrix.prototype.append = function(matrix) - { - var a1 = this.a; - var b1 = this.b; - var c1 = this.c; - var d1 = this.d; - - this.a = matrix.a * a1 + matrix.b * c1; - this.b = matrix.a * b1 + matrix.b * d1; - this.c = matrix.c * a1 + matrix.d * c1; - this.d = matrix.c * b1 + matrix.d * d1; - - this.tx = matrix.tx * a1 + matrix.ty * c1 + this.tx; - this.ty = matrix.tx * b1 + matrix.ty * d1 + this.ty; - - return this; - }; - - /** - * Resets this Matix to an identity (default) matrix. - * - * @method identity - * @return {Matrix} This matrix. Good for chaining method calls. - */ - Matrix.prototype.identity = function() - { - this.a = 1; - this.b = 0; - this.c = 0; - this.d = 1; - this.tx = 0; - this.ty = 0; - - return this; - }; - - return Matrix; - -}); \ No newline at end of file diff --git a/app/Lib/Utilities/NotificationCenter.js b/app/Lib/Utilities/NotificationCenter.js index 36ac8d0..33f8eb7 100755 --- a/app/Lib/Utilities/NotificationCenter.js +++ b/app/Lib/Utilities/NotificationCenter.js @@ -7,7 +7,7 @@ function (Exception) { "use strict"; function populate(obj, path) { - path = path || "nc.ns"; + path = path || "Nc.ns"; for(var key in obj) { if(!obj.hasOwnProperty(key)) continue; if(obj[key] === null) { @@ -23,6 +23,7 @@ function (Exception) { this.topics = {}; this.subUid = -1; + var i = 0; this.ns = { client: { pointerLock: { @@ -40,9 +41,7 @@ function (Exception) { remove: null, update: null, addFilter: null, - removeFilter: null, - swapMeshIndexes: null, - swapMeshes: null + removeFilter: null }, animatedMesh: { create: null @@ -84,10 +83,6 @@ function (Exception) { } }, game: { - events: { - render: null, - destroy: null - }, gameStats: { toggle: null }, @@ -105,9 +100,9 @@ function (Exception) { }, core: { game: { - worldUpdateObjects: { + gameObject: { add: null, - remove: null, + remove: null }, events: { level: { @@ -137,10 +132,8 @@ function (Exception) { }, game: { player: { - killed: null, - clearFingerPrints: null - }, - + killed: null + } } }, engine: { @@ -194,20 +187,17 @@ function (Exception) { }; populate(this.ns); + } NotificationCenter.prototype.validate = function(topic) { - if (topic === undefined) { - throw new Exception("Topic not registered in nc. See stack trace."); - } - if (typeof topic === 'object') { throw new Exception("Topic bad format " + JSON.stringify(topic)); } - if (topic.indexOf("nc.ns") !== 0) { - throw new Exception("Topic bad format, does not begin with nc.ns. : " + topic); + if (topic.indexOf("Nc.ns") !== 0) { + throw new Exception("Topic bad format, does not begin with Nc.ns. : " + topic); } }; @@ -249,24 +239,18 @@ function (Exception) { NotificationCenter.prototype.off = function (token) { - if(token && token.constructor === Array) { - this.offAll(token); - return; - } - for(var m in this.topics) { if (this.topics[m]) { for(var i = 0, j = this.topics[m].length; i < j; i++) { if (this.topics[m][i].token === token) { this.topics[m].splice(i, 1); - return; + return token; } } } } } - // should be treated as a private function - use nc.off(Array); NotificationCenter.prototype.offAll = function (tokens) { for (var i = 0; i < tokens.length; i++) { this.off(tokens[i]); diff --git a/app/Lib/Utilities/OptionsHelper.js b/app/Lib/Utilities/Options.js similarity index 67% rename from app/Lib/Utilities/OptionsHelper.js rename to app/Lib/Utilities/Options.js index 918c8d5..1616f77 100644 --- a/app/Lib/Utilities/OptionsHelper.js +++ b/app/Lib/Utilities/Options.js @@ -6,19 +6,18 @@ function (Exception) { "use strict"; - function OptionsHelper() { + function Options() { } - // FIXME we could actually use Object.assign() for merging here - OptionsHelper.prototype.merge = function(options, preset) { + Options.prototype.merge = function(options, preset) { if(!preset && !options) { - throw new Exception("OptionsHelper requires objects"); + throw new Exception("Options requires objects"); } if(preset.constructor !== Object && options.constructor !== Object) { - throw new Exception("OptionsHelper requires objects"); + throw new Exception("Options requires objects"); } if(!preset || preset.constructor !== Object) { @@ -44,7 +43,7 @@ function (Exception) { if(options[key].constructor !== Object) { preset[key] = options[key]; } else { - preset[key] = OptionsHelper.prototype.merge.call(this, options[key], preset[key]); + preset[key] = Options.prototype.merge.call(this, options[key], preset[key]); } } } @@ -52,6 +51,6 @@ function (Exception) { return preset; } - return new OptionsHelper(); - -}); + return new Options(); + +}); \ No newline at end of file diff --git a/app/Lib/Vendor/Box2D.js b/app/Lib/Vendor/Box2D.js index 760681d..0e1e7c5 100755 --- a/app/Lib/Vendor/Box2D.js +++ b/app/Lib/Vendor/Box2D.js @@ -6006,10 +6006,6 @@ Box2D.postDefs = []; xf = b.m_xf; for (f = b.GetFixtureList(); f; f = f.m_next) { - // Disable drawing sensors by removing false || - if (false || f.IsSensor()) { - continue; - } s = f.GetShape(); if (b.IsActive() == false) { color.Set(0.5, 0.5, 0.3); diff --git a/app/Lib/Vendor/RequireJs/Plugin/Json.js b/app/Lib/Vendor/RequireJs/Plugin/Json.js deleted file mode 100644 index f62f568..0000000 --- a/app/Lib/Vendor/RequireJs/Plugin/Json.js +++ /dev/null @@ -1,72 +0,0 @@ -/** @license - * RequireJS plugin for loading JSON files - * - depends on Text plugin and it was HEAVILY "inspired" by it as well. - * Author: Miller Medeiros - * Version: 0.4.0 (2014/04/10) - * Released under the MIT license - */ -define(['text'], function(text){ - - var CACHE_BUST_QUERY_PARAM = 'bust', - CACHE_BUST_FLAG = '!bust', - jsonParse = (typeof JSON !== 'undefined' && typeof JSON.parse === 'function')? JSON.parse : function(val){ - return eval('('+ val +')'); //quick and dirty - }, - buildMap = {}; - - function cacheBust(url){ - url = url.replace(CACHE_BUST_FLAG, ''); - url += (url.indexOf('?') < 0)? '?' : '&'; - return url + CACHE_BUST_QUERY_PARAM +'='+ Math.round(2147483647 * Math.random()); - } - - //API - return { - - load : function(name, req, onLoad, config) { - if (( config.isBuild && (config.inlineJSON === false || name.indexOf(CACHE_BUST_QUERY_PARAM +'=') !== -1)) || (req.toUrl(name).indexOf('empty:') === 0)) { - //avoid inlining cache busted JSON or if inlineJSON:false - //and don't inline files marked as empty! - onLoad(null); - } else { - text.get(req.toUrl(name), function(data){ - var parsed; - if (config.isBuild) { - buildMap[name] = data; - onLoad(data); - } else { - try { - parsed = jsonParse(data); - } catch (e) { - onLoad.error(e); - } - onLoad(parsed); - } - }, - onLoad.error, { - accept: 'application/json' - } - ); - } - }, - - normalize : function (name, normalize) { - // used normalize to avoid caching references to a "cache busted" request - if (name.indexOf(CACHE_BUST_FLAG) !== -1) { - name = cacheBust(name); - } - // resolve any relative paths - return normalize(name); - }, - - //write method based on RequireJS official text plugin by James Burke - //https://github.com/jrburke/requirejs/blob/master/text.js - write : function(pluginName, moduleName, write){ - if(moduleName in buildMap){ - var content = buildMap[moduleName]; - write('define("'+ pluginName +'!'+ moduleName +'", function(){ return '+ content +';});\n'); - } - } - - }; -}); \ No newline at end of file diff --git a/app/Lib/Vendor/RequireJs/Plugin/Text.js b/app/Lib/Vendor/RequireJs/Plugin/Text.js deleted file mode 100644 index 148c553..0000000 --- a/app/Lib/Vendor/RequireJs/Plugin/Text.js +++ /dev/null @@ -1,391 +0,0 @@ -/** - * @license RequireJS text 2.0.14 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved. - * Available via the MIT or new BSD license. - * see: http://github.com/requirejs/text for details - */ -/*jslint regexp: true */ -/*global require, XMLHttpRequest, ActiveXObject, - define, window, process, Packages, - java, location, Components, FileUtils */ - -define(['module'], function (module) { - 'use strict'; - - var text, fs, Cc, Ci, xpcIsWindows, - progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'], - xmlRegExp = /^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, - bodyRegExp = /]*>\s*([\s\S]+)\s*<\/body>/im, - hasLocation = typeof location !== 'undefined' && location.href, - defaultProtocol = hasLocation && location.protocol && location.protocol.replace(/\:/, ''), - defaultHostName = hasLocation && location.hostname, - defaultPort = hasLocation && (location.port || undefined), - buildMap = {}, - masterConfig = (module.config && module.config()) || {}; - - text = { - version: '2.0.14', - - strip: function (content) { - //Strips declarations so that external SVG and XML - //documents can be added to a document without worry. Also, if the string - //is an HTML document, only the part inside the body tag is returned. - if (content) { - content = content.replace(xmlRegExp, ""); - var matches = content.match(bodyRegExp); - if (matches) { - content = matches[1]; - } - } else { - content = ""; - } - return content; - }, - - jsEscape: function (content) { - return content.replace(/(['\\])/g, '\\$1') - .replace(/[\f]/g, "\\f") - .replace(/[\b]/g, "\\b") - .replace(/[\n]/g, "\\n") - .replace(/[\t]/g, "\\t") - .replace(/[\r]/g, "\\r") - .replace(/[\u2028]/g, "\\u2028") - .replace(/[\u2029]/g, "\\u2029"); - }, - - createXhr: masterConfig.createXhr || function () { - //Would love to dump the ActiveX crap in here. Need IE 6 to die first. - var xhr, i, progId; - if (typeof XMLHttpRequest !== "undefined") { - return new XMLHttpRequest(); - } else if (typeof ActiveXObject !== "undefined") { - for (i = 0; i < 3; i += 1) { - progId = progIds[i]; - try { - xhr = new ActiveXObject(progId); - } catch (e) {} - - if (xhr) { - progIds = [progId]; // so faster next time - break; - } - } - } - - return xhr; - }, - - /** - * Parses a resource name into its component parts. Resource names - * look like: module/name.ext!strip, where the !strip part is - * optional. - * @param {String} name the resource name - * @returns {Object} with properties "moduleName", "ext" and "strip" - * where strip is a boolean. - */ - parseName: function (name) { - var modName, ext, temp, - strip = false, - index = name.lastIndexOf("."), - isRelative = name.indexOf('./') === 0 || - name.indexOf('../') === 0; - - if (index !== -1 && (!isRelative || index > 1)) { - modName = name.substring(0, index); - ext = name.substring(index + 1); - } else { - modName = name; - } - - temp = ext || modName; - index = temp.indexOf("!"); - if (index !== -1) { - //Pull off the strip arg. - strip = temp.substring(index + 1) === "strip"; - temp = temp.substring(0, index); - if (ext) { - ext = temp; - } else { - modName = temp; - } - } - - return { - moduleName: modName, - ext: ext, - strip: strip - }; - }, - - xdRegExp: /^((\w+)\:)?\/\/([^\/\\]+)/, - - /** - * Is an URL on another domain. Only works for browser use, returns - * false in non-browser environments. Only used to know if an - * optimized .js version of a text resource should be loaded - * instead. - * @param {String} url - * @returns Boolean - */ - useXhr: function (url, protocol, hostname, port) { - var uProtocol, uHostName, uPort, - match = text.xdRegExp.exec(url); - if (!match) { - return true; - } - uProtocol = match[2]; - uHostName = match[3]; - - uHostName = uHostName.split(':'); - uPort = uHostName[1]; - uHostName = uHostName[0]; - - return (!uProtocol || uProtocol === protocol) && - (!uHostName || uHostName.toLowerCase() === hostname.toLowerCase()) && - ((!uPort && !uHostName) || uPort === port); - }, - - finishLoad: function (name, strip, content, onLoad) { - content = strip ? text.strip(content) : content; - if (masterConfig.isBuild) { - buildMap[name] = content; - } - onLoad(content); - }, - - load: function (name, req, onLoad, config) { - //Name has format: some.module.filext!strip - //The strip part is optional. - //if strip is present, then that means only get the string contents - //inside a body tag in an HTML string. For XML/SVG content it means - //removing the declarations so the content can be inserted - //into the current doc without problems. - - // Do not bother with the work if a build and text will - // not be inlined. - if (config && config.isBuild && !config.inlineText) { - onLoad(); - return; - } - - masterConfig.isBuild = config && config.isBuild; - - var parsed = text.parseName(name), - nonStripName = parsed.moduleName + - (parsed.ext ? '.' + parsed.ext : ''), - url = req.toUrl(nonStripName), - useXhr = (masterConfig.useXhr) || - text.useXhr; - - // Do not load if it is an empty: url - if (url.indexOf('empty:') === 0) { - onLoad(); - return; - } - - //Load the text. Use XHR if possible and in a browser. - if (!hasLocation || useXhr(url, defaultProtocol, defaultHostName, defaultPort)) { - text.get(url, function (content) { - text.finishLoad(name, parsed.strip, content, onLoad); - }, function (err) { - if (onLoad.error) { - onLoad.error(err); - } - }); - } else { - //Need to fetch the resource across domains. Assume - //the resource has been optimized into a JS module. Fetch - //by the module name + extension, but do not include the - //!strip part to avoid file system issues. - req([nonStripName], function (content) { - text.finishLoad(parsed.moduleName + '.' + parsed.ext, - parsed.strip, content, onLoad); - }); - } - }, - - write: function (pluginName, moduleName, write, config) { - if (buildMap.hasOwnProperty(moduleName)) { - var content = text.jsEscape(buildMap[moduleName]); - write.asModule(pluginName + "!" + moduleName, - "define(function () { return '" + - content + - "';});\n"); - } - }, - - writeFile: function (pluginName, moduleName, req, write, config) { - var parsed = text.parseName(moduleName), - extPart = parsed.ext ? '.' + parsed.ext : '', - nonStripName = parsed.moduleName + extPart, - //Use a '.js' file name so that it indicates it is a - //script that can be loaded across domains. - fileName = req.toUrl(parsed.moduleName + extPart) + '.js'; - - //Leverage own load() method to load plugin value, but only - //write out values that do not have the strip argument, - //to avoid any potential issues with ! in file names. - text.load(nonStripName, req, function (value) { - //Use own write() method to construct full module value. - //But need to create shell that translates writeFile's - //write() to the right interface. - var textWrite = function (contents) { - return write(fileName, contents); - }; - textWrite.asModule = function (moduleName, contents) { - return write.asModule(moduleName, fileName, contents); - }; - - text.write(pluginName, nonStripName, textWrite, config); - }, config); - } - }; - - if (masterConfig.env === 'node' || (!masterConfig.env && - typeof process !== "undefined" && - process.versions && - !!process.versions.node && - !process.versions['node-webkit'] && - !process.versions['atom-shell'])) { - //Using special require.nodeRequire, something added by r.js. - fs = require.nodeRequire('fs'); - - text.get = function (url, callback, errback) { - try { - var file = fs.readFileSync(url, 'utf8'); - //Remove BOM (Byte Mark Order) from utf8 files if it is there. - if (file[0] === '\uFEFF') { - file = file.substring(1); - } - callback(file); - } catch (e) { - if (errback) { - errback(e); - } - } - }; - } else if (masterConfig.env === 'xhr' || (!masterConfig.env && - text.createXhr())) { - text.get = function (url, callback, errback, headers) { - var xhr = text.createXhr(), header; - xhr.open('GET', url, true); - - //Allow plugins direct access to xhr headers - if (headers) { - for (header in headers) { - if (headers.hasOwnProperty(header)) { - xhr.setRequestHeader(header.toLowerCase(), headers[header]); - } - } - } - - //Allow overrides specified in config - if (masterConfig.onXhr) { - masterConfig.onXhr(xhr, url); - } - - xhr.onreadystatechange = function (evt) { - var status, err; - //Do not explicitly handle errors, those should be - //visible via console output in the browser. - if (xhr.readyState === 4) { - status = xhr.status || 0; - if (status > 399 && status < 600) { - //An http 4xx or 5xx error. Signal an error. - err = new Error(url + ' HTTP status: ' + status); - err.xhr = xhr; - if (errback) { - errback(err); - } - } else { - callback(xhr.responseText); - } - - if (masterConfig.onXhrComplete) { - masterConfig.onXhrComplete(xhr, url); - } - } - }; - xhr.send(null); - }; - } else if (masterConfig.env === 'rhino' || (!masterConfig.env && - typeof Packages !== 'undefined' && typeof java !== 'undefined')) { - //Why Java, why is this so awkward? - text.get = function (url, callback) { - var stringBuffer, line, - encoding = "utf-8", - file = new java.io.File(url), - lineSeparator = java.lang.System.getProperty("line.separator"), - input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), encoding)), - content = ''; - try { - stringBuffer = new java.lang.StringBuffer(); - line = input.readLine(); - - // Byte Order Mark (BOM) - The Unicode Standard, version 3.0, page 324 - // http://www.unicode.org/faq/utf_bom.html - - // Note that when we use utf-8, the BOM should appear as "EF BB BF", but it doesn't due to this bug in the JDK: - // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058 - if (line && line.length() && line.charAt(0) === 0xfeff) { - // Eat the BOM, since we've already found the encoding on this file, - // and we plan to concatenating this buffer with others; the BOM should - // only appear at the top of a file. - line = line.substring(1); - } - - if (line !== null) { - stringBuffer.append(line); - } - - while ((line = input.readLine()) !== null) { - stringBuffer.append(lineSeparator); - stringBuffer.append(line); - } - //Make sure we return a JavaScript string and not a Java string. - content = String(stringBuffer.toString()); //String - } finally { - input.close(); - } - callback(content); - }; - } else if (masterConfig.env === 'xpconnect' || (!masterConfig.env && - typeof Components !== 'undefined' && Components.classes && - Components.interfaces)) { - //Avert your gaze! - Cc = Components.classes; - Ci = Components.interfaces; - Components.utils['import']('resource://gre/modules/FileUtils.jsm'); - xpcIsWindows = ('@mozilla.org/windows-registry-key;1' in Cc); - - text.get = function (url, callback) { - var inStream, convertStream, fileObj, - readData = {}; - - if (xpcIsWindows) { - url = url.replace(/\//g, '\\'); - } - - fileObj = new FileUtils.File(url); - - //XPCOM, you so crazy - try { - inStream = Cc['@mozilla.org/network/file-input-stream;1'] - .createInstance(Ci.nsIFileInputStream); - inStream.init(fileObj, 1, 0, false); - - convertStream = Cc['@mozilla.org/intl/converter-input-stream;1'] - .createInstance(Ci.nsIConverterInputStream); - convertStream.init(inStream, "utf-8", inStream.available(), - Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER); - - convertStream.readString(inStream.available(), readData); - convertStream.close(); - inStream.close(); - callback(readData.value); - } catch (e) { - throw new Error((fileObj && fileObj.path || '') + ': ' + e); - } - }; - } - return text; -}); \ No newline at end of file diff --git a/app/Lib/Vendor/RubeLoader.js b/app/Lib/Vendor/RubeLoader.js index b1f3b83..49674c3 100644 --- a/app/Lib/Vendor/RubeLoader.js +++ b/app/Lib/Vendor/RubeLoader.js @@ -152,7 +152,8 @@ function (Box2D) { if ( bodyJson.hasOwnProperty('linearVelocity') && bodyJson.linearVelocity instanceof Object ) bd.linearVelocity.SetV( bodyJson.linearVelocity ); if ( bodyJson.hasOwnProperty('position') && bodyJson.position instanceof Object ) - bd.position.SetV( this.getVectorValue(bodyJson.position) ); + bodyJson.position.y *= -1; + bd.position.SetV( bodyJson.position ); if ( bodyJson.hasOwnProperty('awake') ) bd.awake = bodyJson.awake; else @@ -168,7 +169,6 @@ function (Box2D) { body.name = bodyJson.name; if ( bodyJson.hasOwnProperty('customProperties') ) body.customProperties = bodyJson.customProperties; - return body; } @@ -231,7 +231,8 @@ function (Box2D) { RubeLoader.prototype.getVectorValue = function (val) { if ( val instanceof Object ) { - return { x: val.x, y: val.y * -1 }; + val.y *= -1; + return val; } else { return { x:0, y:0 }; } @@ -426,7 +427,7 @@ function (Box2D) { var scene = { bodies: loadedBodies, - joints: loadedJoints + // joints: loadedJoints }; return scene; diff --git a/app/Lib/Vendor/SocketIO.js b/app/Lib/Vendor/SocketIO.js index e7e0089..cae33de 100755 --- a/app/Lib/Vendor/SocketIO.js +++ b/app/Lib/Vendor/SocketIO.js @@ -1,3 +1,3 @@ -define(["socketio"], function(io) { +define(["socketio"], function() { return io; -}); +}); \ No newline at end of file diff --git a/app/Menu/Menu.js b/app/Menu/Menu.js index 62ae3cc..5948d7f 100644 --- a/app/Menu/Menu.js +++ b/app/Menu/Menu.js @@ -1,12 +1,11 @@ define([ - "Game/Config/Settings", "Lib/Utilities/ColorConverter", "Lib/Utilities/Exception", "Game/Client/PointerLockManager", "Lib/Utilities/QuerySelector" ], -function (Settings, ColorConverter, Exception, pointerLockManager, qs) { +function (ColorConverter, Exception, PointerLockManager, Qs) { "use strict"; @@ -23,30 +22,28 @@ function (Settings, ColorConverter, Exception, pointerLockManager, qs) { if(localStorage["player"]) { var player = JSON.parse(localStorage["player"]); if(player.nickname) { - qs.$("#nick").value = player.nickname; + Qs.$("#nick").value = player.nickname; } } if(localStorage["customname"]) { - qs.$("#customname").value = localStorage["customname"]; + Qs.$("#customname").value = localStorage["customname"]; } - qs.$("#scoreLimit").value = Settings.CHANNEL_DEFAULT_SCORE_LIMIT; - qs.$("#userLimit").value = Settings.CHANNEL_DEFAULT_MAX_USERS; - qs.$("#refresh").onclick = refresh; + Qs.$("#refresh").onclick = refresh; refresh(); populateMaps(); this.channelDestructionTimeout = null; this.refreshInterval = setInterval(refresh, 5000); - qs.$("#createbutton").onclick = function() { + Qs.$("#createbutton").onclick = function() { show('#createform'); return false; }; - qs.$("#quickstartbutton").onclick = quickstart; + Qs.$("#quickstartbutton").onclick = quickstart; - var cancelButtons = qs.$$(".cancel"); + var cancelButtons = Qs.$$(".cancel"); for (var i = 0; i < cancelButtons.length; i++) { cancelButtons[i].onclick = function() { show('#listform'); @@ -55,13 +52,13 @@ function (Settings, ColorConverter, Exception, pointerLockManager, qs) { }; this.colorConverter = new ColorConverter(); - var c = qs.$("#nick"); + var c = Qs.$("#nick"); c.onchange = c.onkeyup = c.onblur = c.onclick = this.updatePrimaryColor.bind(this); this.updatePrimaryColor({target:c}); }; Menu.prototype.updatePrimaryColor = function(e) { - qs.$("#primarycolor").style.backgroundColor = "#" + this.colorConverter.getColorByName(e.target.value).toString(16); + Qs.$("#primarycolor").style.backgroundColor = "#" + this.colorConverter.getColorByName(e.target.value).toString(16); }; Menu.prototype.onRun = function(channelName, nickname) { @@ -70,7 +67,7 @@ function (Settings, ColorConverter, Exception, pointerLockManager, qs) { window.onhashchange = function() { if(window.location.hash) { - if(qs.$("#game").style.display == "block") { + if(Qs.$("#game").style.display == "block") { window.location.reload(); } refresh(function(list) { @@ -128,7 +125,7 @@ function (Settings, ColorConverter, Exception, pointerLockManager, qs) { errorCallback(xhr.status, xhr.responseText); } else { console.error("Ajax error: " + xhr.status + " " + xhr.responseText) - qs.$("#list").innerHTML = ""; + Qs.$("#list").innerHTML = ""; document.body.className = "offline"; } } @@ -166,7 +163,7 @@ function (Settings, ColorConverter, Exception, pointerLockManager, qs) { html += "No channels found."; } - qs.$("#list").innerHTML = html; + Qs.$("#list").innerHTML = html; } function populateMaps() { @@ -181,15 +178,15 @@ function (Settings, ColorConverter, Exception, pointerLockManager, qs) { html += ""; }; - qs.$("#maps").innerHTML = html; + Qs.$("#maps").innerHTML = html; }, function(status, responseText) { console.error("getMaps error:", status, responseText); }); } - qs.$("form#listform").onsubmit = function(e) { + Qs.$("form#listform").onsubmit = function(e) { try { - var nickname = qs.$("#nick").value; + var nickname = Qs.$("#nick").value; var channelName = getSelectedChannel(); join(nickname, channelName); } catch(e) { @@ -199,14 +196,14 @@ function (Settings, ColorConverter, Exception, pointerLockManager, qs) { return false; } - qs.$("form#createform").onsubmit = function(e) { + Qs.$("form#createform").onsubmit = function(e) { try { var options = { - channelName: qs.$("#customname").value, + channelName: Qs.$("#customname").value, levelUids: getSelectedMaps(), - maxUsers: parseInt(qs.$("#userLimit").value, 10), - scoreLimit: parseInt(qs.$("#scoreLimit").value, 10) + maxUsers: parseInt(Qs.$("#userLimit").value, 10), + scoreLimit: parseInt(Qs.$("#scoreLimit").value, 10) }; create(options, onCreateSuccess); @@ -217,10 +214,10 @@ function (Settings, ColorConverter, Exception, pointerLockManager, qs) { return false; } - qs.$("form#customjoinform").onsubmit = function(e) { + Qs.$("form#customjoinform").onsubmit = function(e) { try { - var nickname = qs.$("#nick").value; - var channelName = qs.$("#customname").value; + var nickname = Qs.$("#nick").value; + var channelName = Qs.$("#customname").value; join(nickname, channelName); } catch(e) { console.error(e); @@ -235,29 +232,29 @@ function (Settings, ColorConverter, Exception, pointerLockManager, qs) { } function showCustomJoinForm() { - qs.$("#customname").value = unescape(window.location.hash.substr(1)); - qs.$("#link").value = window.location.href; + Qs.$("#customname").value = unescape(window.location.hash.substr(1)); + Qs.$("#link").value = window.location.href; show("#customjoinform"); } function show(id) { - qs.$("#createform").style.display = "none"; - qs.$("#listform").style.display = "none"; - qs.$("#customjoinform").style.display = "none"; - qs.$("#game").style.display = "none"; + Qs.$("#createform").style.display = "none"; + Qs.$("#listform").style.display = "none"; + Qs.$("#customjoinform").style.display = "none"; + Qs.$("#game").style.display = "none"; if(id != "#customjoinform") { history.pushState("", document.title, window.location.pathname); } - qs.$(id).style.display = "block"; + Qs.$(id).style.display = "block"; } function quickstart() { refresh(function(list){ var defaultChannelName = quickstartChannelName; history.pushState("", document.title, window.location.pathname + "#" + defaultChannelName); - var nickname = qs.$("#nick").value; + var nickname = Qs.$("#nick").value; if(!nickname) { nickname = "Guest" + (Math.floor(Math.random() * 899) + 100) @@ -268,8 +265,8 @@ function (Settings, ColorConverter, Exception, pointerLockManager, qs) { var options = { channelName: defaultChannelName, levelUids: getSelectedMaps(), - maxUsers: parseInt(qs.$("#userLimit").value, 10), - scoreLimit: parseInt(qs.$("#scoreLimit").value, 10) + maxUsers: parseInt(Qs.$("#userLimit").value, 10), + scoreLimit: parseInt(Qs.$("#scoreLimit").value, 10) }; create(options, function() { @@ -292,7 +289,7 @@ function (Settings, ColorConverter, Exception, pointerLockManager, qs) { alert("Your channel has timed out."); window.location.href = "/"; } else { - qs.$("#timeout").innerHTML = " within " + formatDate(diff) + " minutes"; + Qs.$("#timeout").innerHTML = " within " + formatDate(diff) + " minutes"; } }, 1000); } @@ -392,8 +389,8 @@ function (Settings, ColorConverter, Exception, pointerLockManager, qs) { }); //window.location.href = "/game.html"; - qs.$("#menu").style.display = "none"; - qs.$("#game").style.display = "block"; + Qs.$("#menu").style.display = "none"; + Qs.$("#game").style.display = "block"; instance.onRun(channelName, nickname); // Dumm und dümmer if(instance.refreshInterval) { @@ -404,7 +401,7 @@ function (Settings, ColorConverter, Exception, pointerLockManager, qs) { clearInterval(instance.channelDestructionTimeout); } - pointerLockManager.request(); + PointerLockManager.request(); } } @@ -426,8 +423,8 @@ function (Settings, ColorConverter, Exception, pointerLockManager, qs) { } } - qs.$("#canvas").onclick = function(){ - pointerLockManager.request(); + Qs.$("#canvas").onclick = function(){ + PointerLockManager.request(); }; return Menu; diff --git a/app/Server/Api.js b/app/Server/Api.js index f237c26..47b4a63 100644 --- a/app/Server/Api.js +++ b/app/Server/Api.js @@ -2,12 +2,12 @@ define([ "Lib/Utilities/NotificationCenter", "Lib/Utilities/Protocol/Helper", "Lib/Utilities/Validate", - "Lib/Utilities/OptionsHelper", + "Lib/Utilities/Options", "Game/Config/Settings", "fs" ], -function (nc, ProtocolHelper, validate, optionsHelper, Settings, FileSystem) { +function (Nc, ProtocolHelper, validate, Options, Settings, FileSystem) { "use strict"; @@ -121,7 +121,7 @@ function (nc, ProtocolHelper, validate, optionsHelper, Settings, FileSystem) { scoreLimit: Settings.CHANNEL_DEFAULT_SCORE_LIMIT }; - options = optionsHelper.merge(options, defaultOptions); + options = Options.merge(options, defaultOptions); var result = this.coordinator.createChannel(options); if(result !== false) { diff --git a/app/Server/Coordinator.js b/app/Server/Coordinator.js index 20d8c93..2e2060d 100644 --- a/app/Server/Coordinator.js +++ b/app/Server/Coordinator.js @@ -5,14 +5,14 @@ define([ "Game/Config/Settings" ], -function (User, PipeToChannel, nc, Settings) { +function (User, PipeToChannel, Nc, Settings) { "use strict"; function Coordinator() { this.channelPipes = {}; - nc.on(nc.ns.server.events.controlCommand.coordinator, this.onMessage, this); + Nc.on(Nc.ns.server.events.controlCommand.coordinator, this.onMessage, this); console.checkpoint('create Coordinator'); } diff --git a/app/Server/PipeToChannel.js b/app/Server/PipeToChannel.js index 19bee94..bf2adcd 100755 --- a/app/Server/PipeToChannel.js +++ b/app/Server/PipeToChannel.js @@ -3,7 +3,7 @@ define([ "child_process" ], -function (nc, childProcess) { +function (Nc, childProcess) { "use strict"; @@ -57,10 +57,10 @@ function (nc, childProcess) { PipeToChannel.prototype.onMessage = function (message) { switch(message.recipient) { case 'coordinator': - nc.trigger(nc.ns.server.events.controlCommand.coordinator, message.data); + Nc.trigger(Nc.ns.server.events.controlCommand.coordinator, message.data); break; default: - nc.trigger(nc.ns.server.events.controlCommand.user + message.recipient, message.data); + Nc.trigger(Nc.ns.server.events.controlCommand.user + message.recipient, message.data); break; } diff --git a/app/Server/User.js b/app/Server/User.js index 1ba04bc..a9d63a2 100644 --- a/app/Server/User.js +++ b/app/Server/User.js @@ -4,7 +4,7 @@ define([ "Lib/Utilities/NotificationCenter" ], -function (Parent, ProtocolHelper, nc) { +function (Parent, ProtocolHelper, Nc) { "use strict"; @@ -19,7 +19,7 @@ function (Parent, ProtocolHelper, nc) { socketLink.on('message', this.onMessage.bind(this)); socketLink.on('disconnect', this.onDisconnect.bind(this)); - nc.on(nc.ns.server.events.controlCommand.user + this.id, this.socketLink.send, this.socketLink); + Nc.on(Nc.ns.server.events.controlCommand.user + this.id, this.socketLink.send, this.socketLink); } User.prototype = Object.create(Parent.prototype); @@ -97,7 +97,7 @@ function (Parent, ProtocolHelper, nc) { User.prototype.onPing = function(timestamp) { var message = ProtocolHelper.encodeCommand("pong", timestamp); - nc.trigger(nc.ns.server.events.controlCommand.user + this.id, message); + Nc.trigger(Nc.ns.server.events.controlCommand.user + this.id, message); }; return User; diff --git a/channel.js b/channel.js index a94689f..27305e9 100755 --- a/channel.js +++ b/channel.js @@ -4,11 +4,7 @@ var requirejs = require('requirejs'); requirejs.config({ nodeRequire: require, baseUrl: 'app', - deps: ['Lib/Utilities/Channel/Extensions'], - paths: { - text: 'Lib/Vendor/RequireJs/Plugin/Text', - json: 'Lib/Vendor/RequireJs/Plugin/Json', - }, + deps: ['Lib/Utilities/Channel/Extensions'] }); var inspector = {}; diff --git a/client.js b/client.js index f96233a..c94262d 100755 --- a/client.js +++ b/client.js @@ -7,8 +7,6 @@ requirejs.config({ deps: ['Lib/Utilities/Client/Extensions'], waitSeconds: 0, paths: { - text: 'Lib/Vendor/RequireJs/Plugin/Text', - json: 'Lib/Vendor/RequireJs/Plugin/Json', screenfull: "/screenfull", chart: "/chart", socketio: "/socket.io/socket.io" @@ -27,19 +25,25 @@ requirejs([ "Menu/Menu" ], -function (Networker, io, Settings, Exception, nc, Menu) { +function (Networker, SocketIO, Settings, Exception, Nc, Menu) { var menu = new Menu(); menu.onRun = function(channelName, nickname) { var options = { - transports: ["websocket"] // v4: only use websocket, flashsocket is gone + "reconnect": false, + "reconnection delay": 500, + "max reconnection attempts": 10, + "transports": [ + "websocket", + "flashsocket" + ] }; - var socket = io("/", options); + var socket = SocketIO.connect("/", options); var networker = new Networker(socket, channelName, nickname); Chuck.inspector.networker = networker; Chuck.inspector.settings = Settings; - Chuck.inspector.nc = nc; + Chuck.inspector.nc = Nc; Chuck.inspector.resetLevel = function() { networker.sendGameCommand("resetLevel"); } } menu.init(); -}); +}); \ No newline at end of file diff --git a/config/build-profile.js b/config/build-profile.js index e650ccc..ed028e7 100644 --- a/config/build-profile.js +++ b/config/build-profile.js @@ -1,8 +1,6 @@ ({ baseUrl: "../app", paths: { - "text": 'Lib/Vendor/RequireJs/Plugin/Text', - "json": 'Lib/Vendor/RequireJs/Plugin/Json', "screenfull": "../node_modules/screenfull/dist/screenfull", "socketio": "../node_modules/socket.io/node_modules/socket.io-client/dist/socket.io", "chart": "../node_modules/chart.js/Chart" diff --git a/lab/Worker.js b/lab/Worker.js index 04585b1..62483bb 100755 --- a/lab/Worker.js +++ b/lab/Worker.js @@ -6,7 +6,7 @@ define([ "Lib/Utilities/NotificationCenter" ], -function (Parent, ProtocolHelper, GameController, User) { +function (Parent, ProtocolHelper, GameController, User, Nc) { function Worker () { //this.socketLink = socketLink; @@ -40,7 +40,7 @@ function (Parent, ProtocolHelper, GameController, User) { } }, this); - nc.on(nc.ns.client.to.server.gameCommand.send, this.sendGameCommand, this); + Nc.on(Nc.ns.client.to.server.gameCommand.send, this.sendGameCommand, this); } Worker.prototype.sendCommand = function (command, options) { diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 3f2a506..0000000 --- a/package-lock.json +++ /dev/null @@ -1,2352 +0,0 @@ -{ - "name": "chuck.js", - "version": "0.1.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "chuck.js", - "version": "0.1.0", - "dependencies": { - "chart.js": "^4.4.0", - "express": "^4.18.2", - "requirejs": "^2.3.6", - "screenfull": "^6.0.2", - "socket.io": "^4.7.4" - }, - "devDependencies": { - "nodemon": "^3.0.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==" - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" - }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "24.0.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.14.tgz", - "integrity": "sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw==", - "dependencies": { - "undici-types": "~7.8.0" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chart.js": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz", - "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/engine.io": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", - "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", - "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/engine.io/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/nodemon": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", - "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/nodemon/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/requirejs": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.7.tgz", - "integrity": "sha512-DouTG8T1WanGok6Qjg2SXuCMzszOo0eHeH9hDZ5Y4x8Je+9JB38HdTLT4/VA8OaUhBa0JPVHJ0pyBkM1z+pDsw==", - "bin": { - "r_js": "bin/r.js", - "r.js": "bin/r.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/screenfull": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-6.0.2.tgz", - "integrity": "sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==", - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/socket.io": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", - "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", - "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" - } - }, - "node_modules/socket.io-adapter/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-adapter/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-parser/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/socket.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "dev": true, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - } - }, - "dependencies": { - "@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==" - }, - "@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" - }, - "@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "requires": { - "@types/node": "*" - } - }, - "@types/node": { - "version": "24.0.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.14.tgz", - "integrity": "sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw==", - "requires": { - "undici-types": "~7.8.0" - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" - }, - "binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true - }, - "body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - } - }, - "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - } - }, - "call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - } - }, - "chart.js": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz", - "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==", - "requires": { - "@kurkle/color": "^0.3.0" - } - }, - "chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "requires": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" - }, - "engine.io": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", - "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", - "requires": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" - }, - "dependencies": { - "cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==" - }, - "debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "requires": { - "ms": "^2.1.3" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==" - }, - "es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "requires": { - "es-errors": "^1.3.0" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - } - }, - "get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "requires": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "nodemon": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", - "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", - "dev": true, - "requires": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "dependencies": { - "debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "requires": { - "side-channel": "^1.0.6" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "requirejs": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.7.tgz", - "integrity": "sha512-DouTG8T1WanGok6Qjg2SXuCMzszOo0eHeH9hDZ5Y4x8Je+9JB38HdTLT4/VA8OaUhBa0JPVHJ0pyBkM1z+pDsw==" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "screenfull": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-6.0.2.tgz", - "integrity": "sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==" - }, - "semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true - }, - "send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "requires": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - } - }, - "side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - } - }, - "side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - } - }, - "side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - } - }, - "simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "socket.io": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", - "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", - "requires": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "dependencies": { - "debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "requires": { - "ms": "^2.1.3" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", - "requires": { - "debug": "~4.3.4", - "ws": "~8.17.1" - }, - "dependencies": { - "debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "requires": { - "ms": "^2.1.3" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "dependencies": { - "debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "requires": { - "ms": "^2.1.3" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "requires": {} - } - } -} diff --git a/package.json b/package.json index 6fbcbb3..4c5ecd2 100755 --- a/package.json +++ b/package.json @@ -1,9 +1,7 @@ { "name": "chuck.js", "author": "logsol ", - "contributors": [ - "Jeena Paradies (https://jeena.net)" - ], + "contributors": ["Jeena Paradies (https://jeena.net)"], "description": "Multiplayer browser jump and run game", "version": "0.1.0", "homepage": "http://chuck-game.tumblr.com/", @@ -15,28 +13,21 @@ "url": "https://github.com/logsol/chuck.js/issues", "email": "fartman@gmx.de" }, - "main": "server.js", + "main": "", "dependencies": { - "socket.io": "^4.7.4", - "express": "^4.18.2", - "requirejs": "^2.3.6", - "screenfull": "^6.0.2", - "chart.js": "^4.4.0" - }, - "devDependencies": { - "nodemon": "^3.0.2" + "socket.io": "= 0.9.6", + "node-static": ">= 0.6.0", + "requirejs": "= 2.0.4", + "node-fork": ">= 0.4.2", + "screenfull": ">= 1.0.4", + "chart.js": ">= 1.0.1" }, + "devDependencies": {}, "optionalDependencies": {}, - "engines": { - "node": ">=16.0.0" - }, - "config": { - "port": "1234" - }, + "engine": "node >= 0.8.4", + "config": { "port": "1234" }, "private": true, "scripts": { - "start": "node server.js", - "dev": "nodemon server.js", "prestart": "scripts/build.sh" } } diff --git a/recordings/Quickstart-2015-03-15T19:00:28.545Z-debug_residence_stones.rec b/recordings/Quickstart-2015-03-15T19:00:28.545Z-debug_residence_stones.rec new file mode 100644 index 0000000..be27a2c --- /dev/null +++ b/recordings/Quickstart-2015-03-15T19:00:28.545Z-debug_residence_stones.rec @@ -0,0 +1,98 @@ +m1426446028547{"recipient":"channel","data":{"addUser":{"id":"7389285181034131943","nickname":"Bot1"}}} +m1426446029119{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"clientReady\\\":null}\"}"} +w1426446029547{"doll-7389285181034131943":{"p":{"x":26.757009396292265,"y":2.8537988666369247},"a":0,"lv":{"x":0,"y":3.686287386450715e-18},"av":0,"as":"stand","laxy":{"x":0,"y":0}},"item-6":{"p":{"x":17.676190476190477,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":20.68034223796989,"y":14.27172409912905},"a":0.05645956288623199,"lv":{"x":-0.3822032971313994,"y":0.10581586623357915},"av":-0.9131901027366345},"item-4":{"p":{"x":20.210667860242594,"y":14.23713937029844},"a":0.2172662762511257,"lv":{"x":-0.4539838684349691,"y":0.056447865910879066},"av":-0.8171646189887583},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":9.013612698412686,"y":18.087738095238098},"a":0,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.14632479802086,"y":14.27055244283271},"a":-0.030402669209750526,"lv":{"x":0.36764627338079947,"y":0.11541986576858798},"av":0.6858739292935763}} +w1426446030548{"doll-7389285181034131943":{"p":{"x":26.757009396292265,"y":2.8537988666369247},"a":0,"lv":{"x":0,"y":0},"av":0,"as":"stand","laxy":{"x":0,"y":0}},"item-6":{"p":{"x":17.676190476190477,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":20.676956793943322,"y":14.27693273489722},"a":-0.006893630787064592,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200040618322713,"y":14.276203443653712},"a":-0.0004911852214511643,"lv":{"x":-0.0017410956075321858,"y":8.552005003579723e-7},"av":3.946495907847236e-17},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":9.013612698412686,"y":18.087738095238098},"a":0,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +m1426446031024{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"lookAt\\\":{\\\"x\\\":-0.1,\\\"y\\\":0}}\"}"} +m1426446031024{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"moveLeft\\\":null}\"}"} +w1426446031550{"doll-7389285181034131943":{"p":{"x":23.369073130763105,"y":5.155903892632974},"a":0,"lv":{"x":-6.2,"y":10.122520758193609},"av":0,"as":"run","laxy":{"x":-0.1,"y":0}},"item-6":{"p":{"x":17.676190476190477,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":20.676956793943322,"y":14.27693273489722},"a":-0.006893630787064592,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":9.013612698412686,"y":18.087738095238098},"a":0,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +m1426446031695{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"mePositionStateUpdate\\\":{\\\"p\\\":{\\\"x\\\":22.546741092148903,\\\"y\\\":6.945440200409302},\\\"lv\\\":{\\\"x\\\":-6.2,\\\"y\\\":13.302715397413536}}}\"}"} +m1426446031704{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"mePositionStateUpdate\\\":{\\\"p\\\":{\\\"x\\\":22.484989092148904,\\\"y\\\":7.080524845767541},\\\"lv\\\":{\\\"x\\\":-6.2,\\\"y\\\":13.508464535823881}}}\"}"} +m1426446031782{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"stop\\\":null}\"}"} +m1426446031912{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"mePositionStateUpdate\\\":{\\\"p\\\":{\\\"x\\\":21.73476374575245,\\\"y\\\":10.32390717922336},\\\"lv\\\":{\\\"x\\\":-2.3463161980324543,\\\"y\\\":17.55729589350694}}}\"}"} +m1426446032042{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"mePositionStateUpdate\\\":{\\\"p\\\":{\\\"x\\\":21.44100843193758,\\\"y\\\":12.7671303982799},\\\"lv\\\":{\\\"x\\\":-2.227842551800874,\\\"y\\\":19.92590130886559}}}\"}"} +m1426446032126{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"mePositionStateUpdate\\\":{\\\"p\\\":{\\\"x\\\":21.2807959597357,\\\"y\\\":14.271291852124465},\\\"lv\\\":{\\\"x\\\":0,\\\"y\\\":-2.133620078919897}}}\"}"} +m1426446032164{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"handActionRequest\\\":{\\\"x\\\":-0.1,\\\"y\\\":0,\\\"av\\\":0}}\"}"} +w1426446032551{"doll-7389285181034131943":{"p":{"x":21.2807959597357,"y":14.2827540733478},"a":0,"lv":{"x":0,"y":2.0808241610672144e-17},"av":0,"as":"stand","laxy":{"x":-0.1,"y":0}},"item-6":{"p":{"x":17.676190476190477,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":20.92365310259284,"y":13.401801692395418},"a":-0.3,"lv":{"x":1.1578834351175484e-60,"y":1.9012546152460842e-16},"av":6.564623608182231e-48},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":9.013612698412686,"y":18.087738095238098},"a":0,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +m1426446032607{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"jump\\\":null}\"}"} +m1426446032783{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"lookAt\\\":{\\\"x\\\":-0.1,\\\"y\\\":0}}\"}"} +m1426446032783{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"moveLeft\\\":null}\"}"} +m1426446033408{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"handActionRequest\\\":{\\\"x\\\":-2,\\\"y\\\":1.1616379503624417,\\\"av\\\":-0.33531939942689776}}\"}"} +w1426446033552{"doll-7389285181034131943":{"p":{"x":16.557991085576948,"y":12.476641521631196},"a":0,"lv":{"x":-6.2,"y":9.458269369609303},"av":0,"as":"jump","laxy":{"x":-0.1,"y":0}},"item-6":{"p":{"x":17.676190476190477,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":12.048335711507379,"y":9.27107894546859},"a":-0.15313010305101882,"lv":{"x":-34.2,"y":-6.332771923395663},"av":1.0059581982806933},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":9.013612698412686,"y":18.087738095238098},"a":0,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +m1426446033620{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"jumpStop\\\":null}\"}"} +m1426446033708{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"stop\\\":null}\"}"} +m1426446033764{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"mePositionStateUpdate\\\":{\\\"p\\\":{\\\"x\\\":15.545509158762231,\\\"y\\\":14.939529946319917},\\\"lv\\\":{\\\"x\\\":-2.411280442117325,\\\"y\\\":13.851923076171733}}}\"}"} +m1426446033823{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"mePositionStateUpdate\\\":{\\\"p\\\":{\\\"x\\\":15.407720608611541,\\\"y\\\":15.786375605059586},\\\"lv\\\":{\\\"x\\\":-2.355804291795286,\\\"y\\\":15.018971297630832}}}\"}"} +m1426446033890{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"mePositionStateUpdate\\\":{\\\"p\\\":{\\\"x\\\":15.252508070805703,\\\"y\\\":16.84788590944936},\\\"lv\\\":{\\\"x\\\":-2.2933002802534532,\\\"y\\\":16.333499883787308}}}\"}"} +m1426446033906{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"mePositionStateUpdate\\\":{\\\"p\\\":{\\\"x\\\":15.216050100270346,\\\"y\\\":17.114162758801857},\\\"lv\\\":{\\\"x\\\":-2.278623158459831,\\\"y\\\":16.642303084531072}}}\"}"} +m1426446034032{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"lookAt\\\":{\\\"x\\\":-0.1,\\\"y\\\":0}}\"}"} +m1426446034032{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"moveLeft\\\":null}\"}"} +w1426446034554{"doll-7389285181034131943":{"p":{"x":11.194618169931237,"y":18.075345972889064},"a":0,"lv":{"x":-8,"y":-0.3919449863882458},"av":0,"as":"run","laxy":{"x":-0.1,"y":0}},"item-6":{"p":{"x":17.676190476190477,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.5543134118221587,"y":18.08462667589248},"a":25.09946829820324,"lv":{"x":-0.19007540236753293,"y":-0.061006264861284215},"av":-0.46231125937975326},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":9.013612698412686,"y":18.087738095238098},"a":0,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +m1426446034796{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"handActionRequest\\\":{\\\"x\\\":-0.1,\\\"y\\\":0,\\\"av\\\":0}}\"}"} +m1426446034797{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"stop\\\":null}\"}"} +m1426446035284{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"lookAt\\\":{\\\"x\\\":0.1,\\\"y\\\":0}}\"}"} +m1426446035284{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"moveRight\\\":null}\"}"} +m1426446035395{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"jump\\\":null}\"}"} +w1426446035556{"doll-7389285181034131943":{"p":{"x":10.491286858763196,"y":16.009696234603773},"a":0,"lv":{"x":6.2,"y":-10.887028542012015},"av":0,"as":"jump","laxy":{"x":0.1,"y":0}},"item-6":{"p":{"x":17.676190476190477,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":10.824620192096528,"y":15.128743853651395},"a":0.5,"lv":{"x":6.1577922291668665,"y":-10.887028542012015},"av":-1.4981364335015035e-95},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +m1426446035619{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"jumpStop\\\":null}\"}"} +m1426446035622{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"handActionRequest\\\":{\\\"x\\\":2,\\\"y\\\":1.0402407501042503,\\\"av\\\":0.4762204811665006}}\"}"} +m1426446035669{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"stop\\\":null}\"}"} +m1426446036222{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"lookAt\\\":{\\\"x\\\":0.1,\\\"y\\\":0}}\"}"} +m1426446036222{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"moveRight\\\":null}\"}"} +w1426446036557{"doll-7389285181034131943":{"p":{"x":14.892865112434567,"y":18.093198012571065},"a":0,"lv":{"x":8,"y":1.1357017756785659e-17},"av":0,"as":"run","laxy":{"x":0.1,"y":0}},"item-6":{"p":{"x":17.676190476190477,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.67263575288429,"y":9.396029900844805},"a":1.5453100773100037,"lv":{"x":1.2141986028185257,"y":1.5118096406061725},"av":7.842891058848907},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +m1426446036597{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"jump\\\":null}\"}"} +m1426446037146{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"jumpStop\\\":null}\"}"} +m1426446037146{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"stop\\\":null}\"}"} +m1426446037233{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"lookAt\\\":{\\\"x\\\":-0.1,\\\"y\\\":0}}\"}"} +m1426446037233{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"moveLeft\\\":null}\"}"} +w1426446037559{"doll-7389285181034131943":{"p":{"x":16.315888057006195,"y":18.09351694650934},"a":0,"lv":{"x":-8,"y":0},"av":0,"as":"run","laxy":{"x":-0.1,"y":0}},"item-6":{"p":{"x":17.676190476190477,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +m1426446037870{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"jump\\\":null}\"}"} +m1426446037907{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"stop\\\":null}\"}"} +m1426446037932{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"lookAt\\\":{\\\"x\\\":0.1,\\\"y\\\":0}}\"}"} +m1426446037933{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"moveRight\\\":null}\"}"} +m1426446038419{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"jumpStop\\\":null}\"}"} +m1426446038432{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"stop\\\":null}\"}"} +m1426446038538{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"handActionRequest\\\":{\\\"x\\\":0.1,\\\"y\\\":0,\\\"av\\\":0}}\"}"} +w1426446038561{"doll-7389285181034131943":{"p":{"x":17.1826631025223,"y":14.213702272433377},"a":0,"lv":{"x":2.316415665762817,"y":3.1852767893487735},"av":0,"as":"stand","laxy":{"x":0.1,"y":0}},"item-6":{"p":{"x":17.49218691204611,"y":13.332749891480995},"a":0.3,"lv":{"x":2.316415665762817,"y":3.1852767893487735},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +m1426446038958{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"lookAt\\\":{\\\"x\\\":-0.1,\\\"y\\\":0}}\"}"} +m1426446038958{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"moveLeft\\\":null}\"}"} +m1426446038996{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"jump\\\":null}\"}"} +m1426446039345{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"stop\\\":null}\"}"} +m1426446039357{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"jumpStop\\\":null}\"}"} +w1426446039562{"doll-7389285181034131943":{"p":{"x":14.373155722224688,"y":10.923172851093172},"a":0,"lv":{"x":-2.3491405651705346,"y":3.215539708036451},"av":0,"as":"jump","laxy":{"x":-0.1,"y":0}},"item-6":{"p":{"x":14.063631912700878,"y":10.04222047014079},"a":-0.3,"lv":{"x":-2.3491405651705346,"y":3.215539708036451},"av":1.4981364335015035e-95},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +m1426446039848{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"jump\\\":null}\"}"} +m1426446039870{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"lookAt\\\":{\\\"x\\\":-0.1,\\\"y\\\":0}}\"}"} +m1426446039870{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"moveLeft\\\":null}\"}"} +m1426446039961{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"mePositionStateUpdate\\\":{\\\"p\\\":{\\\"x\\\":13.763554582654288,\\\"y\\\":9.91021111614182},\\\"lv\\\":{\\\"x\\\":-6.2,\\\"y\\\":-12.214568104301154}}}\"}"} +m1426446040457{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"jumpStop\\\":null}\"}"} +m1426446040491{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"stop\\\":null}\"}"} +w1426446040564{"doll-7389285181034131943":{"p":{"x":9.827992197957391,"y":7.616287969672424},"a":0,"lv":{"x":-0.0000010315612595218654,"y":-0.3467108761433166},"av":0,"as":"stand","laxy":{"x":-0.1,"y":0}},"item-6":{"p":{"x":9.51846838843358,"y":6.735335588720043},"a":-0.3,"lv":{"x":-0.0000010315612595218745,"y":-0.3467108761433166},"av":-3.237869826367756e-34},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +m1426446040814{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"handActionRequest\\\":{\\\"x\\\":null,\\\"y\\\":null,\\\"av\\\":0}}\"}"} +m1426446041546{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"lookAt\\\":{\\\"x\\\":-0.1,\\\"y\\\":0}}\"}"} +m1426446041546{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"moveLeft\\\":null}\"}"} +w1426446041565{"doll-7389285181034131943":{"p":{"x":9.695420727381228,"y":7.6162879696953505},"a":0,"lv":{"x":-8,"y":0},"av":0,"as":"run","laxy":{"x":-0.1,"y":0}},"item-6":{"p":{"x":9.401617976491387,"y":7.516140983169705},"a":-1.564982640581702,"lv":{"x":0.0015602824631008733,"y":-0.0055646575139384315},"av":0.0151800309605853},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +m1426446041708{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"stop\\\":null}\"}"} +m1426446042118{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"handActionRequest\\\":{\\\"x\\\":-0.1,\\\"y\\\":0,\\\"av\\\":0}}\"}"} +m1426446042420{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"lookAt\\\":{\\\"x\\\":-0.1,\\\"y\\\":0}}\"}"} +m1426446042420{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"moveLeft\\\":null}\"}"} +w1426446042568{"doll-7389285181034131943":{"p":{"x":7.146502745202811,"y":7.6190476190527345},"a":0,"lv":{"x":-8,"y":1.8167431059639174e-9},"av":0,"as":"run","laxy":{"x":-0.1,"y":0}},"item-6":{"p":{"x":6.836978935679003,"y":6.738095238100354},"a":-0.3,"lv":{"x":-7.710315253398224,"y":1.816743105963944e-9},"av":-1.2647929009154966e-36},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +m1426446042873{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"stop\\\":null}\"}"} +m1426446042996{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"lookAt\\\":{\\\"x\\\":0.1,\\\"y\\\":0}}\"}"} +m1426446042996{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"moveRight\\\":null}\"}"} +m1426446043102{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"handActionRequest\\\":{\\\"x\\\":2,\\\"y\\\":0.24735158698021256,\\\"av\\\":-0.506800103937166}}\"}"} +m1426446043149{"recipient":"7389285181034131943","data":"{\"gameCommand\":\"{\\\"stop\\\":null}\"}"} +w1426446043570{"doll-7389285181034131943":{"p":{"x":6.717469927715379,"y":18.026718836374023},"a":0,"lv":{"x":0,"y":-1.5933058441069676},"av":0,"as":"stand","laxy":{"x":0.1,"y":0}},"item-6":{"p":{"x":15.346920374111809,"y":8.242346533188677},"a":13.745544723304238,"lv":{"x":8.865053038008881,"y":-6.948476024418163},"av":40.16880149763361},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +w1426446044571{"doll-7389285181034131943":{"p":{"x":6.717469927715379,"y":18.094932218730197},"a":0,"lv":{"x":0,"y":0},"av":0,"as":"stand","laxy":{"x":0.1,"y":0}},"item-6":{"p":{"x":24.736836349036146,"y":14.105602828936636},"a":53.954515022435494,"lv":{"x":8.865053038008881,"y":19.077523975581837},"av":40.16880149763361},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +w1426446045571{"doll-7389285181034131943":{"p":{"x":6.717469927715379,"y":18.094932218730197},"a":0,"lv":{"x":0,"y":0},"av":0,"as":"stand","laxy":{"x":0.1,"y":0}},"item-6":{"p":{"x":25.484252760088392,"y":17.1308518892069},"a":56.5833675581005,"lv":{"x":0.04489757650580847,"y":-0.010299028060006578},"av":0.12321006381376746},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +w1426446046572{"doll-7389285181034131943":{"p":{"x":6.717469927715379,"y":18.094932218730197},"a":0,"lv":{"x":0,"y":0},"av":0,"as":"stand","laxy":{"x":0.1,"y":0}},"item-6":{"p":{"x":25.484809555865787,"y":17.13345683956885},"a":56.55108306250028,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +w1426446047573{"doll-7389285181034131943":{"p":{"x":6.717469927715379,"y":18.094932218730197},"a":0,"lv":{"x":0,"y":0},"av":0,"as":"stand","laxy":{"x":0.1,"y":0}},"item-6":{"p":{"x":25.484809555865787,"y":17.13345683956885},"a":56.55108306250028,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +w1426446048574{"doll-7389285181034131943":{"p":{"x":6.717469927715379,"y":18.094932218730197},"a":0,"lv":{"x":0,"y":0},"av":0,"as":"stand","laxy":{"x":0.1,"y":0}},"item-6":{"p":{"x":25.484809555865787,"y":17.13345683956885},"a":56.55108306250028,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +w1426446049575{"doll-7389285181034131943":{"p":{"x":6.717469927715379,"y":18.094932218730197},"a":0,"lv":{"x":0,"y":0},"av":0,"as":"stand","laxy":{"x":0.1,"y":0}},"item-6":{"p":{"x":25.484809555865787,"y":17.13345683956885},"a":56.55108306250028,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +w1426446050576{"doll-7389285181034131943":{"p":{"x":6.717469927715379,"y":18.094932218730197},"a":0,"lv":{"x":0,"y":0},"av":0,"as":"stand","laxy":{"x":0.1,"y":0}},"item-6":{"p":{"x":25.484809555865787,"y":17.13345683956885},"a":56.55108306250028,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +m1426446051478{"recipient":"channel","data":{"releaseUser":"7389285181034131943"}} +w1426446051575{"item-6":{"p":{"x":25.484809555865787,"y":17.13345683956885},"a":56.55108306250028,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +w1426446052576{"item-6":{"p":{"x":25.484809555865787,"y":17.13345683956885},"a":56.55108306250028,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +w1426446053576{"item-6":{"p":{"x":25.484809555865787,"y":17.13345683956885},"a":56.55108306250028,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +w1426446054579{"item-6":{"p":{"x":25.484809555865787,"y":17.13345683956885},"a":56.55108306250028,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +w1426446055579{"item-6":{"p":{"x":25.484809555865787,"y":17.13345683956885},"a":56.55108306250028,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +w1426446056580{"item-6":{"p":{"x":25.484809555865787,"y":17.13345683956885},"a":56.55108306250028,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} +w1426446057580{"item-6":{"p":{"x":25.484809555865787,"y":17.13345683956885},"a":56.55108306250028,"lv":{"x":0,"y":0},"av":0},"item-5":{"p":{"x":3.551564486509986,"y":18.086205519078288},"a":25.13402937147234,"lv":{"x":0,"y":0},"av":0},"item-4":{"p":{"x":20.200046042197616,"y":14.276203440989589},"a":-0.0004911852214511747,"lv":{"x":0,"y":0},"av":0},"item-3":{"p":{"x":22.4,"y":14.277445638095237},"a":0,"lv":{"x":0,"y":0},"av":0},"item-2":{"p":{"x":25.676240547787568,"y":9.396188210902643},"a":1.5696221500784544,"lv":{"x":0,"y":0},"av":0},"item-1":{"p":{"x":19.642184126984116,"y":14.278214285714286},"a":0,"lv":{"x":0,"y":0},"av":0},"item-0":{"p":{"x":19.147450032657666,"y":14.276009262801196},"a":0.0025201794161469693,"lv":{"x":0,"y":0},"av":0}} diff --git a/scripts/core_analyzer.js b/scripts/core_analyzer.js deleted file mode 100644 index 3885d12..0000000 --- a/scripts/core_analyzer.js +++ /dev/null @@ -1,247 +0,0 @@ -/* - * This will generate a core/channel/client overview of a class - * - * usage: - * node scripts/core_analyzer.js [relative/path/class.js] -> relative path from core/client/channel split - * - * example: - * node scripts/core_analyzer.js GameObjects/Item.js - * - * example result: - * - * | CHANNEL | CORE | CLIENT - * |---------------------------------------|---------------------------------------|-------------------------------- - * | | getBodyDef | - * | | getFixtureDef | - * | | createFixture | - * | | flip | flip - * | beingGrabbed | beingGrabbed | - * | beingReleased | beingReleased | - * | onCollisionChange | onCollisionChange | - * | | reposition | - * | | getGrabPoint | - * | | throw | - * | | accelerateBody | - * | | destroy | destroy - * | | | createMesh - * | | | render - * | getLastMovedBy | | - * | setLastMovedBy | | - * | isGrabbingAllowed | | - * | isReleasingAllowed | | - * - */ - -var fs = require('fs'); -var util = require('util'); -var esprima = require('esprima'); -var escodegen = require('escodegen'); - -var info = []; -var overview = {}; - -var generatorOption = { - format: { - indent: { - style: ' ', - base: 0, - adjustMultilineComment: true//false - }, - newline: '\n', - space: ' ', - json: false, - renumber: false, - hexadecimal: false, - quotes: 'single', - escapeless: false, - compact: false, - parentheses: true, - semicolons: true, - safeConcatenation: true - }, - moz: { - starlessGenerator: false, - parenthesizedComprehensionBlock: false, - comprehensionExpressionStartsWithAssignment: false - }, - parse: null, - comment: true, - sourceMap: undefined, - sourceMapRoot: null, - sourceMapWithCode: false, - file: undefined, - directive: false, - verbatim: undefined -}; - -function readFile (path, category, fileName) { - //console.log("+++++ " + moduleName + " ++++++"); - var contents = fs.readFileSync(path + "/" + category + "/" + fileName); - contents = contents.toString(); - - getMethods(path, fileName, contents, category); -} - -function getMethods (path, fileName, contents, category) { - - category = category.toLowerCase(); - - overview[category] = []; - - var fullPath = path + "/" + fileName; - var moduleName = fileName.split(".js").join(""); - var tree = esprima.parse(contents); - - // find moduleId from return statement on module level - var module = tree.body[0].expression.arguments[1].body.body; - var moduleId = findModuleId(module); - - if (!moduleId) { - info.push("could not find moduleId in: " + fullPath); - return; - } - - if (moduleId == "Parent") { - info.push("not optimizing empty module (returning Parent) in: " + fullPath); - return; - } - - // find constructor - var constructorPosition = findConstructorPosition(module, moduleId); - if (constructorPosition === false) { - info.push("could not find constructor in: " + fileName) - return; - } - var constructor = module[constructorPosition]; - - - - for (var j = 0; j < module.length; j++) { - var expression = module[j]; - - if (expression.type == "ExpressionStatement") { - if(expression.expression && expression.expression.right) { - if(expression.expression.right.type == "FunctionExpression") { - overview[category].push(expression.expression.left.property.name); - } - } - } - } - - //console.log(escodegen.generate(tree, generatorOption)); -} - -function findModuleId (module) { - var moduleId = false; - for (var j = 0; j < module.length; j++) { - var expression = module[j]; - - //console.log(util.inspect(expression, { showHidden: true, depth: 4 })); - - if (expression.type == "ReturnStatement") { - - if(expression.argument.type == "Identifier") { - - // for return Module; - moduleId = expression.argument.name; - break; - - } else if (expression.argument.type == "NewExpression") { - - // for return new Module; - moduleId = expression.argument.callee.name; - break; - - } else { - info.push("Unexpected return type at module level. " + fullPath) - } - } - } - return moduleId; -}; - -function findConstructorPosition (module, moduleId) { - - for (var j = 0; j < module.length; j++) { - var expression = module[j]; - - if (expression.type == "FunctionDeclaration" && expression.id.name == moduleId) { - return j; - } - } - return false; -} - - -var superOverview = {}; -function display (category) { - - var all = ["core", "client", "channel"]; - var removeIndex = all.indexOf(category); - all.splice(removeIndex, 1); - - for (var k in overview[category]) { - - var name = overview[category][k]; - - if(superOverview.hasOwnProperty(name)) { - continue; - } - - var first = all[0]; - var second = all[1]; - - fv = 0 + (overview[first].indexOf(name) !== -1); - sv = 0 + (overview[second].indexOf(name) !== -1); - - superOverview[name] = {}; - - superOverview[name][category] = 1; - superOverview[name][first] = fv; - superOverview[name][second] = sv; - superOverview[name]['count'] = 1 + fv + sv; - } -} - -function show(){ - var alle = ['channel', 'core', 'client']; - console.log("| CHANNEL | CORE | CLIENT"); - console.log("|---------------------------------------|---------------------------------------|--------------------------------"); - for (var method in superOverview) { - var line = ""; - - for (var i = 0; i < alle.length; i++) { - if (superOverview[method] && superOverview[method].hasOwnProperty(alle[i])) { - - line += "| " ; - - if(superOverview[method][alle[i]] === 1) { - line += method; - line += Array(39 - method.length).join(" "); - } else { - line += Array(39).join(" "); - } - - - } else { - - } - - } - console.log(line) - } -} - - - -readFile("app/Game", "Core", process.argv[2]); -readFile("app/Game", "Channel", process.argv[2]); -readFile("app/Game", "Client", process.argv[2]); - -display("core") -display("client") -display("channel") - -console.log("\n") -show() -console.log("\n") \ No newline at end of file diff --git a/server.js b/server.js index bb9586f..16655ae 100755 --- a/server.js +++ b/server.js @@ -2,7 +2,6 @@ var GLOBALS = { context: "Channel" }; var requirejs = require('requirejs'); -var fs = require('fs'); var inspector; @@ -26,17 +25,10 @@ var options = { requirejs([ "Bootstrap/HttpServer", "Bootstrap/Socket", - "Server/Coordinator", - "Game/Config/Settings" + "Server/Coordinator" ], -function (HttpServer, Socket, Coordinator, Settings) { - - var records = fs.readdirSync(Settings.CHANNEL_RECORDING_PATH); - if (records.length > 200) { - console.warn('Too many recordings!'); - } - +function (HttpServer, Socket, Coordinator) { var coordinator = new Coordinator(); var httpServer = new HttpServer(options, coordinator); var socket = new Socket(httpServer.getServer(), options, coordinator); diff --git a/static/html/index.html b/static/html/index.html index 24f0143..fb062a7 100644 --- a/static/html/index.html +++ b/static/html/index.html @@ -21,11 +21,17 @@

Create your own!

-

-

+

+

Maps
    +
  • + +
  • +
  • + +
@@ -77,4 +83,4 @@ - + \ No newline at end of file diff --git a/static/html/not_available.html b/static/html/not_available.html index 77a5ff8..40bdb04 100644 --- a/static/html/not_available.html +++ b/static/html/not_available.html @@ -53,7 +53,7 @@ a {