diff options
author | Patric Stout <truebrain@openttd.org> | 2020-12-05 21:57:47 +0100 |
---|---|---|
committer | Patric Stout <github@truebrain.nl> | 2020-12-15 15:46:39 +0100 |
commit | d15dc9f40f5a20bff452547a2dcb15231f9f969d (patch) | |
tree | 7b8d88635c048d906cbb6358007fb26055e24410 /os/emscripten/pre.js | |
parent | 2da07f76154d841bcfe9aaff4833144550186deb (diff) | |
download | openttd-d15dc9f40f5a20bff452547a2dcb15231f9f969d.tar.xz |
Add: support for emscripten (play-OpenTTD-in-the-browser)
Emscripten compiles to WASM, which can be loaded via
HTML / JavaScript. This allows you to play OpenTTD inside a
browser.
Co-authored-by: milek7 <me@milek7.pl>
Diffstat (limited to 'os/emscripten/pre.js')
-rw-r--r-- | os/emscripten/pre.js | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/os/emscripten/pre.js b/os/emscripten/pre.js new file mode 100644 index 000000000..5cbd899e0 --- /dev/null +++ b/os/emscripten/pre.js @@ -0,0 +1,93 @@ +Module.arguments.push('-mnull', '-snull', '-vsdl:relative_mode'); +Module['websocket'] = { url: function(host, port, proto) { + /* openttd.org hosts a WebSocket proxy for the content service. */ + if (host == "content.openttd.org" && port == 3978 && proto == "tcp") { + return "wss://content.openttd.org/"; + } + + /* Everything else just tries to make a default WebSocket connection. + * If you run your own server you can setup your own WebSocket proxy in + * front of it and let people connect to your server via the proxy. You + * are best to add another "if" statement as above for this. */ + return null; +} }; + +Module.preRun.push(function() { + personal_dir = '/home/web_user/.openttd'; + content_download_dir = personal_dir + '/content_download' + + /* Because of the "-c" above, all user-data is stored in /user_data. */ + FS.mkdir(personal_dir); + FS.mount(IDBFS, {}, personal_dir); + + Module.addRunDependency('syncfs'); + FS.syncfs(true, function (err) { + /* FS.mkdir() tends to fail if parent folders do not exist. */ + if (!FS.analyzePath(content_download_dir).exists) { + FS.mkdir(content_download_dir); + } + if (!FS.analyzePath(content_download_dir + '/baseset').exists) { + FS.mkdir(content_download_dir + '/baseset'); + } + + /* Check if the OpenGFX baseset is already downloaded. */ + if (!FS.analyzePath(content_download_dir + '/baseset/opengfx-0.6.0.tar').exists) { + window.openttd_downloaded_opengfx = true; + FS.createPreloadedFile(content_download_dir + '/baseset', 'opengfx-0.6.0.tar', 'https://installer.cdn.openttd.org/emscripten/opengfx-0.6.0.tar', true, true); + } else { + /* Fake dependency increase, so the counter is stable. */ + Module.addRunDependency('opengfx'); + Module.removeRunDependency('opengfx'); + } + + Module.removeRunDependency('syncfs'); + }); + + window.openttd_syncfs_shown_warning = false; + window.openttd_syncfs = function() { + /* Copy the virtual FS to the persistent storage. */ + FS.syncfs(false, function (err) { }); + + /* On first time, warn the user about the volatile behaviour of + * persistent storage. */ + if (!window.openttd_syncfs_shown_warning) { + window.openttd_syncfs_shown_warning = true; + Module.onWarningFs(); + } + } + + window.openttd_exit = function() { + Module.onExit(); + } + + window.openttd_abort = function() { + Module.onAbort(); + } + + window.openttd_server_list = function() { + add_server = Module.cwrap("em_openttd_add_server", null, ["string", "number"]); + + /* Add servers that support WebSocket here. Example: + * add_server("localhost", 3979); */ + } + + /* https://github.com/emscripten-core/emscripten/pull/12995 implements this + * properly. Till that time, we use a polyfill. */ + SOCKFS.websocket_sock_ops.createPeer_ = SOCKFS.websocket_sock_ops.createPeer; + SOCKFS.websocket_sock_ops.createPeer = function(sock, addr, port) + { + let func = Module['websocket']['url']; + Module['websocket']['url'] = func(addr, port, (sock.type == 2) ? 'udp' : 'tcp'); + let ret = SOCKFS.websocket_sock_ops.createPeer_(sock, addr, port); + Module['websocket']['url'] = func; + return ret; + } +}); + +Module.postRun.push(function() { + /* Check if we downloaded OpenGFX; if so, sync the virtual FS back to the + * IDBFS so OpenGFX is stored persistent. */ + if (window['openttd_downloaded_opengfx']) { + FS.syncfs(false, function (err) { }); + } +}); |