engine.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. Function('return this')()['Engine'] = (function() {
  2. var unloadAfterInit = true;
  3. var canvas = null;
  4. var resizeCanvasOnStart = false;
  5. var customLocale = 'en_US';
  6. var wasmExt = '.wasm';
  7. var preloader = new Preloader();
  8. var loader = new Loader();
  9. var rtenv = null;
  10. var executableName = '';
  11. var loadPath = '';
  12. var loadPromise = null;
  13. var initPromise = null;
  14. var stderr = null;
  15. var stdout = null;
  16. var progressFunc = null;
  17. function load(basePath) {
  18. if (loadPromise == null) {
  19. loadPath = basePath;
  20. loadPromise = preloader.loadPromise(basePath + wasmExt);
  21. preloader.setProgressFunc(progressFunc);
  22. requestAnimationFrame(preloader.animateProgress);
  23. }
  24. return loadPromise;
  25. };
  26. function unload() {
  27. loadPromise = null;
  28. };
  29. /** @constructor */
  30. function Engine() {};
  31. Engine.prototype.init = /** @param {string=} basePath */ function(basePath) {
  32. if (initPromise) {
  33. return initPromise;
  34. }
  35. if (!loadPromise) {
  36. if (!basePath) {
  37. initPromise = Promise.reject(new Error("A base path must be provided when calling `init` and the engine is not loaded."));
  38. return initPromise;
  39. }
  40. load(basePath);
  41. }
  42. var config = {}
  43. if (typeof stdout === 'function')
  44. config.print = stdout;
  45. if (typeof stderr === 'function')
  46. config.printErr = stderr;
  47. initPromise = loader.init(loadPromise, loadPath, config).then(function() {
  48. return new Promise(function(resolve, reject) {
  49. rtenv = loader.env;
  50. if (unloadAfterInit) {
  51. loadPromise = null;
  52. }
  53. resolve();
  54. });
  55. });
  56. return initPromise;
  57. };
  58. /** @type {function(string, string):Object} */
  59. Engine.prototype.preloadFile = function(file, path) {
  60. return preloader.preload(file, path);
  61. };
  62. /** @type {function(...string):Object} */
  63. Engine.prototype.start = function() {
  64. // Start from arguments.
  65. var args = [];
  66. for (var i = 0; i < arguments.length; i++) {
  67. args.push(arguments[i]);
  68. }
  69. var me = this;
  70. return new Promise(function(resolve, reject) {
  71. return me.init().then(function() {
  72. if (!(canvas instanceof HTMLCanvasElement)) {
  73. canvas = Utils.findCanvas();
  74. }
  75. rtenv['locale'] = customLocale;
  76. rtenv['canvas'] = canvas;
  77. rtenv['thisProgram'] = executableName;
  78. rtenv['resizeCanvasOnStart'] = resizeCanvasOnStart;
  79. loader.start(preloader.preloadedFiles, args).then(function() {
  80. loader = null;
  81. initPromise = null;
  82. resolve();
  83. });
  84. });
  85. });
  86. };
  87. Engine.prototype.startGame = function(execName, mainPack) {
  88. // Start and init with execName as loadPath if not inited.
  89. executableName = execName;
  90. var me = this;
  91. return Promise.all([
  92. this.init(execName),
  93. this.preloadFile(mainPack, mainPack)
  94. ]).then(function() {
  95. return me.start('--main-pack', mainPack);
  96. });
  97. };
  98. Engine.prototype.setWebAssemblyFilenameExtension = function(override) {
  99. if (String(override).length === 0) {
  100. throw new Error('Invalid WebAssembly filename extension override');
  101. }
  102. wasmExt = String(override);
  103. };
  104. Engine.prototype.setUnloadAfterInit = function(enabled) {
  105. unloadAfterInit = enabled;
  106. };
  107. Engine.prototype.setCanvas = function(canvasElem) {
  108. canvas = canvasElem;
  109. };
  110. Engine.prototype.setCanvasResizedOnStart = function(enabled) {
  111. resizeCanvasOnStart = enabled;
  112. };
  113. Engine.prototype.setLocale = function(locale) {
  114. customLocale = locale;
  115. };
  116. Engine.prototype.setExecutableName = function(newName) {
  117. executableName = newName;
  118. };
  119. Engine.prototype.setProgressFunc = function(func) {
  120. progressFunc = func;
  121. }
  122. Engine.prototype.setStdoutFunc = function(func) {
  123. var print = function(text) {
  124. if (arguments.length > 1) {
  125. text = Array.prototype.slice.call(arguments).join(" ");
  126. }
  127. func(text);
  128. };
  129. if (rtenv)
  130. rtenv.print = print;
  131. stdout = print;
  132. };
  133. Engine.prototype.setStderrFunc = function(func) {
  134. var printErr = function(text) {
  135. if (arguments.length > 1)
  136. text = Array.prototype.slice.call(arguments).join(" ");
  137. func(text);
  138. };
  139. if (rtenv)
  140. rtenv.printErr = printErr;
  141. stderr = printErr;
  142. };
  143. // Closure compiler exported engine methods.
  144. /** @export */
  145. Engine['isWebGLAvailable'] = Utils.isWebGLAvailable;
  146. Engine['load'] = load;
  147. Engine['unload'] = unload;
  148. Engine.prototype['init'] = Engine.prototype.init
  149. Engine.prototype['preloadFile'] = Engine.prototype.preloadFile
  150. Engine.prototype['start'] = Engine.prototype.start
  151. Engine.prototype['startGame'] = Engine.prototype.startGame
  152. Engine.prototype['setWebAssemblyFilenameExtension'] = Engine.prototype.setWebAssemblyFilenameExtension
  153. Engine.prototype['setUnloadAfterInit'] = Engine.prototype.setUnloadAfterInit
  154. Engine.prototype['setCanvas'] = Engine.prototype.setCanvas
  155. Engine.prototype['setCanvasResizedOnStart'] = Engine.prototype.setCanvasResizedOnStart
  156. Engine.prototype['setLocale'] = Engine.prototype.setLocale
  157. Engine.prototype['setExecutableName'] = Engine.prototype.setExecutableName
  158. Engine.prototype['setProgressFunc'] = Engine.prototype.setProgressFunc
  159. Engine.prototype['setStdoutFunc'] = Engine.prototype.setStdoutFunc
  160. Engine.prototype['setStderrFunc'] = Engine.prototype.setStderrFunc
  161. return Engine;
  162. })();