├── server
├── config.cfg
├── wsc-chrome.min.js.txt
├── js
│ ├── Console.js
│ ├── V.js
│ ├── SyncServerSys.js
│ ├── Sys.js
│ ├── SZ.js
│ ├── Def.js
│ ├── Cvar.js
│ ├── Protocol.js
│ ├── SyncClientSys.js
│ ├── CRC.js
│ ├── MSG.js
│ ├── Q.js
│ ├── Vec.js
│ ├── Cmd.js
│ ├── NET.js
│ ├── COM.js
│ ├── ED.js
│ ├── NET_Datagram.js
│ ├── Mod.js
│ ├── NET_WEBS.js
│ ├── PF.js
│ ├── PR.js
│ └── Host.js
├── server.html
├── chromenodews.js
└── server.js
├── TODO
├── earthquake-icone-4663-128.png
├── earthquake-icone-4663-16.png
├── earthquake-icone-4663-32.png
├── earthquake-icone-4663-48.png
├── earthquake-icone-4663-64.png
├── earthquake-icone-4663-96.png
├── .gitmodules
├── common.js
├── index.html
├── package.sh
├── buy.js
├── README.md
├── manifest.json
├── background.js
├── launch.html
├── index.js
└── launch.js
/server/config.cfg:
--------------------------------------------------------------------------------
1 | registered 0
2 | coop 1
3 | deathmatch 0
4 |
--------------------------------------------------------------------------------
/TODO:
--------------------------------------------------------------------------------
1 | - xbox 360 gamepad deadzone problem. maybe when polling if value is unchanged for several frames, call it 0
2 |
--------------------------------------------------------------------------------
/earthquake-icone-4663-128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kzahel/WebQuake-Chrome/HEAD/earthquake-icone-4663-128.png
--------------------------------------------------------------------------------
/earthquake-icone-4663-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kzahel/WebQuake-Chrome/HEAD/earthquake-icone-4663-16.png
--------------------------------------------------------------------------------
/earthquake-icone-4663-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kzahel/WebQuake-Chrome/HEAD/earthquake-icone-4663-32.png
--------------------------------------------------------------------------------
/earthquake-icone-4663-48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kzahel/WebQuake-Chrome/HEAD/earthquake-icone-4663-48.png
--------------------------------------------------------------------------------
/earthquake-icone-4663-64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kzahel/WebQuake-Chrome/HEAD/earthquake-icone-4663-64.png
--------------------------------------------------------------------------------
/earthquake-icone-4663-96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kzahel/WebQuake-Chrome/HEAD/earthquake-icone-4663-96.png
--------------------------------------------------------------------------------
/server/wsc-chrome.min.js.txt:
--------------------------------------------------------------------------------
1 | this file should come from github.com/kzahel/web-server-chrome by running the minimize.sh script
2 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "WebQuake"]
2 | path = WebQuake-sync
3 | url = git@github.com:kzahel/WebQuake
4 | [submodule "WebQuake-async"]
5 | path = WebQuake-async
6 | url = git@bitbucket.org:kzahel/WebQuake
7 |
--------------------------------------------------------------------------------
/common.js:
--------------------------------------------------------------------------------
1 |
2 | function deleteServerSockets() {
3 | chrome.sockets.tcpServer.getSockets(function(infos) {
4 | infos.forEach( function(info) {
5 | chrome.sockets.tcpServer.close(info.socketId,
6 | function(i) { console.log('closed server socket',i) })
7 | })
8 | })
9 | }
10 |
--------------------------------------------------------------------------------
/server/js/Console.js:
--------------------------------------------------------------------------------
1 | Con = {};
2 |
3 | Con.Print = function(msg)
4 | {
5 | if (msg.charCodeAt(0) >= 3)
6 | process.stdout.write(msg);
7 | else
8 | process.stdout.write(msg.substring(1));
9 | };
10 |
11 | Con.DPrint = function(msg)
12 | {
13 | if (Host.developer.value !== 0)
14 | Con.Print(msg);
15 | };
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/package.sh:
--------------------------------------------------------------------------------
1 | rm package.zip
2 |
3 | zip package.zip -r manifest.json *.png *.js *.html WebQuake-async/Client server
4 |
5 | #zip package.zip -r manifest.json *.png *.js *.html WebQuake/Client web-server-chrome/*.js
6 |
7 | #zip package.zip -r * -x package.sh -x *.git* -x "*.*~" -x web-server-chrome/manifest.json -x web-server-chrome/*.png -x WebQuake/Server/* WebQuake/Server/id1/*
8 |
9 | #web-server-chrome/*.js *.html *.js manifest.json WebQuake/* WebQuake/Client/* WebQuake/Client/id1/* WebQuake/Client/WebQuake/* *.png
10 |
--------------------------------------------------------------------------------
/server/js/V.js:
--------------------------------------------------------------------------------
1 | V = {};
2 |
3 | V.CalcRoll = function(angles, velocity)
4 | {
5 | var right = [];
6 | Vec.AngleVectors(angles, null, right);
7 | var side = velocity[0] * right[0] + velocity[1] * right[1] + velocity[2] * right[2];
8 | var sign = side < 0 ? -1 : 1;
9 | side = Math.abs(side);
10 | if (side < V.rollspeed.value)
11 | return side * sign * V.rollangle.value / V.rollspeed.value;
12 | return V.rollangle.value * sign;
13 | };
14 |
15 | V.Init = function()
16 | {
17 | V.rollspeed = Cvar.RegisterVariable('cl_rollspeed', '200');
18 | V.rollangle = Cvar.RegisterVariable('cl_rollangle', '2.0');
19 | };
--------------------------------------------------------------------------------
/buy.js:
--------------------------------------------------------------------------------
1 | (function() { var f=this,g=function(a,d){var c=a.split("."),b=window||f;c[0]in b||!b.execScript||b.execScript("var "+c[0]);for(var e;c.length&&(e=c.shift());)c.length||void 0===d?b=b[e]?b[e]:b[e]={}:b[e]=d};var h=function(a){var d=chrome.runtime.connect("nmmhkkegccagdldgiimedpiccmgmieda",{}),c=!1;d.onMessage.addListener(function(b){c=!0;"response"in b&&!("errorType"in b.response)?a.success&&a.success(b):a.failure&&a.failure(b)});d.onDisconnect.addListener(function(){!c&&a.failure&&a.failure({request:{},response:{errorType:"INTERNAL_SERVER_ERROR"}})});d.postMessage(a)};g("google.payments.inapp.buy",function(a){a.method="buy";h(a)});
2 | g("google.payments.inapp.getPurchases",function(a){a.method="getPurchases";h(a)});g("google.payments.inapp.getSkuDetails",function(a){a.method="getSkuDetails";h(a)}); })();
3 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Get it in the Chrome Web Store!
2 |
3 | 
4 |
5 | [Available to install in the Chrome web store](https://chrome.google.com/webstore/detail/web-quake/ibkbfanmkmadbbgggonficloplenbefh)
6 |
7 |
8 | ### WebQuake (Fork by kzahel (Fork by efess)) original by https://github.com/3angel/WebQuake
9 |
10 | **WebQuake** is an HTML5 WebGL port of the game Quake by id Software.
11 |
12 | ### Features added in this fork (kzahel) (https://bitbucket.org/kzahel/webquake)
13 | * multiplayer server using chrome.sockets and websockets
14 | * gamepad support
15 | * restore web audio api
16 | * remove localStorage
17 |
--------------------------------------------------------------------------------
/server/js/SyncServerSys.js:
--------------------------------------------------------------------------------
1 | Sys = {};
2 |
3 | Sys.Quit = function()
4 | {
5 | process.exit(0);
6 | };
7 |
8 | Sys.Print = function(text)
9 | {
10 | process.stdout.write(text);
11 | };
12 |
13 | Sys.Error = function(text)
14 | {
15 | console.log(text);
16 | throw new Error(text);
17 | };
18 |
19 | Sys.FloatTime = function()
20 | {
21 | var time = process.hrtime(Sys.oldtime);
22 | return time[0] + (time[1] / 1000000000.0);
23 | };
24 |
25 | Sys.cmd = '';
26 | Sys.ConsoleInput = function()
27 | {
28 | var text = Sys.cmd;
29 | if (text.length === 0)
30 | return;
31 | Sys.cmd = '';
32 | return text;
33 | };
34 |
35 | Sys.main = function()
36 | {
37 | COM.InitArgv(process.argv.slice(1));
38 | Sys.oldtime = process.hrtime();
39 | Sys.Print('Host.Init\n');
40 | Host.Init();
41 | process.stdin.resume();
42 | process.stdin.on('data', Sys.StdinOnData);
43 | process.nextTick(Host.Frame);
44 | };
45 |
46 | Sys.StdinOnData = function(data)
47 | {
48 | Sys.cmd += Q.memstr(data);
49 | };
--------------------------------------------------------------------------------
/server/js/Sys.js:
--------------------------------------------------------------------------------
1 | Sys = {};
2 |
3 | Sys.Quit = function()
4 | {
5 | process.exit(0);
6 | };
7 |
8 | Sys.Print = function(text)
9 | {
10 | process.stdout.write(text);
11 | };
12 |
13 | Sys.Error = function(text)
14 | {
15 | console.log(text);
16 | throw new Error(text);
17 | };
18 |
19 | Sys.FloatTime = function()
20 | {
21 | var time = process.hrtime(Sys.oldtime);
22 | return time[0] + (time[1] / 1000000000.0);
23 | };
24 |
25 | Sys.cmd = '';
26 | Sys.ConsoleInput = function()
27 | {
28 | var text = Sys.cmd;
29 | if (text.length === 0)
30 | return;
31 | Sys.cmd = '';
32 | return text;
33 | };
34 |
35 | Sys.main = function()
36 | {
37 | COM.InitArgv(process.argv.slice(1));
38 | Sys.oldtime = process.hrtime();
39 | Sys.Print('Host.Init\n');
40 | Host.Init();
41 | process.stdin.resume();
42 | process.stdin.on('data', Sys.StdinOnData);
43 | process.nextTick(Host.Frame);
44 | };
45 |
46 | Sys.StdinOnData = function(data)
47 | {
48 | Sys.cmd += Q.memstr(data);
49 | };
50 |
--------------------------------------------------------------------------------
/server/js/SZ.js:
--------------------------------------------------------------------------------
1 | SZ = {};
2 |
3 | SZ.GetSpace = function(buf, length)
4 | {
5 | if ((buf.cursize + length) > buf.data.byteLength)
6 | {
7 | if (buf.allowoverflow !== true)
8 | Sys.Error('SZ.GetSpace: overflow without allowoverflow set');
9 | if (length > buf.byteLength)
10 | Sys.Error('SZ.GetSpace: ' + length + ' is > full buffer size');
11 | buf.overflowed = true;
12 | Con.Print('SZ.GetSpace: overflow\n');
13 | buf.cursize = 0;
14 | }
15 | var cursize = buf.cursize;
16 | buf.cursize += length;
17 | return cursize;
18 | };
19 |
20 | SZ.Write = function(sb, data, length)
21 | {
22 | (new Uint8Array(sb.data, SZ.GetSpace(sb, length), length)).set(data.subarray(0, length));
23 | };
24 |
25 | SZ.Print = function(sb, data)
26 | {
27 | var buf = new Uint8Array(sb.data);
28 | var dest;
29 | if (sb.cursize !== 0)
30 | {
31 | if (buf[sb.cursize - 1] === 0)
32 | dest = SZ.GetSpace(sb, data.length - 1) - 1;
33 | else
34 | dest = SZ.GetSpace(sb, data.length);
35 | }
36 | else
37 | dest = SZ.GetSpace(sb, data.length);
38 | var i;
39 | for (i = 0; i < data.length; ++i)
40 | buf[dest + i] = data.charCodeAt(i);
41 | };
--------------------------------------------------------------------------------
/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6ZBSt2PX2520oXWQSOrJXbfCMVmgtBFsAnk0feDkb1rT42aIhym0kENWhICYY1ZD8skCBlpeuFcx4Eo5nlVr+dihyUw9f3Rliik2sHceSJbpyqhT0EjQY0bCvqyh6fEWJBFsKAuuazQlbK9gS7H4Zm4yhTbaH+5CEkVQtVXYVLQIDAQAB",
3 | "short_name": "Quake",
4 | "name": "Web Quake",
5 | "description": "Quake by id Software for Chrome",
6 | "version": "1.0.5",
7 | "manifest_version": 2,
8 | "offline_enabled": true,
9 | "sockets": {
10 | "udp": {
11 | "send": [""],
12 | "bind": [""],
13 | "multicastMembership": ""
14 | },
15 | "tcp": {
16 | "connect": [""]
17 | },
18 | "tcpServer": {
19 | "listen": [""]
20 | }
21 | },
22 | "permissions": [
23 | {"fileSystem":["write"]},
24 | "pointerLock",
25 | "system.network",
26 | "fullscreen",
27 | "identity",
28 | "storage",
29 | "webview",
30 | "http://*/",
31 | "https://*/",
32 | "https://www.googleapis.com/"
33 | ],
34 | "app": {
35 | "background": {
36 | "scripts": ["background.js"]
37 | }
38 | },
39 | "webview": {
40 | "partitions": [
41 | { "name": "trusted*",
42 | "accessible_resources": ["*.*"]
43 | }
44 | ]
45 | },
46 | "icons": {
47 | "16": "earthquake-icone-4663-16.png",
48 | "32": "earthquake-icone-4663-32.png",
49 | "48": "earthquake-icone-4663-48.png",
50 | "64": "earthquake-icone-4663-64.png",
51 | "96": "earthquake-icone-4663-96.png",
52 | "128": "earthquake-icone-4663-128.png"
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/server/js/Def.js:
--------------------------------------------------------------------------------
1 | Def = {};
2 |
3 | Def.timedate = 'Exe: 10:13:04 Dec 8 2013\n';
4 |
5 | Def.max_edicts = 600;
6 |
7 | Def.stat = {
8 | health: 0,
9 | frags: 1,
10 | weapon: 2,
11 | ammo: 3,
12 | armor: 4,
13 | weaponframe: 5,
14 | shells: 6,
15 | nails: 7,
16 | rockets: 8,
17 | cells: 9,
18 | activeweapon: 10,
19 | totalsecrets: 11,
20 | totalmonsters: 12,
21 | secrets: 13,
22 | monsters: 14
23 | };
24 |
25 | Def.it = {
26 | shotgun: 1,
27 | super_shotgun: 2,
28 | nailgun: 4,
29 | super_nailgun: 8,
30 | grenade_launcher: 16,
31 | rocket_launcher: 32,
32 | lightning: 64,
33 | super_lightning: 128,
34 | shells: 256,
35 | nails: 512,
36 | rockets: 1024,
37 | cells: 2048,
38 | axe: 4096,
39 | armor1: 8192,
40 | armor2: 16384,
41 | armor3: 32768,
42 | superhealth: 65536,
43 | key1: 131072,
44 | key2: 262144,
45 | invisibility: 524288,
46 | invulnerability: 1048576,
47 | suit: 2097152,
48 | quad: 4194304
49 | };
50 |
51 | Def.rit = {
52 | shells: 128,
53 | nails: 256,
54 | rockets: 512,
55 | cells: 1024,
56 | axe: 2048,
57 | lava_nailgun: 4096,
58 | lava_super_nailgun: 8192,
59 | multi_grenade: 16384,
60 | multi_rocket: 32768,
61 | plasma_gun: 65536,
62 | armor1: 8388608,
63 | armor2: 16777216,
64 | armor3: 33554432,
65 | lava_nails: 67108864,
66 | plasma_ammo: 134217728,
67 | multi_rockets: 268435456,
68 | shield: 536870912,
69 | antigrav: 1073741824,
70 | superhealth: 2147483648
71 | };
72 |
73 | Def.hit = {
74 | proximity_gun_bit: 16,
75 | mjolnir_bit: 7,
76 | laser_cannon_bit: 23,
77 | proximity_gun: 65536,
78 | mjolnir: 128,
79 | laser_cannon: 8388608,
80 | wetsuit: 33554432,
81 | empathy_shields: 67108864
82 | };
--------------------------------------------------------------------------------
/background.js:
--------------------------------------------------------------------------------
1 | console.log('background.js')
2 | chrome.app.runtime.onLaunched.addListener(function(launchData) {
3 | onstarted()
4 | })
5 |
6 | chrome.runtime.onMessage.addListener( function(message) {
7 | if (message == 'restart_server') {
8 | setTimeout( doserver, 1 )
9 | }
10 | })
11 |
12 | function onstarted() {
13 | launch()
14 |
15 | }
16 |
17 | function launch() {
18 | chrome.app.window.create('launch.html',
19 | { defaultWidth: 512,
20 | id:'WebQuake-launch',
21 | defaultHeight: 384 },
22 | function(w) {
23 | console.log('window created');
24 | })
25 | }
26 | function doserver() {
27 | // this is only for debugging. look in launch.js for actual server launch
28 | var server = chrome.app.window.get('server')
29 | if (server) {
30 | console.log('closing server window')
31 | server.close()
32 | setTimeout( doserver, 500 )
33 | return
34 | }
35 |
36 | //var arg = encodeURIComponent('+ map start')
37 | var arg = ''
38 | chrome.app.window.create('server/server.html?' + arg,
39 | { defaultWidth: 512,
40 | id:'server',
41 | hidden: true,
42 | defaultHeight: 384 },
43 | function(w) {
44 | console.log('server window created');
45 | w.onClosed.addListener( function() {
46 | console.log('server window closed')
47 | localServer = false
48 | deleteServerSockets()
49 | })
50 | })
51 |
52 | }
53 |
54 | var reload = chrome.runtime.reload
55 |
--------------------------------------------------------------------------------
/server/js/Cvar.js:
--------------------------------------------------------------------------------
1 | Cvar = {};
2 |
3 | Cvar.vars = [];
4 |
5 | Cvar.FindVar = function(name)
6 | {
7 | var i;
8 | for (i = 0; i < Cvar.vars.length; ++i)
9 | {
10 | if (Cvar.vars[i].name === name)
11 | return Cvar.vars[i];
12 | }
13 | };
14 |
15 | Cvar.Set = function(name, value)
16 | {
17 | var i, v, changed;
18 | for (i = 0; i < Cvar.vars.length; ++i)
19 | {
20 | v = Cvar.vars[i];
21 | if (v.name !== name)
22 | continue;
23 | if (v.string !== value)
24 | changed = true;
25 | v.string = value;
26 | v.value = Q.atof(value);
27 | if ((v.server === true) && (changed === true) && (SV.server.active === true))
28 | Host.BroadcastPrint('"' + v.name + '" changed to "' + v.string + '"\n');
29 | return;
30 | }
31 | Con.Print('Cvar.Set: variable ' + name + ' not found\n');
32 | };
33 |
34 | Cvar.SetValue = function(name, value)
35 | {
36 | Cvar.Set(name, value.toFixed(6));
37 | };
38 |
39 | Cvar.RegisterVariable = function(name, value, archive, server)
40 | {
41 | var i;
42 | for (i = 0; i < Cvar.vars.length; ++i)
43 | {
44 | if (Cvar.vars[i].name === name)
45 | {
46 | Con.Print('Can\'t register variable ' + name + ', allready defined\n');
47 | return;
48 | }
49 | }
50 | Cvar.vars[Cvar.vars.length] =
51 | {
52 | name: name,
53 | string: value,
54 | archive: archive,
55 | server: server,
56 | value: Q.atof(value)
57 | };
58 | return Cvar.vars[Cvar.vars.length - 1];
59 | };
60 |
61 | Cvar.Command = function()
62 | {
63 | var v = Cvar.FindVar(Cmd.argv[0]);
64 | if (v == null)
65 | return;
66 | if (Cmd.argv.length <= 1)
67 | {
68 | Con.Print('"' + v.name + '" is "' + v.string + '"\n');
69 | return true;
70 | }
71 | Cvar.Set(v.name, Cmd.argv[1]);
72 | return true;
73 | };
74 |
75 | Cvar.WriteVariables = function()
76 | {
77 | var f = [], i, v;
78 | for (i = 0; i < Cvar.vars.length; ++i)
79 | {
80 | v = Cvar.vars[i];
81 | if (v.archive === true)
82 | f[f.length] = v.name + ' "' + v.string + '"\n';
83 | }
84 | return f.join('');
85 | };
--------------------------------------------------------------------------------
/launch.html:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 | Web Quake for Chrome
11 |
12 |
46 |
47 | Credits
48 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/server/js/Protocol.js:
--------------------------------------------------------------------------------
1 | Protocol = {};
2 |
3 | Protocol.version = 15;
4 |
5 | Protocol.u = {
6 | morebits: 1,
7 | origin1: 1 << 1,
8 | origin2: 1 << 2,
9 | origin3: 1 << 3,
10 | angle2: 1 << 4,
11 | nolerp: 1 << 5,
12 | frame: 1 << 6,
13 | signal: 1 << 7,
14 |
15 | angle1: 1 << 8,
16 | angle3: 1 << 9,
17 | model: 1 << 10,
18 | colormap: 1 << 11,
19 | skin: 1 << 12,
20 | effects: 1 << 13,
21 | longentity: 1 << 14
22 | };
23 |
24 | Protocol.su = {
25 | viewheight: 1,
26 | idealpitch: 1 << 1,
27 | punch1: 1 << 2,
28 | punch2: 1 << 3,
29 | punch3: 1 << 4,
30 | velocity1: 1 << 5,
31 | velocity2: 1 << 6,
32 | velocity3: 1 << 7,
33 | items: 1 << 9,
34 | onground: 1 << 10,
35 | inwater: 1 << 11,
36 | weaponframe: 1 << 12,
37 | armor: 1 << 13,
38 | weapon: 1 << 14
39 | };
40 |
41 | Protocol.default_viewheight = 22;
42 |
43 | Protocol.svc = {
44 | nop: 1,
45 | disconnect: 2,
46 | updatestat: 3,
47 | version: 4,
48 | setview: 5,
49 | sound: 6,
50 | time: 7,
51 | print: 8,
52 | stufftext: 9,
53 | setangle: 10,
54 | serverinfo: 11,
55 | lightstyle: 12,
56 | updatename: 13,
57 | updatefrags: 14,
58 | clientdata: 15,
59 | stopsound: 16,
60 | updatecolors: 17,
61 | particle: 18,
62 | damage: 19,
63 | spawnstatic: 20,
64 | spawnbaseline: 22,
65 | temp_entity: 23,
66 | setpause: 24,
67 | signonnum: 25,
68 | centerprint: 26,
69 | killedmonster: 27,
70 | foundsecret: 28,
71 | spawnstaticsound: 29,
72 | intermission: 30,
73 | finale: 31,
74 | cdtrack: 32,
75 | sellscreen: 33,
76 | cutscene: 34
77 | };
78 |
79 | Protocol.clc = {
80 | nop: 1,
81 | disconnect: 2,
82 | move: 3,
83 | stringcmd: 4
84 | };
85 |
86 | Protocol.te = {
87 | spike: 0,
88 | superspike: 1,
89 | gunshot: 2,
90 | explosion: 3,
91 | tarexplosion: 4,
92 | lightning1: 5,
93 | lightning2: 6,
94 | wizspike: 7,
95 | knightspike: 8,
96 | lightning3: 9,
97 | lavasplash: 10,
98 | teleport: 11,
99 | explosion2: 12,
100 | beam: 13
101 | };
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | // foo
2 | document.addEventListener('DOMContentLoaded', onready)
3 |
4 | function decode_arguments_qp() {
5 | if (window.location.search) {
6 | var s = window.location.search.slice(1,window.location.search.length)
7 | var parts = s.split('&')
8 | var d = {}
9 | for (var i=0; i
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | Change map
34 | changelevel {mapname}
35 | builtin maps are start, e1m1, e1m2, ..., e1m8
36 |
37 | To play singleplayer (coop)
38 | deathmatch 0
39 | coop 1
40 | skill 3 (3 is hardest, 0 is easiest)
41 | changelevel e1m1
42 |
43 | Deathmatch (player vs player)
44 | deathmatch 1
45 | coop 0
46 | changelevel e1m7
47 |
48 | TO CONNECT:
49 | go to multiplayer menu on other computer and type in one of
50 | the addresses on the bottom of the screen
51 |
52 | or open console, and type "connect ws://IP_ADDRESS:PORT"
53 |
54 |
55 |
56 |
57 | Command Help
58 |
59 | Server address:
60 |
61 |
62 | hint: you can open the quake console and type "connect ws://127.0.0.1:26000" (where 127.0.0.1 is the ip address) to connect. Server does not yet support full quake files (e.g. e2m2 etc).
63 |
64 |