{"version":3,"sources":["jsdelivr-header.js","/npm/gbdkjs@2.1.9/index.js"],"names":[],"mappings":"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","file":"/npm/gbdkjs@2.1.9/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/gbdkjs@2.1.9/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","(function(define) {\n  define(\"GBDKJS\", function(require, exports) {\n    const SCREEN_WIDTH = 160;\n    const SCREEN_HEIGHT = 144;\n    const BUFFER_WIDTH = 256;\n    const BUFFER_HEIGHT = 256;\n\n    const J_LEFT = 0x02;\n    const J_RIGHT = 0x01;\n    const J_UP = 0x04;\n    const J_DOWN = 0x08;\n    const J_START = 0x80;\n    const J_SELECT = 0x40;\n    const J_A = 0x10;\n    const J_B = 0x20;\n\n    const JS_KEY_UP = 38;\n    const JS_KEY_LEFT = 37;\n    const JS_KEY_RIGHT = 39;\n    const JS_KEY_DOWN = 40;\n    const JS_KEY_ENTER = 13;\n    const JS_KEY_ALT = 18;\n    const JS_KEY_CTRL = 17;\n    const JS_KEY_SHIFT = 16;\n\n    const S_PALETTE = 0x10;\n    const S_FLIPX = 0x20;\n    const S_FLIPY = 0x40;\n\n    const SHOW_SPRITES = 0x02;\n\n    const TILE_SIZE = 8;\n    const DATA_SIZE = 256;\n    const NUM_BKG_TILES = 256;\n    const NUM_TILES = 384;\n    const BUFFER_SIZE = 1024;\n    const MAX_SPRITES = 40;\n\n    const COLORS = [\n      {\n        r: 224,\n        g: 248,\n        b: 208,\n        a: 255\n      },\n      {\n        r: 136,\n        g: 192,\n        b: 112,\n        a: 255\n      },\n      {\n        r: 48,\n        g: 104,\n        b: 80,\n        a: 255\n      },\n      {\n        r: 8,\n        g: 24,\n        b: 32,\n        a: 255\n      },\n      {\n        r: 0,\n        g: 0,\n        b: 0,\n        a: 0\n      }\n    ];\n\n    function uint(a) {\n      return (a + 256) & 255;\n    }\n\n    var GBDK = function() {\n      // Registers -------------------------------------------------------------\n\n      var LYC_REG = 0;\n      Object.defineProperty(this, \"LYC_REG\", {\n        get: function() {\n          return LYC_REG;\n        },\n        set: function(value) {\n          LYC_REG = (256 + value) % 256;\n        }\n      });\n\n      var SCX_REG = 0;\n      Object.defineProperty(this, \"SCX_REG\", {\n        get: function() {\n          return SCX_REG;\n        },\n        set: function(value) {\n          SCX_REG = (256 + value) % 256;\n        }\n      });\n\n      var SCY_REG = 0;\n      Object.defineProperty(this, \"SCY_REG\", {\n        get: function() {\n          return SCY_REG;\n        },\n        set: function(value) {\n          SCY_REG = (256 + value) % 256;\n        }\n      });\n\n      var WX_REG = 0;\n      Object.defineProperty(this, \"WX_REG\", {\n        get: function() {\n          return WX_REG;\n        },\n        set: function(value) {\n          WX_REG = (256 + value) % 256;\n        }\n      });\n\n      var WY_REG = 0;\n      Object.defineProperty(this, \"WY_REG\", {\n        get: function() {\n          return WY_REG;\n        },\n        set: function(value) {\n          WY_REG = (256 + value) % 256;\n        }\n      });\n\n      var LCDC_REG = 0;\n      Object.defineProperty(this, \"LCDC_REG\", {\n        get: function() {\n          return LCDC_REG;\n        },\n        set: function(value) {\n          LCDC_REG = (256 + value) % 256;\n        }\n      });\n\n      var BGP_REG = 0;\n      Object.defineProperty(this, \"BGP_REG\", {\n        get: function() {\n          return BGP_REG;\n        },\n        set: function(value) {\n          var i;\n          if (value !== BGP_REG) {\n            bkg_palette = [\n              colors[value & 3],\n              colors[(value >> 2) & 3],\n              colors[(value >> 4) & 3],\n              colors[value >> 6]\n            ];\n            for (i = 0; i < NUM_BKG_TILES; i++) {\n              gfx_data_dirty[i] = true;\n            }\n            for (i = 0; i < BUFFER_SIZE; i++) {\n              bkg_tiles_dirty[i] = true;\n              win_tiles_dirty[i] = true;\n            }\n            BGP_REG = value;\n          }\n        }\n      });\n\n      var OBP0_REG = 0;\n      Object.defineProperty(this, \"OBP0_REG\", {\n        get: function() {\n          return OBP0_REG;\n        },\n        set: function(value) {\n          var i;\n          if (value !== OBP0_REG) {\n            OBP0_REG = value;\n            obp0_palette = [\n              colors[4],\n              colors[(value >> 2) & 3],\n              colors[(value >> 4) & 3],\n              colors[value >> 6]\n            ];\n            for (i = 128; i < NUM_TILES; i++) {\n              gfx_data_dirty[i] = true;\n            }\n          }\n        }\n      });\n\n      var OBP1_REG = 0;\n      Object.defineProperty(this, \"OBP1_REG\", {\n        get: function() {\n          return OBP1_REG;\n        },\n        set: function(value) {\n          var i;\n          if (value !== OBP1_REG) {\n            OBP1_REG = value;\n            obp1_palette = [\n              colors[4],\n              colors[(value >> 2) & 3],\n              colors[(value >> 4) & 3],\n              colors[value >> 6]\n            ];\n            for (i = 128; i < NUM_TILES; i++) {\n              gfx_data_dirty[i] = true;\n            }\n          }\n        }\n      });\n\n      this.debugValues = {};\n\n      // Init Canvases ---------------------------------------------------------\n\n      var canvas = document.createElement(\"canvas\");\n      var ctx = canvas.getContext(\"2d\");\n      canvas.width = SCREEN_WIDTH;\n      canvas.height = SCREEN_HEIGHT;\n\n      var overflow_canvas = document.createElement(\"canvas\");\n      var overflow_ctx = overflow_canvas.getContext(\"2d\");\n      overflow_canvas.width = BUFFER_WIDTH;\n      overflow_canvas.height = BUFFER_HEIGHT;\n\n      var buffer_canvas = document.createElement(\"canvas\");\n      var buffer_ctx = buffer_canvas.getContext(\"2d\");\n      buffer_canvas.width = BUFFER_WIDTH;\n      buffer_canvas.height = BUFFER_HEIGHT;\n\n      var window_canvas = document.createElement(\"canvas\");\n      var window_ctx = window_canvas.getContext(\"2d\");\n      window_canvas.width = BUFFER_WIDTH;\n      window_canvas.height = BUFFER_HEIGHT;\n\n      var buffer_debug_canvas = document.createElement(\"canvas\");\n      var buffer_debug_ctx = buffer_debug_canvas.getContext(\"2d\");\n      buffer_debug_canvas.width = BUFFER_WIDTH;\n      buffer_debug_canvas.height = BUFFER_HEIGHT;\n\n      var window_debug_canvas = document.createElement(\"canvas\");\n      var window_debug_ctx = window_debug_canvas.getContext(\"2d\");\n      window_debug_canvas.width = BUFFER_WIDTH;\n      window_debug_canvas.height = BUFFER_HEIGHT;\n\n      var bkg_data_canvas = document.createElement(\"canvas\");\n      var bkg_data_ctx = bkg_data_canvas.getContext(\"2d\");\n      bkg_data_canvas.width = TILE_SIZE * 16;\n      bkg_data_canvas.height = TILE_SIZE * 16;\n\n      var sprite_data_canvas = document.createElement(\"canvas\");\n      var sprite_data_ctx = sprite_data_canvas.getContext(\"2d\");\n      sprite_data_canvas.width = TILE_SIZE * 16;\n      sprite_data_canvas.height = TILE_SIZE * 32;\n\n      var sprite_canvas = document.createElement(\"canvas\");\n      var sprite_ctx = sprite_canvas.getContext(\"2d\");\n      sprite_canvas.width = TILE_SIZE * 40;\n      sprite_canvas.height = TILE_SIZE * 2;\n\n      // Init palettes\n      var colors = [].concat(COLORS);\n      var bkg_palette = colors;\n      var obp0_palette = [colors[4], colors[0], colors[1], colors[3]];\n      var obp1_palette = [colors[0], colors[1], colors[3], colors[3]];\n\n      var joypad = 0;\n\n      var lcd_fn = null;\n      var vbl_fns = [];\n      var bank = 0;\n\n      var bkg_tiles = new Uint8Array(BUFFER_SIZE);\n      var bkg_tiles_dirty = new Uint8Array(BUFFER_SIZE);\n      var win_tiles = new Uint8Array(BUFFER_SIZE);\n      var win_tiles_dirty = new Uint8Array(BUFFER_SIZE);\n      var gfx_data = new Uint8Array(DATA_SIZE * 24);\n      var gfx_data_dirty = new Uint8Array(NUM_TILES);\n\n      var tile_image_data = ctx.createImageData(TILE_SIZE, TILE_SIZE);\n      var tile_image_data_data = tile_image_data.data;\n\n      var sorted_sprites = new Uint8Array(MAX_SPRITES);\n      var sprite_tiles = new Uint8Array(MAX_SPRITES);\n      var sprite_x = new Uint8Array(MAX_SPRITES);\n      var sprite_y = new Uint8Array(MAX_SPRITES);\n      var sprite_props = new Uint8Array(MAX_SPRITES);\n      for (var i = 0; i < MAX_SPRITES; i++) {\n        sorted_sprites[i] = i;\n      }\n      for (var i = 0; i < BUFFER_SIZE; i++) {\n        bkg_tiles_dirty[i] = true;\n        win_tiles_dirty[i] = true;\n      }\n\n      // Input listeners -------------------------------------------------------\n\n      window.onkeydown = function(e) {\n        if (e.keyCode === JS_KEY_LEFT) {\n          joypad |= J_LEFT;\n        } else if (e.keyCode === JS_KEY_RIGHT) {\n          joypad |= J_RIGHT;\n        } else if (e.keyCode === JS_KEY_UP) {\n          joypad |= J_UP;\n        } else if (e.keyCode === JS_KEY_DOWN) {\n          joypad |= J_DOWN;\n        } else if (e.keyCode === JS_KEY_ENTER) {\n          joypad |= J_START;\n        } else if (e.keyCode === JS_KEY_ALT) {\n          joypad |= J_A;\n        } else if (e.keyCode === JS_KEY_CTRL) {\n          joypad |= J_B;\n        } else if (e.keyCode === JS_KEY_SHIFT) {\n          joypad |= J_SELECT;\n        } else {\n          return;\n        }\n        e.preventDefault();\n      };\n\n      window.onkeyup = function(e) {\n        if (e.keyCode === JS_KEY_LEFT) {\n          joypad &= ~J_LEFT;\n        } else if (e.keyCode === JS_KEY_RIGHT) {\n          joypad &= ~J_RIGHT;\n        } else if (e.keyCode === JS_KEY_UP) {\n          joypad &= ~J_UP;\n        } else if (e.keyCode === JS_KEY_DOWN) {\n          joypad &= ~J_DOWN;\n        } else if (e.keyCode === JS_KEY_ENTER) {\n          joypad &= ~J_START;\n        } else if (e.keyCode === JS_KEY_ALT) {\n          joypad &= ~J_A;\n        } else if (e.keyCode === JS_KEY_CTRL) {\n          joypad &= ~J_B;\n        } else if (e.keyCode === JS_KEY_SHIFT) {\n          joypad &= ~J_SELECT;\n        } else {\n          return;\n        }\n        e.preventDefault();\n      };\n\n      // Private render methods ------------------------------------------------\n\n      function draw_tile_data(ctx, x, y, tile, data, palette) {\n        var t = tile;\n        for (var i = 0; i < 16; i += 2) {\n          for (var j = 0; j < 8; j++) {\n            var mask = Math.pow(2, j);\n            var index =\n              (data[16 * t + i] & mask ? 1 : 0) +\n              (data[16 * t + i + 1] & mask ? 2 : 0);\n            var pixelIndex = 4 * (7 - j + 8 * (i / 2));\n            tile_image_data_data[pixelIndex] = palette[index].r;\n            tile_image_data_data[pixelIndex + 1] = palette[index].g;\n            tile_image_data_data[pixelIndex + 2] = palette[index].b;\n            tile_image_data_data[pixelIndex + 3] = palette[index].a;\n          }\n        }\n        ctx.putImageData(tile_image_data, x * TILE_SIZE, y * TILE_SIZE);\n      }\n\n      function draw_tile_canvas(ctx, x, y, tile, canvas) {\n        var ty = ((tile / 16) | 0) * TILE_SIZE;\n        var tx = tile % 16 * TILE_SIZE;\n        ctx.drawImage(\n          canvas,\n          tx,\n          ty,\n          TILE_SIZE,\n          TILE_SIZE,\n          x * TILE_SIZE,\n          y * TILE_SIZE,\n          TILE_SIZE,\n          TILE_SIZE\n        );\n      }\n\n      function redraw_gfx_tiles() {\n        var i;\n        for (i = 0; i < 128; i++) {\n          // bkg_tiles\n          if (gfx_data_dirty[i]) {\n            draw_tile_data(\n              bkg_data_ctx,\n              i % 16,\n              (i / 16) | 0,\n              i,\n              gfx_data,\n              bkg_palette\n            );\n            gfx_data_dirty[i] = false;\n          }\n          // sprite_tiles\n          if (gfx_data_dirty[256 + i]) {\n            // obp0\n            draw_tile_data(\n              sprite_data_ctx,\n              ((i / 2) | 0) % 16,\n              2 * ((i / 32) | 0) + i % 2,\n              256 + i,\n              gfx_data,\n              obp0_palette\n            );\n            // obp1\n            draw_tile_data(\n              sprite_data_ctx,\n              ((i / 2) | 0) % 16,\n              16 + (2 * ((i / 32) | 0) + i % 2),\n              256 + i,\n              gfx_data,\n              obp1_palette\n            );\n            gfx_data_dirty[256 + i] = false;\n          }\n        }\n        // shared sprite and bkg_tiles\n        for (i = 128; i < 256; i++) {\n          if (gfx_data_dirty[i]) {\n            draw_tile_data(\n              bkg_data_ctx,\n              i % 16,\n              (i / 16) | 0,\n              i,\n              gfx_data,\n              bkg_palette\n            );\n            // obp0\n            draw_tile_data(\n              sprite_data_ctx,\n              ((i / 2) | 0) % 16,\n              2 * ((i / 32) | 0) + i % 2,\n              i,\n              gfx_data,\n              obp0_palette\n            );\n            // obp1\n            draw_tile_data(\n              sprite_data_ctx,\n              ((i / 2) | 0) % 16,\n              16 + (2 * ((i / 32) | 0) + i % 2),\n              i,\n              gfx_data,\n              obp1_palette\n            );\n            gfx_data_dirty[i] = false;\n          }\n        }\n      }\n\n      const redraw_buffer_canvas = function() {\n        var i;\n        for (i = 0; i < BUFFER_SIZE; i++) {\n          if (bkg_tiles_dirty[i]) {\n            draw_tile_canvas(\n              buffer_ctx,\n              i % 32,\n              (i / 32) | 0,\n              bkg_tiles[i],\n              bkg_data_canvas\n            );\n            bkg_tiles_dirty[i] = false;\n          }\n        }\n      };\n\n      const redraw_window_canvas = function() {\n        var i;\n        for (i = 0; i < BUFFER_SIZE; i++) {\n          if (win_tiles_dirty[i]) {\n            draw_tile_canvas(\n              window_ctx,\n              i % 32,\n              (i / 32) | 0,\n              win_tiles[i],\n              bkg_data_canvas\n            );\n            win_tiles_dirty[i] = false;\n          }\n        }\n      };\n\n      const redraw_sprite_canvas = function() {\n        sprite_canvas.width = sprite_canvas.width;\n\n        // Draw sprites\n        for (var si = 0; si < MAX_SPRITES; si++) {\n          var i = sorted_sprites[si];\n          var t = sprite_tiles[i];\n          sprite_ctx.save();\n          sprite_ctx.translate(si * TILE_SIZE, 0);\n          if (sprite_props[i] & S_FLIPX) {\n            sprite_ctx.scale(-1, 1);\n            sprite_ctx.translate(-8, 0);\n          }\n          if (sprite_props[i] & S_FLIPY) {\n            sprite_ctx.scale(1, -1);\n            sprite_ctx.translate(0, -16);\n          }\n\n          var palette_offset = sprite_props[i] & S_PALETTE ? 128 : 0;\n          sprite_ctx.drawImage(\n            sprite_data_canvas,\n            ((t / 2) | 0) % 16 * 8,\n            palette_offset + ((t / 32) | 0) * 16,\n            8,\n            16,\n            0,\n            0,\n            8,\n            16\n          );\n          sprite_ctx.restore();\n        }\n      };\n\n      function render() {\n        canvas.width = canvas.width;\n\n        redraw_gfx_tiles();\n        redraw_buffer_canvas();\n        redraw_window_canvas();\n        redraw_sprite_canvas();\n\n        // Draw screen\n        for (var ly = 0; ly < 144; ly++) {\n          if ((ly === LYC_REG || LYC_REG === 255) && lcd_fn) {\n            Module.dynCall_v(lcd_fn);\n          }\n          for (var xi = -1; xi < 2; xi++) {\n            ctx.drawImage(\n              buffer_canvas,\n              0,\n              (SCY_REG + ly) % 256,\n              BUFFER_WIDTH,\n              1,\n              -(xi * BUFFER_WIDTH) - SCX_REG,\n              ly,\n              BUFFER_WIDTH,\n              1\n            );          \n          }\n        }\n\n        // Draw screen overflow\n        for (var ly = 0; ly < 256; ly++) {\n          for (var xi = -1; xi < 2; xi++) {\n            overflow_ctx.drawImage(\n              buffer_canvas,\n               0,\n              (SCY_REG + (ly - 48)) % 256,\n              BUFFER_WIDTH,\n              1,\n              -(xi * BUFFER_WIDTH) - SCX_REG + 48,\n              ly,\n              BUFFER_WIDTH,\n              1\n            );            \n          }\n        }\n\n        buffer_debug_ctx.drawImage(buffer_canvas, 0, 0);\n        buffer_debug_ctx.strokeStyle = \"red\";\n        buffer_debug_ctx.lineWidth = 2;\n        buffer_debug_ctx.strokeRect(\n          SCX_REG - 1,\n          SCY_REG - 1,\n          SCREEN_WIDTH + 2,\n          SCREEN_HEIGHT + 2\n        );\n        buffer_debug_ctx.strokeRect(\n          SCX_REG - 1,\n          SCY_REG - 1 - BUFFER_WIDTH,\n          SCREEN_WIDTH + 2,\n          SCREEN_HEIGHT + 2\n        );\n        buffer_debug_ctx.strokeRect(\n          SCX_REG - 1 - BUFFER_WIDTH,\n          SCY_REG - 1,\n          SCREEN_WIDTH + 2,\n          SCREEN_HEIGHT + 2\n        );\n        buffer_debug_ctx.strokeRect(\n          SCX_REG - 1 - BUFFER_WIDTH,\n          SCY_REG - 1 - BUFFER_WIDTH,\n          SCREEN_WIDTH + 2,\n          SCREEN_HEIGHT + 2\n        );\n\n        // Draw window\n        ctx.drawImage(\n          window_canvas,\n          0,\n          0,\n          BUFFER_WIDTH,\n          BUFFER_HEIGHT,\n          WX_REG - 7,\n          WY_REG,\n          BUFFER_WIDTH,\n          BUFFER_HEIGHT\n        );\n        window_debug_ctx.drawImage(window_canvas, 0, 0);\n        window_debug_ctx.strokeStyle = \"red\";\n        window_debug_ctx.lineWidth = 2;\n        window_debug_ctx.strokeRect(\n          -1,\n          -1,\n          SCREEN_WIDTH + 2 + 8 - WX_REG,\n          SCREEN_HEIGHT + 2 - WY_REG\n        );\n\n        // Draw sprites\n        if (LCDC_REG & SHOW_SPRITES) {\n          for (var si = MAX_SPRITES - 1; si >= 0; si--) {\n            var i = sorted_sprites[si];\n            ctx.drawImage(\n              sprite_canvas,\n              i * 8,\n              0,\n              8,\n              16,\n              sprite_x[i] - 8,\n              sprite_y[i] - 16,\n              8,\n              16\n            );\n            overflow_ctx.drawImage(\n              sprite_canvas,\n              i * 8,\n              0,\n              8,\n              16,\n              (sprite_x[i] - 8 + 48) % BUFFER_WIDTH,\n              (sprite_y[i] - 16 + 48) % BUFFER_HEIGHT,\n              8,\n              16\n            );\n          }\n        }\n        for(var i=0; i<vbl_fns.length; i++) {\n          Module.dynCall_v(vbl_fns[i]);\n        }\n\n        overflow_ctx.strokeStyle = \"red\";\n        overflow_ctx.lineWidth = 2;\n        overflow_ctx.strokeRect(\n          48 - 1,\n          48 - 1,\n          SCREEN_WIDTH + 2,\n          SCREEN_HEIGHT + 2\n        );  \n      }\n\n      // Public Methods --------------------------------------------------------\n\n      this.get_canvas = function() {\n        return canvas;\n      };\n\n      this.get_overflow_canvas = function() {\n        return overflow_canvas;\n      };\n\n      this.get_buffer_canvas = function() {\n        return buffer_debug_canvas;\n      };\n\n      this.get_window_canvas = function() {\n        return window_debug_canvas;\n      };\n\n      this.get_bkg_data_canvas = function() {\n        return bkg_data_canvas;\n      };\n\n      this.get_sprite_data_canvas = function() {\n        return sprite_data_canvas;\n      };\n\n      this.get_sprite_canvas = function() {\n        return sprite_canvas;\n      };\n\n      this.set_colors = function(newColors) {\n        colors = [].concat(newColors);\n      };\n\n      this.assert_bank = function(testBank) {\n        return testBank === 0 || testBank === bank;\n      };\n\n      this.get_bkg_tiles = function() {\n        return bkg_tiles;\n      };\n\n      this.get_win_tiles = function() {\n        return win_tiles;\n      };\n\n      this.get_sprite_tiles = function() {\n        return sprite_tiles;\n      };\n\n      this.get_sprite_props = function() {\n        return sprite_props;\n      };\n\n      this.set_joypad = function(joy) {\n        joypad = joy;\n      }\n\n      // GBDK API --------------------------------------------------------------\n\n      this.SWITCH_ROM_MBC5 = function(newBank) {\n        bank = newBank;\n      };\n\n      this.wait_vbl_done = function() {\n        render();\n      };\n\n      this.joypad = function() {\n        return joypad;\n      };\n\n      this.set_bkg_data = function(first_tile, nb_tiles, data) {\n        var i, d, ptr;\n        for (i = 0; i < nb_tiles; i++) {\n          for (d = 0; d < 16; d++) {\n            ptr = (d + (i + first_tile) * 16) % 4096;\n            gfx_data[ptr] = data[i * 16 + d];\n            gfx_data_dirty[i + first_tile] = true;\n          }\n        }\n      };\n\n      this.set_sprite_data = function(first_tile, nb_tiles, data) {\n        var i, d, ptr;\n        for (i = 0; i < nb_tiles; i++) {\n          var offset = 256;\n          if (first_tile + i >= 128) {\n            offset = 0;\n          }\n          for (d = 0; d < 16; d++) {\n            ptr = 16 * offset + d + (i + first_tile) * 16;\n            gfx_data[ptr] = data[i * 16 + d];\n            gfx_data_dirty[offset + i + first_tile] = true;\n          }\n        }\n      };\n\n      this.set_bkg_tiles = function(x, y, w, h, tiles) {\n        var ptr;\n        for (var yi = 0; yi < h; yi++) {\n          for (var xi = 0; xi < w; xi++) {\n            ptr = x + xi + (y + yi) * 32;\n            bkg_tiles[ptr] = tiles[xi + yi * w];\n            bkg_tiles_dirty[ptr] = true;\n          }\n        }\n      };\n\n      this.set_win_tiles = function(x, y, w, h, tiles) {\n        var ptr;\n        for (var yi = 0; yi < h; yi++) {\n          for (var xi = 0; xi < w; xi++) {\n            ptr = x + xi + (y + yi) * 32;\n            win_tiles[ptr] = tiles[xi + yi * w];\n            win_tiles_dirty[ptr] = true;\n          }\n        }\n      };\n\n      this.set_sprite_prop = function(nb, prop) {\n        sprite_props[nb] = prop;\n      };\n\n      this.move_sprite = function(nb, x, y) {\n        sprite_x[nb] = x;\n        sprite_y[nb] = y;\n      };\n\n      this.set_sprite_tile = function(nb, tile) {\n        sprite_tiles[nb] = tile;\n      };\n\n      this.add_LCD = function(int_handler) {\n        LYC_REG = 0;\n        lcd_fn = int_handler;\n      };\n\n      this.remove_LCD = function() {\n        lcd_fn = null;\n      };\n\n      this.add_VBL = function(int_handler) {\n        vbl_fns.push(int_handler);\n      };      \n\n      this.disable_interrupts = function() {};\n\n      this.enable_interrupts = function() {};\n    };\n\n    exports.GBDK = GBDK;\n    exports.uint = uint;\n  });\n})(\n  typeof define === \"function\" && define.amd\n    ? define\n    : function(id, factory) {\n        if (typeof exports !== \"undefined\") {\n          //commonjs\n          factory(require, exports);\n        } else {\n          factory(function(value) {\n            return window[value];\n          }, (window[id] = {}));\n        }\n      }\n);\n"]}