diff --git a/extra/shell.html b/extra/shell.html
index a4f0c76..acfd3a5 100644
--- a/extra/shell.html
+++ b/extra/shell.html
@@ -270,6 +270,16 @@
             console.error("An error occured!")
         };
 
+        function preloadList(jsonArray) {
+            jsonArray.forEach((f) => {
+                const url = mapping[f.toLowerCase().replace(new RegExp("\\.[^/.]+$"), "")];
+                if (!url) return;
+
+                // Preload the asset
+                fetch('gameasync/' + url).then().catch();
+            });
+        }
+
         window.fileLoadedAsync = function(file) {
             document.title = wTitle;
 
@@ -281,13 +291,7 @@
                 })
                 .then(function(jsonResponse) {
                     setTimeout(() => {
-                        jsonResponse.forEach((f) => {
-                            const url = mapping[f.toLowerCase().replace(new RegExp("\\.[^/.]+$"), "")];
-                            if (!url) return;
-
-                            // Preload the asset
-                                fetch('gameasync/' + url).then().catch();
-                        });
+                        preloadList(jsonResponse);
                     }, 200);
                 });
         };
@@ -343,9 +347,27 @@
         }
 
         document.title = wTitle;
-    </script>
 
-    <script>
+        // Load important files
+        preloadList([
+            'rgss.rb',
+            'data/scripts',
+            'data/actors',
+            'data/classes',
+            'data/skills',
+            'data/items',
+            'data/weapons',
+            'data/armors',
+            'data/enemies',
+            'data/troops',
+            'data/states',
+            'data/animations',
+            'data/tilesets',
+            'data/commonevents',
+            'data/system',
+            'data/mapinfos',
+        ]);
+
         // Load wasm then initialize
         setTimeout(() => {
             getLazyAsset('mkxp.wasm', 'Game engine', () => {
@@ -353,108 +375,107 @@
                 s.setAttribute('src', 'mkxp.js');
                 document.body.appendChild(s);
             });
-        }, 500);
+        }, 200);
 
-    function simulateKeyEvent(eventType, keyCode, charCode) {
-        var e = document.createEventObject ? document.createEventObject() : document.createEvent("Events");
-        if (e.initEvent) e.initEvent(eventType, true, true);
+        function simulateKeyEvent(eventType, keyCode, charCode) {
+            var e = document.createEventObject ? document.createEventObject() : document.createEvent("Events");
+            if (e.initEvent) e.initEvent(eventType, true, true);
 
-        e.keyCode = keyCode;
-        e.which = keyCode;
-        e.charCode = charCode;
+            e.keyCode = keyCode;
+            e.which = keyCode;
+            e.charCode = charCode;
 
-        // Dispatch directly to Emscripten's html5.h API (use this if page uses emscripten/html5.h event handling):
-        if (typeof JSEvents !== 'undefined' && JSEvents.eventHandlers && JSEvents.eventHandlers.length > 0) {
-            for(var i = 0; i < JSEvents.eventHandlers.length; ++i) {
-                if ((JSEvents.eventHandlers[i].target == Module['canvas'] || JSEvents.eventHandlers[i].target == window)
-                    && JSEvents.eventHandlers[i].eventTypeString == eventType) {
-                    JSEvents.eventHandlers[i].handlerFunc(e);
+            // Dispatch directly to Emscripten's html5.h API (use this if page uses emscripten/html5.h event handling):
+            if (typeof JSEvents !== 'undefined' && JSEvents.eventHandlers && JSEvents.eventHandlers.length > 0) {
+                for(var i = 0; i < JSEvents.eventHandlers.length; ++i) {
+                    if ((JSEvents.eventHandlers[i].target == Module['canvas'] || JSEvents.eventHandlers[i].target == window)
+                        && JSEvents.eventHandlers[i].eventTypeString == eventType) {
+                        JSEvents.eventHandlers[i].handlerFunc(e);
+                    }
                 }
+            } else {
+                // Dispatch to browser for real (use this if page uses SDL or something else for event handling):
+                Module['canvas'].dispatchEvent ? Module['canvas'].dispatchEvent(e) : Module['canvas'].fireEvent("on" + eventType, e);
             }
-        } else {
-            // Dispatch to browser for real (use this if page uses SDL or something else for event handling):
-            Module['canvas'].dispatchEvent ? Module['canvas'].dispatchEvent(e) : Module['canvas'].fireEvent("on" + eventType, e);
         }
-    }
 
-    // Mappings
-    const keyMap = {};
-    const keysDown = {};
+        // Mappings
+        const keyMap = {};
+        const keysDown = {};
 
-    /** Add virtual key binding */
-    function bindKey(elem, key) {
-        keyMap[elem] = key;
-        const ne = document.getElementById(elem);
+        /** Add virtual key binding */
+        function bindKey(elem, key) {
+            keyMap[elem] = key;
+            const ne = document.getElementById(elem);
 
-        ne.addEventListener('touchstart', function(e) {
-            e.preventDefault();
-            simulateKeyEvent('keydown', key);
-            keysDown[e.target.id] = elem;
-        });
-        ne.addEventListener('touchend', function(e) {
-            e.preventDefault();
-            if (keysDown[e.target.id] && keyMap[keysDown[e.target.id]]) {
-                simulateKeyEvent('keyup', keyMap[keysDown[e.target.id]]);
-            }
-            keysDown[e.target.id] = 0;
-        });
-
-        ne.addEventListener('touchmove', function(event) {
-            const myLocation = event.changedTouches[0];
-            const realTarget = document.elementFromPoint(myLocation.clientX, myLocation.clientY).id;
-            const origTarget = keysDown[myLocation.target.id];
-
-            if (origTarget !== realTarget) {
-                if (origTarget) {
-                    simulateKeyEvent('keyup', keyMap[origTarget]);
-                    keysDown[myLocation.target.id] = 0;
+            ne.addEventListener('touchstart', function(e) {
+                e.preventDefault();
+                simulateKeyEvent('keydown', key);
+                keysDown[e.target.id] = elem;
+            });
+            ne.addEventListener('touchend', function(e) {
+                e.preventDefault();
+                if (keysDown[e.target.id] && keyMap[keysDown[e.target.id]]) {
+                    simulateKeyEvent('keyup', keyMap[keysDown[e.target.id]]);
                 }
-                if (keyMap[realTarget]) {
-                    simulateKeyEvent('keydown', keyMap[realTarget]);
-                    keysDown[myLocation.target.id] = realTarget;
+                keysDown[e.target.id] = 0;
+            });
+
+            ne.addEventListener('touchmove', function(event) {
+                const myLocation = event.changedTouches[0];
+                const realTarget = document.elementFromPoint(myLocation.clientX, myLocation.clientY).id;
+                const origTarget = keysDown[myLocation.target.id];
+
+                if (origTarget !== realTarget) {
+                    if (origTarget) {
+                        simulateKeyEvent('keyup', keyMap[origTarget]);
+                        keysDown[myLocation.target.id] = 0;
+                    }
+                    if (keyMap[realTarget]) {
+                        simulateKeyEvent('keydown', keyMap[realTarget]);
+                        keysDown[myLocation.target.id] = realTarget;
+                    }
                 }
+            });
+        }
+
+        function is_touch_device() {
+            try {
+                document.createEvent("TouchEvent");
+                return true;
+            } catch (e) {
+                return false;
             }
-        });
-    }
-
-    function is_touch_device() {
-        try {
-            document.createEvent("TouchEvent");
-            return true;
-        } catch (e) {
-            return false;
         }
-    }
 
-    if (!is_touch_device()) {
-        document.getElementById('dpad').style.display = 'none';
-        document.getElementById('apad').style.display = 'none';
-    }
-
-    // Add all bindings
-    bindKey('d-up', 38);
-    bindKey('d-right', 39);
-    bindKey('d-down', 40);
-    bindKey('d-left', 37);
-    bindKey('ap-c', 67);
-    bindKey('ap-b', 88);
-    bindKey('ap-a', 90);
-    bindKey('ap-ka', 65);
-
-    const resize = function() {
-        const el = document.getElementById('canvas');
-        if (window.innerHeight > window.innerWidth) {
-            el.style.height = 'unset';
-            el.style.width = '100%';
-        } else {
-            el.style.width = 'unset';
-            el.style.height = '100%';
+        if (!is_touch_device()) {
+            document.getElementById('dpad').style.display = 'none';
+            document.getElementById('apad').style.display = 'none';
         }
-    }
 
-    window.addEventListener('resize', resize);
-    resize();
+        // Add all bindings
+        bindKey('d-up', 38);
+        bindKey('d-right', 39);
+        bindKey('d-down', 40);
+        bindKey('d-left', 37);
+        bindKey('ap-c', 67);
+        bindKey('ap-b', 88);
+        bindKey('ap-a', 90);
+        bindKey('ap-ka', 65);
 
+        const resize = function() {
+            const el = document.getElementById('canvas');
+            if (window.innerHeight > window.innerWidth) {
+                el.style.height = 'unset';
+                el.style.width = '100%';
+            } else {
+                el.style.width = 'unset';
+                el.style.height = '100%';
+            }
+        }
+
+        window.addEventListener('resize', resize);
+        resize();
     </script>
 
     <!-- {{{ SCRIPT }}} -->