Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(392)

Unified Diff: ports/quakespasm/quakespasm.js

Issue 337323007: Add quakespasm, and OpenGL+SDL-based port of quake1. (Closed) Base URL: https://naclports.googlecode.com/svn/trunk/src
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ports/quakespasm/pkg_info ('k') | ports/sdlquake/README.nacl » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ports/quakespasm/quakespasm.js
diff --git a/ports/quakespasm/quakespasm.js b/ports/quakespasm/quakespasm.js
new file mode 100644
index 0000000000000000000000000000000000000000..aa1c3c3e245930c2ed65e98c8fca7def19ba2f11
--- /dev/null
+++ b/ports/quakespasm/quakespasm.js
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2014 The Native Client Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+var PAK_FILE = 'id1/pak0.pak';
+
+function updateStatus(message) {
+ document.getElementById('status').innerHTML += message + '<br />';
+}
+
+/*
+ * Creates and add to the DOM the NaCl embed tag which
+ * in effect launches Quake.
+ */
+function runQuake(pwd) {
+ var embed = document.createElement('embed');
+ embed.width = 800;
+ embed.height = 600;
+ embed.type = 'application/x-nacl';
+ embed.src = 'quakespasm.nmf';
+ if (pwd)
+ embed.setAttribute('PWD', pwd);
+ document.getElementById('quake').appendChild(embed);
+}
+
+function extractNextEntry(entries, i, filesystem, oncomplete) {
+ if (i === entries.length) {
+ oncomplete();
+ return;
+ }
+
+ var entry = entries[i];
+ if (entry.directory) {
+ filesystem.root.getDirectory(entry.filename, { create : true },
+ function() {
+ extractNextEntry(entries, i + 1, filesystem, oncomplete);
+ }
+ );
+ return;
+ }
+
+ filesystem.root.getFile(entry.filename, { create : true },
+ function(fileEntry) {
+ var writer = new zip.FileWriter(fileEntry);
+ entry.getData(writer,
+ function() {
+ extractNextEntry(entries, i + 1, filesystem, oncomplete);
+ });
+ },
+ function(error) {
+ updateStatus('error creating temp file: ' + error);
+ }
+ );
+}
+
+function extractZipFile(file, filesystem, oncomplete) {
+ updateStatus('Extracting file: ' + file.name);
+ zip.createReader(new zip.BlobReader(file),
+ function(zipReader) {
+ zipReader.getEntries(function(entries) {
+ extractNextEntry(entries, 0, filesystem, oncomplete);
+ });
+ },
+ function() {
+ updateStatus('Error reading zip file');
+ }
+ )
+}
+
+function uploadDidChange(event) {
+ function oncomplete() {
+ // Once we have extracted all the files then
+ // launch the game.
+ updateStatus("Extracted all file. Launching Quake.");
+ runQuake('/tmp');
+ }
+
+ window.webkitRequestFileSystem(window.TEMPORARY, 50 * 1024 * 1024,
+ function(fs) {
+ var file = event.target.files[0];
+ extractZipFile(file, fs, oncomplete);
+ },
+ function() {
+ updateStatus('Error accessing html5 filesystem.');
+ }
+ );
+}
+
+function loadFromLocalStorage() {
+ function loadFailure() {
+ updateStatus('Quake data not found in local html5 filesystem.');
+ updateStatus('Please locate a quake level set (for example the '
+ + '<a href="http://www.libsdl.org/projects/quake/data/quakesw-1.0.6.zip">'
+ + 'shareware levels</a>) and either extract them alongside the nmf file,'
+ + ' or use the upload button below to unzip them in the local html5'
+ + ' filesystem.');
+ // Create an html5 file input elemnt in so the user can upload the game
+ // data as a zip file.
+ document.getElementById('quake').innerHTML =
+ '<input type="file" accept="application/zip" id="infile">';
+ document.getElementById('infile').addEventListener('change',
+ uploadDidChange,
+ false);
+ }
+
+ function loadSuccess() {
+ updateStatus('Found pak file in local storage. Launching quake.');
+ runQuake('/tmp');
+ }
+
+ window.webkitRequestFileSystem(window.TEMPORARY, 3 * 1024 * 1024,
+ function(fs) {
+ fs.root.getFile(PAK_FILE, {}, loadSuccess, loadFailure);
+ }
+ );
+}
+
+function onLoad() {
+ updateStatus('Searching for Quake data (' + PAK_FILE + ')');
+ var req = new XMLHttpRequest();
+ req.onload = function() {
+ if (this.status === 200) {
+ updateStatus('Found ' + PAK_FILE + '. Launching quake.');
+ runQuake();
+ } else {
+ // Failed to find PAK_FILE on webserver, try local storage
+ updateStatus('Quake data not found alongside executable.');
+ loadFromLocalStorage();
+ }
+ };
+ req.open('GET', PAK_FILE);
+ req.send(null);
+}
+
+window.onload = function() {
+ onLoad();
+};
« no previous file with comments | « ports/quakespasm/pkg_info ('k') | ports/sdlquake/README.nacl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698