Save game to indexeddb
This commit is contained in:
		
							parent
							
								
									17517a5849
								
							
						
					
					
						commit
						ad9474a6e9
					
				
					 5 changed files with 65 additions and 1 deletions
				
			
		| 
						 | 
					@ -37,6 +37,10 @@
 | 
				
			||||||
#include "filesystem.h"
 | 
					#include "filesystem.h"
 | 
				
			||||||
#include "binding.h"
 | 
					#include "binding.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __EMSCRIPTEN__
 | 
				
			||||||
 | 
					#include "emscripten.hpp"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void mrbBindingTerminate();
 | 
					void mrbBindingTerminate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MRB_FUNCTION(kernelLoadData)
 | 
					MRB_FUNCTION(kernelLoadData)
 | 
				
			||||||
| 
						 | 
					@ -82,10 +86,23 @@ MRB_FUNCTION(kernelSaveData)
 | 
				
			||||||
	return mrb_nil_value();
 | 
						return mrb_nil_value();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MRB_FUNCTION(kernelSaveAsync)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						mrb_value obj;
 | 
				
			||||||
 | 
						const char *filename;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mrb_get_args(mrb, "z", &filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						save_file_async_js(filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return mrb_nil_value();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void kernelBindingInit(mrb_state *mrb)
 | 
					void kernelBindingInit(mrb_state *mrb)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	RClass *module = mrb->kernel_module;
 | 
						RClass *module = mrb->kernel_module;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mrb_define_module_function(mrb, module, "load_data", kernelLoadData, MRB_ARGS_REQ(1));
 | 
						mrb_define_module_function(mrb, module, "load_data", kernelLoadData, MRB_ARGS_REQ(1));
 | 
				
			||||||
	mrb_define_module_function(mrb, module, "save_data", kernelSaveData, MRB_ARGS_REQ(2));
 | 
						mrb_define_module_function(mrb, module, "save_data", kernelSaveData, MRB_ARGS_REQ(2));
 | 
				
			||||||
 | 
						mrb_define_module_function(mrb, module, "save_file_async", kernelSaveAsync, MRB_ARGS_REQ(1));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										7
									
								
								js/localforage.min.js
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								js/localforage.min.js
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										36
									
								
								shell.html
									
										
									
									
									
								
							
							
						
						
									
										36
									
								
								shell.html
									
										
									
									
									
								
							| 
						 | 
					@ -3,6 +3,8 @@
 | 
				
			||||||
  <head>
 | 
					  <head>
 | 
				
			||||||
    <meta charset="utf-8">
 | 
					    <meta charset="utf-8">
 | 
				
			||||||
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 | 
					    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 | 
				
			||||||
 | 
					    <script src="js/localforage.min.js"></script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <title>MKXP</title>
 | 
					    <title>MKXP</title>
 | 
				
			||||||
    <style>
 | 
					    <style>
 | 
				
			||||||
    	body {
 | 
					    	body {
 | 
				
			||||||
| 
						 | 
					@ -100,9 +102,41 @@
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <script type='text/javascript'>
 | 
					    <script type='text/javascript'>
 | 
				
			||||||
 | 
					      var namespace = 'kne';
 | 
				
			||||||
 | 
					      window.saveFile = function(filename) {
 | 
				
			||||||
 | 
					          const buf = FS.readFile('/game/' + filename);
 | 
				
			||||||
 | 
					          const b64 = btoa(String.fromCharCode.apply(null, buf));
 | 
				
			||||||
 | 
					          localforage.setItem(namespace + filename, b64);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          localforage.getItem(namespace, function(err, res) {
 | 
				
			||||||
 | 
					              if (err || !res) res = {};
 | 
				
			||||||
 | 
					              res[filename] = 1;
 | 
				
			||||||
 | 
					              localforage.setItem(namespace, res);
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      var loadFiles = function() {
 | 
				
			||||||
 | 
					          localforage.getItem(namespace, function(err, res) {
 | 
				
			||||||
 | 
					              if (err || !res) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              const keys = Object.keys(res);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              console.log('Locally stored savefiles', keys);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              keys.forEach((key) => {
 | 
				
			||||||
 | 
					                  localforage.getItem(namespace + key, (err, res) => {
 | 
				
			||||||
 | 
					                      if (err) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                      const buf = new Uint8Array(atob(res).split('').map((c) => c.charCodeAt(0)));
 | 
				
			||||||
 | 
					                      FS.writeFile('/game/' + key, buf);
 | 
				
			||||||
 | 
					                  });
 | 
				
			||||||
 | 
					              });
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      var Module = {
 | 
					      var Module = {
 | 
				
			||||||
        preRun: [],
 | 
					        preRun: [],
 | 
				
			||||||
        postRun: [],
 | 
					        postRun: [loadFiles],
 | 
				
			||||||
        print: (function() {
 | 
					        print: (function() {
 | 
				
			||||||
          return function(text) {
 | 
					          return function(text) {
 | 
				
			||||||
            console.log(text);
 | 
					            console.log(text);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,5 +59,9 @@ void load_file_async(const char * filename) {
 | 
				
			||||||
	shState->fileSystem().openRead(handler, filename);
 | 
						shState->fileSystem().openRead(handler, filename);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EM_JS(void, save_file_async_js, (const char* fullPathC), {
 | 
				
			||||||
 | 
						if (window.saveFile) window.saveFile(UTF8ToString(fullPathC));
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,6 +8,8 @@ extern "C" {
 | 
				
			||||||
	void load_file_async_js(const char* fullPathC);
 | 
						void load_file_async_js(const char* fullPathC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void load_file_async(const char* filename);
 | 
						void load_file_async(const char* filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void save_file_async_js(const char* fullPathC);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue