@oidoid/void 0.1.7 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/dist/public/index.js +6 -6
  2. package/dist/public/index.js.map +3 -3
  3. package/dist/public/void-v0.1.9+20260107.c0d3006.html +115 -0
  4. package/dist/src/demo/ents/clock.test.d.ts +2 -0
  5. package/dist/src/demo/ents/clock.test.d.ts.map +1 -0
  6. package/dist/src/demo/ents/clock.test.js +24 -0
  7. package/dist/src/demo/ents/clock.test.js.map +1 -0
  8. package/dist/src/demo/tsconfig.json +3 -3
  9. package/dist/src/ents/cursor.test.d.ts +2 -0
  10. package/dist/src/ents/cursor.test.d.ts.map +1 -0
  11. package/dist/src/ents/cursor.test.js +92 -0
  12. package/dist/src/ents/cursor.test.js.map +1 -0
  13. package/dist/src/ents/ent-query.test.d.ts +11 -0
  14. package/dist/src/ents/ent-query.test.d.ts.map +1 -0
  15. package/dist/src/ents/ent-query.test.js +63 -0
  16. package/dist/src/ents/ent-query.test.js.map +1 -0
  17. package/dist/src/graphics/atlas-parser.test.d.ts +2 -0
  18. package/dist/src/graphics/atlas-parser.test.d.ts.map +1 -0
  19. package/dist/src/graphics/atlas-parser.test.js +100 -0
  20. package/dist/src/graphics/atlas-parser.test.js.map +1 -0
  21. package/dist/src/graphics/cam.test.d.ts +2 -0
  22. package/dist/src/graphics/cam.test.d.ts.map +1 -0
  23. package/dist/src/graphics/cam.test.js +456 -0
  24. package/dist/src/graphics/cam.test.js.map +1 -0
  25. package/dist/src/graphics/layer.test.d.ts +2 -0
  26. package/dist/src/graphics/layer.test.d.ts.map +1 -0
  27. package/dist/src/graphics/layer.test.js +23 -0
  28. package/dist/src/graphics/layer.test.js.map +1 -0
  29. package/dist/src/graphics/renderer.test.d.ts +2 -0
  30. package/dist/src/graphics/renderer.test.d.ts.map +1 -0
  31. package/dist/src/graphics/renderer.test.js +92 -0
  32. package/dist/src/graphics/renderer.test.js.map +1 -0
  33. package/dist/src/graphics/sprite.d.ts +3 -0
  34. package/dist/src/graphics/sprite.d.ts.map +1 -1
  35. package/dist/src/graphics/sprite.js +13 -2
  36. package/dist/src/graphics/sprite.js.map +1 -1
  37. package/dist/src/graphics/sprite.test.d.ts +2 -0
  38. package/dist/src/graphics/sprite.test.d.ts.map +1 -0
  39. package/dist/src/graphics/sprite.test.js +608 -0
  40. package/dist/src/graphics/sprite.test.js.map +1 -0
  41. package/dist/src/index.d.ts.map +1 -1
  42. package/dist/src/index.js +0 -1
  43. package/dist/src/index.js.map +1 -1
  44. package/dist/src/input/context-menu.test.d.ts +2 -0
  45. package/dist/src/input/context-menu.test.d.ts.map +1 -0
  46. package/dist/src/input/context-menu.test.js +111 -0
  47. package/dist/src/input/context-menu.test.js.map +1 -0
  48. package/dist/src/input/gamepad.test.d.ts +2 -0
  49. package/dist/src/input/gamepad.test.d.ts.map +1 -0
  50. package/dist/src/input/gamepad.test.js +172 -0
  51. package/dist/src/input/gamepad.test.js.map +1 -0
  52. package/dist/src/input/input.js +10 -10
  53. package/dist/src/input/input.js.map +1 -1
  54. package/dist/src/input/input.test.d.ts +2 -0
  55. package/dist/src/input/input.test.d.ts.map +1 -0
  56. package/dist/src/input/input.test.js +1146 -0
  57. package/dist/src/input/input.test.js.map +1 -0
  58. package/dist/src/input/keyboard.test.d.ts +2 -0
  59. package/dist/src/input/keyboard.test.d.ts.map +1 -0
  60. package/dist/src/input/keyboard.test.js +159 -0
  61. package/dist/src/input/keyboard.test.js.map +1 -0
  62. package/dist/src/input/pointer.test.d.ts +2 -0
  63. package/dist/src/input/pointer.test.d.ts.map +1 -0
  64. package/dist/src/input/pointer.test.js +339 -0
  65. package/dist/src/input/pointer.test.js.map +1 -0
  66. package/dist/src/input/wheel.test.d.ts +2 -0
  67. package/dist/src/input/wheel.test.d.ts.map +1 -0
  68. package/dist/src/input/wheel.test.js +92 -0
  69. package/dist/src/input/wheel.test.js.map +1 -0
  70. package/dist/src/level/level-parser.test.d.ts +20 -0
  71. package/dist/src/level/level-parser.test.d.ts.map +1 -0
  72. package/dist/src/level/level-parser.test.js +340 -0
  73. package/dist/src/level/level-parser.test.js.map +1 -0
  74. package/dist/src/looper.d.ts.map +1 -1
  75. package/dist/src/looper.js +9 -2
  76. package/dist/src/looper.js.map +1 -1
  77. package/dist/src/looper.test.d.ts +2 -0
  78. package/dist/src/looper.test.d.ts.map +1 -0
  79. package/dist/src/looper.test.js +128 -0
  80. package/dist/src/looper.test.js.map +1 -0
  81. package/dist/src/mem/pool.test.d.ts +2 -0
  82. package/dist/src/mem/pool.test.d.ts.map +1 -0
  83. package/dist/src/mem/pool.test.js +120 -0
  84. package/dist/src/mem/pool.test.js.map +1 -0
  85. package/dist/src/random/random.test.d.ts +2 -0
  86. package/dist/src/random/random.test.d.ts.map +1 -0
  87. package/dist/src/random/random.test.js +36 -0
  88. package/dist/src/random/random.test.js.map +1 -0
  89. package/dist/src/storage/local-storage.test.d.ts +2 -0
  90. package/dist/src/storage/local-storage.test.d.ts.map +1 -0
  91. package/dist/src/storage/local-storage.test.js +105 -0
  92. package/dist/src/storage/local-storage.test.js.map +1 -0
  93. package/dist/src/test/assert.d.ts +5 -0
  94. package/dist/src/test/assert.d.ts.map +1 -0
  95. package/dist/src/test/assert.js +6 -0
  96. package/dist/src/test/assert.js.map +1 -0
  97. package/dist/src/test/device-pixel-ratio-mock.d.ts +6 -0
  98. package/dist/src/test/device-pixel-ratio-mock.d.ts.map +1 -0
  99. package/dist/src/test/device-pixel-ratio-mock.js +10 -0
  100. package/dist/src/test/device-pixel-ratio-mock.js.map +1 -0
  101. package/dist/src/test/index.d.ts +5 -0
  102. package/dist/src/test/index.d.ts.map +1 -0
  103. package/dist/src/test/index.js +5 -0
  104. package/dist/src/test/index.js.map +1 -0
  105. package/dist/src/test/navigator-gamepads-mock.d.ts +7 -0
  106. package/dist/src/test/navigator-gamepads-mock.d.ts.map +1 -0
  107. package/dist/src/test/navigator-gamepads-mock.js +14 -0
  108. package/dist/src/test/navigator-gamepads-mock.js.map +1 -0
  109. package/dist/src/test/secure-context-mock.d.ts +6 -0
  110. package/dist/src/test/secure-context-mock.d.ts.map +1 -0
  111. package/dist/src/test/secure-context-mock.js +10 -0
  112. package/dist/src/test/secure-context-mock.js.map +1 -0
  113. package/dist/src/test/test-element.d.ts +2 -0
  114. package/dist/src/test/test-element.d.ts.map +1 -0
  115. package/dist/src/test/test-element.js +8 -0
  116. package/dist/src/test/test-element.js.map +1 -0
  117. package/dist/src/test/test-event.d.ts +17 -0
  118. package/dist/src/test/test-event.d.ts.map +1 -0
  119. package/dist/src/test/test-event.js +26 -0
  120. package/dist/src/test/test-event.js.map +1 -0
  121. package/dist/src/test/tsconfig.json +30 -0
  122. package/dist/src/text/text-layout.test.d.ts +2 -0
  123. package/dist/src/text/text-layout.test.d.ts.map +1 -0
  124. package/dist/src/text/text-layout.test.js +717 -0
  125. package/dist/src/text/text-layout.test.js.map +1 -0
  126. package/dist/src/tsconfig.json +3 -3
  127. package/dist/src/types/geo.d.ts +2 -0
  128. package/dist/src/types/geo.d.ts.map +1 -1
  129. package/dist/src/types/geo.js +11 -0
  130. package/dist/src/types/geo.js.map +1 -1
  131. package/dist/src/types/geo.test.d.ts +2 -0
  132. package/dist/src/types/geo.test.d.ts.map +1 -0
  133. package/dist/src/types/geo.test.js +684 -0
  134. package/dist/src/types/geo.test.js.map +1 -0
  135. package/dist/src/types/time.test.d.ts +2 -0
  136. package/dist/src/types/time.test.d.ts.map +1 -0
  137. package/dist/src/types/time.test.js +27 -0
  138. package/dist/src/types/time.test.js.map +1 -0
  139. package/dist/src/utils/async-util.test.d.ts +2 -0
  140. package/dist/src/utils/async-util.test.d.ts.map +1 -0
  141. package/dist/src/utils/async-util.test.js +55 -0
  142. package/dist/src/utils/async-util.test.js.map +1 -0
  143. package/dist/src/utils/color-util.test.d.ts +2 -0
  144. package/dist/src/utils/color-util.test.d.ts.map +1 -0
  145. package/dist/src/utils/color-util.test.js +20 -0
  146. package/dist/src/utils/color-util.test.js.map +1 -0
  147. package/dist/src/utils/debug.d.ts +1 -0
  148. package/dist/src/utils/debug.d.ts.map +1 -1
  149. package/dist/src/utils/debug.js +1 -0
  150. package/dist/src/utils/debug.js.map +1 -1
  151. package/dist/src/utils/debug.test.d.ts +2 -0
  152. package/dist/src/utils/debug.test.d.ts.map +1 -0
  153. package/dist/src/utils/debug.test.js +61 -0
  154. package/dist/src/utils/debug.test.js.map +1 -0
  155. package/dist/src/utils/delay-interval.test.d.ts +2 -0
  156. package/dist/src/utils/delay-interval.test.d.ts.map +1 -0
  157. package/dist/src/utils/delay-interval.test.js +91 -0
  158. package/dist/src/utils/delay-interval.test.js.map +1 -0
  159. package/dist/src/utils/math.d.ts +1 -0
  160. package/dist/src/utils/math.d.ts.map +1 -1
  161. package/dist/src/utils/math.js +3 -0
  162. package/dist/src/utils/math.js.map +1 -1
  163. package/dist/src/utils/math.test.d.ts +2 -0
  164. package/dist/src/utils/math.test.d.ts.map +1 -0
  165. package/dist/src/utils/math.test.js +10 -0
  166. package/dist/src/utils/math.test.js.map +1 -0
  167. package/dist/src/utils/str-util.test.d.ts +2 -0
  168. package/dist/src/utils/str-util.test.d.ts.map +1 -0
  169. package/dist/src/utils/str-util.test.js +13 -0
  170. package/dist/src/utils/str-util.test.js.map +1 -0
  171. package/dist/tools/atlas-pack/atlas-json-parser.test.d.ts +2 -0
  172. package/dist/tools/atlas-pack/atlas-json-parser.test.d.ts.map +1 -0
  173. package/dist/tools/atlas-pack/atlas-json-parser.test.js +2109 -0
  174. package/dist/tools/atlas-pack/atlas-json-parser.test.js.map +1 -0
  175. package/dist/tools/atlas-pack/atlas.test.aseprite.json +4499 -0
  176. package/dist/tools/bundle/bundle.js +1 -1
  177. package/dist/tools/types/config-file.test.d.ts +2 -0
  178. package/dist/tools/types/config-file.test.d.ts.map +1 -0
  179. package/dist/tools/types/config-file.test.js +68 -0
  180. package/dist/tools/types/config-file.test.js.map +1 -0
  181. package/dist/tools/types/config.test.d.ts +2 -0
  182. package/dist/tools/types/config.test.d.ts.map +1 -0
  183. package/dist/tools/types/config.test.js +125 -0
  184. package/dist/tools/types/config.test.js.map +1 -0
  185. package/dist/tools/utils/argv.test.d.ts +9 -0
  186. package/dist/tools/utils/argv.test.d.ts.map +1 -0
  187. package/dist/tools/utils/argv.test.js +42 -0
  188. package/dist/tools/utils/argv.test.js.map +1 -0
  189. package/package.json +8 -4
  190. package/dist/public/void-v0.1.7+20260106.c6b562a.html +0 -115
@@ -27,7 +27,7 @@ export async function bundle(config, srcFilenames) {
27
27
  plugins: [HTMLPlugin(config)],
28
28
  tsconfig: config.tsconfigFilename,
29
29
  sourcemap: 'linked',
30
- target: 'es2024' // https://esbuild.github.io/content-types/#tsconfig-json
30
+ target: 'es2023' // https://esbuild.github.io/content-types/#tsconfig-json
31
31
  };
32
32
  const atlas = await packAtlas(config.atlas);
33
33
  await writeVoidConfig(atlas, config);
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config-file.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-file.test.d.ts","sourceRoot":"","sources":["../../../tools/types/config-file.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import path from 'node:path';
2
+ import { test } from 'node:test';
3
+ import { assert } from "../../src/test/assert.js";
4
+ import { parse } from "./config-file.js";
5
+ test('defaults', () => {
6
+ const config = {
7
+ out: {
8
+ dir: undefined,
9
+ game: 'game',
10
+ name: undefined,
11
+ tagSchema: 'tagSchema'
12
+ },
13
+ atlas: { dir: 'dir', image: 'image' }
14
+ };
15
+ assert(parse('dirname/filename', JSON.stringify(config)), {
16
+ $schema: 'https://oidoid.github.io/void/config-file.v0.json',
17
+ entry: path.resolve('dirname', 'src/assets/index.html'),
18
+ meta: path.resolve('dirname', 'dist/meta.json'),
19
+ out: {
20
+ dir: path.resolve('dirname', 'dist/public'),
21
+ game: path.resolve('dirname', 'game'),
22
+ name: undefined,
23
+ tagSchema: path.resolve('dirname', 'tagSchema')
24
+ },
25
+ atlas: {
26
+ dir: path.resolve('dirname', 'dir'),
27
+ image: path.resolve('dirname', 'image')
28
+ },
29
+ input: 'Default',
30
+ mode: 'Int',
31
+ dirname: 'dirname',
32
+ filename: 'dirname/filename'
33
+ });
34
+ });
35
+ test('overrides', () => {
36
+ const config = {
37
+ $schema: '$schema',
38
+ entry: 'entry',
39
+ meta: 'meta',
40
+ out: { dir: 'outDir', game: 'game', name: 'name', tagSchema: 'tagSchema' },
41
+ atlas: { dir: 'dir/', image: 'image.webp' },
42
+ input: 'Custom',
43
+ mode: 'Float'
44
+ };
45
+ assert(parse('dirname/filename', JSON.stringify(config)), {
46
+ $schema: '$schema',
47
+ entry: path.resolve('dirname', 'entry'),
48
+ meta: path.resolve('dirname', 'meta'),
49
+ out: {
50
+ dir: path.resolve('dirname', 'outDir'),
51
+ game: path.resolve('dirname', 'game'),
52
+ name: 'name',
53
+ tagSchema: path.resolve('dirname', 'tagSchema')
54
+ },
55
+ atlas: {
56
+ dir: path.resolve('dirname', 'dir/'),
57
+ image: path.resolve('dirname', 'image.webp')
58
+ },
59
+ input: 'Custom',
60
+ mode: 'Float',
61
+ dirname: 'dirname',
62
+ filename: 'dirname/filename'
63
+ });
64
+ });
65
+ test('overrides', () => {
66
+ assert.throws(() => parse('dirname/filename', ''), /config dirname\/filename unparsable/);
67
+ });
68
+ //# sourceMappingURL=config-file.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-file.test.js","sourceRoot":"","sources":["../../../tools/types/config-file.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../../tools/types/config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,125 @@
1
+ import { describe, test } from 'node:test';
2
+ import { assert } from "../../src/test/assert.js";
3
+ import { Config, parseTSConfig } from "./config.js";
4
+ describe('Config()', () => {
5
+ const configFile = {
6
+ $schema: 'schema',
7
+ entry: '/project/src/index.ts',
8
+ meta: '/project/meta.json',
9
+ out: {
10
+ dir: '/project/dist',
11
+ game: '/project/game',
12
+ name: undefined,
13
+ tagSchema: '/project/tagSchema'
14
+ },
15
+ atlas: { dir: '/project/dir', image: '/project/image' },
16
+ input: 'Default',
17
+ mode: 'Int',
18
+ dirname: '/project',
19
+ filename: '/project/void.json'
20
+ };
21
+ const argv = {
22
+ args: [],
23
+ opts: {},
24
+ posargs: [],
25
+ argv: ['node', 'void.ts']
26
+ };
27
+ test('watch mode uses .html suffix', () => {
28
+ const config = Config({ ...argv, opts: { '--watch': true } }, configFile, 'abc1234', { version: '1.0.0', published: '2024-01-01' }, '/project/tsconfig.json', {});
29
+ assert(config.out.filename, 'index.html');
30
+ assert(config.watch, true);
31
+ });
32
+ test('build mode uses versioned suffix', () => {
33
+ const config = Config(argv, configFile, 'abc1234', { version: '1.0.0', published: '2024-01-01' }, '/project/tsconfig.json', {});
34
+ assert(config.out.filename, 'index-v1.0.0+2024-01-01.abc1234.html');
35
+ });
36
+ test('out.name overrides entry stem', () => {
37
+ const config = Config(argv, { ...configFile, out: { ...configFile.out, name: 'game' } }, 'abc1234', { version: '1.0.0' }, '/project/tsconfig.json', {});
38
+ assert(config.out.filename, 'game-v1.0.0.abc1234.html');
39
+ });
40
+ test('conditions from tsconfig', () => {
41
+ const config = Config(argv, configFile, '', {}, '/project/tsconfig.json', {
42
+ compilerOptions: { customConditions: ['dev', 'browser'] }
43
+ });
44
+ assert(config.conditions, ['dev', 'browser']);
45
+ });
46
+ });
47
+ describe('parseTSConfig()', () => {
48
+ test('JSON', () => {
49
+ const jsonc = '{"compilerOptions": {"customConditions": ["dev"]}}';
50
+ assert(parseTSConfig(jsonc, 'tsconfig.json'), {
51
+ compilerOptions: { customConditions: ['dev'] }
52
+ });
53
+ });
54
+ test('empty JSON', () => {
55
+ assert(parseTSConfig('{}', 'tsconfig.json'), {});
56
+ });
57
+ test('JSON: // in string', () => {
58
+ const jsonc = '{"url": "https://example.com"}';
59
+ assert(parseTSConfig(jsonc, 'tsconfig.json'), {
60
+ url: 'https://example.com'
61
+ });
62
+ });
63
+ test('JSONC: single-line', () => {
64
+ const jsonc = `{
65
+ // This is a comment.
66
+ "compilerOptions": {
67
+ // Another comment.
68
+ "customConditions": ["dev"]
69
+ }
70
+ }`;
71
+ assert(parseTSConfig(jsonc, 'tsconfig.json'), {
72
+ compilerOptions: { customConditions: ['dev'] }
73
+ });
74
+ });
75
+ test('JSONC: end-of-line', () => {
76
+ const jsonc = `{
77
+ "compilerOptions": { // inline comment.
78
+ "customConditions": ["dev"] // "another" inline.
79
+ }
80
+ }`;
81
+ assert(parseTSConfig(jsonc, 'tsconfig.json'), {
82
+ compilerOptions: { customConditions: ['dev'] }
83
+ });
84
+ });
85
+ test('JSONC: trailing commas', () => {
86
+ const jsonc = `{
87
+ "compilerOptions": {
88
+ "customConditions": ["dev"],
89
+ },
90
+ }`;
91
+ assert(parseTSConfig(jsonc, 'tsconfig.json'), {
92
+ compilerOptions: { customConditions: ['dev'] }
93
+ });
94
+ });
95
+ test('JSONC: // in string with adjacent comment', () => {
96
+ const jsonc = `{
97
+ "url": "https://example.com", // real comment
98
+ "path": "file://localhost/path"
99
+ }`;
100
+ assert(parseTSConfig(jsonc, 'tsconfig.json'), {
101
+ url: 'https://example.com',
102
+ path: 'file://localhost/path'
103
+ });
104
+ });
105
+ test('JSONC: commented out props', () => {
106
+ const jsonc = `{
107
+ "extends": "./tsconfig.prod.json",
108
+ "compilerOptions": {
109
+ "customConditions": ["dev"], // npm link
110
+ // "paths": {"@oidoid/void": ["../void/src"]} // esbuild
111
+ },
112
+ "references": [{"path": "../void"}] // ts build
113
+ }`;
114
+ assert(parseTSConfig(jsonc, 'tsconfig.json'), {
115
+ extends: './tsconfig.prod.json',
116
+ compilerOptions: { customConditions: ['dev'] },
117
+ references: [{ path: '../void' }]
118
+ });
119
+ });
120
+ test('invalid', () => {
121
+ const jsonc = '{';
122
+ assert.throws(() => parseTSConfig(jsonc, 'tsconfig.json'), /tsconfig\.json/);
123
+ });
124
+ });
125
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../../tools/types/config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ declare module './argv.ts' {
2
+ interface Opts {
3
+ '--config'?: string;
4
+ '--minify'?: true;
5
+ '--watch'?: true;
6
+ }
7
+ }
8
+ export {};
9
+ //# sourceMappingURL=argv.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argv.test.d.ts","sourceRoot":"","sources":["../../../tools/utils/argv.test.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,WAAW,CAAC;IACzB,UAAU,IAAI;QACZ,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,UAAU,CAAC,EAAE,IAAI,CAAA;QACjB,SAAS,CAAC,EAAE,IAAI,CAAA;KACjB;CACF"}
@@ -0,0 +1,42 @@
1
+ import { test } from 'node:test';
2
+ import { assert } from "../../src/test/assert.js";
3
+ import { Argv } from "./argv.js";
4
+ test('parses empty.', () => {
5
+ assert(Argv(['/usr/local/bin/node', 'tools/void.ts']), {
6
+ args: [],
7
+ opts: {},
8
+ posargs: [],
9
+ argv: ['/usr/local/bin/node', 'tools/void.ts']
10
+ });
11
+ });
12
+ test('parses nonempty.', () => {
13
+ assert(Argv([
14
+ '/usr/local/bin/node',
15
+ 'tools/void.ts',
16
+ '--config=config',
17
+ '--minify',
18
+ '--watch',
19
+ 'a.aseprite',
20
+ 'b.aseprite',
21
+ '--',
22
+ 'posarg0',
23
+ 'posarg1'
24
+ ]), {
25
+ args: ['a.aseprite', 'b.aseprite'],
26
+ opts: { '--config': 'config', '--minify': true, '--watch': true },
27
+ posargs: ['posarg0', 'posarg1'],
28
+ argv: [
29
+ '/usr/local/bin/node',
30
+ 'tools/void.ts',
31
+ '--config=config',
32
+ '--minify',
33
+ '--watch',
34
+ 'a.aseprite',
35
+ 'b.aseprite',
36
+ '--',
37
+ 'posarg0',
38
+ 'posarg1'
39
+ ]
40
+ });
41
+ });
42
+ //# sourceMappingURL=argv.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argv.test.js","sourceRoot":"","sources":["../../../tools/utils/argv.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,EAAC,MAAM,EAAC,MAAM,0BAA0B,CAAA;AAC/C,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAU9B,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE;IACzB,MAAM,CAAC,IAAI,CAAC,CAAC,qBAAqB,EAAE,eAAe,CAAC,CAAC,EAAE;QACrD,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,CAAC,qBAAqB,EAAE,eAAe,CAAC;KAC/C,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC5B,MAAM,CACJ,IAAI,CAAC;QACH,qBAAqB;QACrB,eAAe;QACf,iBAAiB;QACjB,UAAU;QACV,SAAS;QACT,YAAY;QACZ,YAAY;QACZ,IAAI;QACJ,SAAS;QACT,SAAS;KACV,CAAC,EACF;QACE,IAAI,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;QAClC,IAAI,EAAE,EAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAC;QAC/D,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;QAC/B,IAAI,EAAE;YACJ,qBAAqB;YACrB,eAAe;YACf,iBAAiB;YACjB,UAAU;YACV,SAAS;YACT,YAAY;YACZ,YAAY;YACZ,IAAI;YACJ,SAAS;YACT,SAAS;SACV;KACF,CACF,CAAA;AACH,CAAC,CAAC,CAAA"}
package/package.json CHANGED
@@ -5,14 +5,14 @@
5
5
  },
6
6
  "bugs": "https://github.com/oidoid/void/issues",
7
7
  "dependencies": {
8
- "@biomejs/biome": "2.3.10",
8
+ "@biomejs/biome": "2.3.11",
9
9
  "esbuild": "0.27.2",
10
10
  "jsdom": "27.4.0",
11
11
  "mem-font": "11.0.0-10"
12
12
  },
13
13
  "description": "basic 2D game library.",
14
14
  "devDependencies": {
15
- "@oidoid/config": "0.0.5",
15
+ "@oidoid/config": "0.0.7",
16
16
  "@types/jsdom": "27.0.0",
17
17
  "@types/node": "24.4.0",
18
18
  "typescript": "5.9.3"
@@ -24,6 +24,10 @@
24
24
  ".": {
25
25
  "dev": "./src/index.ts",
26
26
  "default": "./dist/src/index.js"
27
+ },
28
+ "./test": {
29
+ "dev": "./src/test/index.ts",
30
+ "default": "./dist/src/test/index.js"
27
31
  }
28
32
  },
29
33
  "files": [
@@ -43,7 +47,7 @@
43
47
  "publishConfig": {
44
48
  "access": "public"
45
49
  },
46
- "published": "20260106",
50
+ "published": "20260107",
47
51
  "repository": {
48
52
  "type": "git",
49
53
  "url": "git+https://github.com/oidoid/void.git"
@@ -61,5 +65,5 @@
61
65
  "version": "npm pkg set published=$(date +%Y%m%d) && npm run clean && npm test"
62
66
  },
63
67
  "type": "module",
64
- "version": "0.1.7"
68
+ "version": "0.1.9"
65
69
  }
@@ -1,115 +0,0 @@
1
- <!doctype html>
2
- <html lang="en"><head>
3
- <meta charset="utf-8">
4
- <title>void</title>
5
- <link href="data:image/webp;base64,UklGRmYAAABXRUJQVlA4TFoAAAAvD8ADEA4HbRsJEqYD+jSfyMzuUohaKRIIJDRh7G8yh0AgUUp5uTn6PwEc/5/kIwBZf6VNA+lu1ZBea67ULpla6waQpPYGYn2ofbA+1G5H63JpH6whNzVArgE=" rel="icon" sizes="16x16" type="image/webp">
6
- <link rel="manifest" href="data:application/json,%7B%22author%22%3A%22oidoid%22%2C%22background_color%22%3A%22%23e6e6e6%22%2C%22description%22%3A%22void%202D%20game%20library%20demo.%22%2C%22display%22%3A%22standalone%22%2C%22homepage_url%22%3A%22https%3A%2F%2Foidoid.com%2F%22%2C%22icons%22%3A%5B%7B%22src%22%3A%22data%3Aimage%2Fwebp%3Bbase64%2CUklGRmYAAABXRUJQVlA4TFoAAAAvD8ADEA4HbRsJEqYD%2BjSfyMzuUohaKRIIJDRh7G8yh0AgUUp5uTn6PwEc%2F5%2FkIwBZf6VNA%2Blu1ZBea67ULpla6waQpPYGYn2ofbA%2B1G5H63JpH6whNzVArgE%3D%22%2C%22sizes%22%3A%2216x16%22%2C%22type%22%3A%22image%2Fwebp%22%7D%2C%7B%22src%22%3A%22data%3Aimage%2Fwebp%3Bbase64%2CUklGRoIAAABXRUJQVlA4THYAAAAvH8AHEA4HbSNJEqYFejSPyHy7PQRaFSkSCCQ0YexvModAIFFKebk5%2Bj8Bffz%2F5QNJv%2FpOtn81hQSSGgmHCk5rJLyumtziFCplUxUUtFYvMwWFO8ZEQW8ChZsU9CZQqHWqoJXeVLhJQSt0J%2B%2BAJt0VuvN6L78B%22%2C%22sizes%22%3A%2232x32%22%2C%22type%22%3A%22image%2Fwebp%22%7D%2C%7B%22src%22%3A%22data%3Aimage%2Fwebp%3Bbase64%2CUklGRowAAABXRUJQVlA4TIAAAAAvL8ALEFUwbttGUk1T6LY5hVya04N9OoBAIMmfZrgBBAJJEPur3n9Gbts4km6asn0f4WkzaPqITIQbVYgJv%2BotBYIK9TTmbAucsARd2SKEB8APVI7JV4sfqBZLHxcEXYZLIb8Bznfy75bNyVmLpb8T5GcAWQLbGwIXCWzHFm0rYA%3D%3D%22%2C%22sizes%22%3A%2248x48%22%2C%22type%22%3A%22image%2Fwebp%22%7D%2C%7B%22src%22%3A%22data%3Aimage%2Fwebp%3Bbase64%2CUklGRnYAAABXRUJQVlA4TGkAAAAvP8APEB8gECD8WdCvSSBAyHDjf0SHQIDQ58a0jvkPwN%2BUgYM2khypSTbJIlmXPjaBiP5PQF62Lc2b%2F9RHldKF8izqQnlbO6Uy0rsiriRJW2QpqTiGjIljyMpLceRNGRMH0newGUjfzgAA%22%2C%22sizes%22%3A%2264x64%22%2C%22type%22%3A%22image%2Fwebp%22%7D%2C%7B%22src%22%3A%22data%3Aimage%2Fwebp%3Bbase64%2CUklGRp4AAABXRUJQVlA4TJEAAAAvv8AvEB8gECD8WdCvSSBAyHDjf0SHQIDQ58a0jvkPwN%2BUAZNIkiSNyTJZJovcz25QRP8nYB7nsgrMy38fD3auAiqwFQCfrdTOtwLgJzvkcFt0rq4H7naoVmq1IeYy52qlbotjoFKrtaFW6tqo1GptqJW6IR6u1Go9vFqpa6NSq5UwM8BbagXM4T6YGT45lzcBAA%3D%3D%22%2C%22sizes%22%3A%22192x192%22%2C%22type%22%3A%22image%2Fwebp%22%7D%5D%2C%22manifest_version%22%3A3%2C%22name%22%3A%22void%22%2C%22orientation%22%3A%22any%22%2C%22short_name%22%3A%22void%22%2C%22start_url%22%3A%22https%3A%2F%2Foidoid.com%2F%22%2C%22theme_color%22%3A%22%23e6e6e6%22%2C%22version%22%3A%220.1.7%22%7D">
7
- </head>
8
- <body style="background-color: #e6e6e6">
9
- <img alt="" id="atlas" style="display: none" src="data:image/webp;base64,UklGRuYDAABXRUJQVlA4TNkDAAAvT8AQELXQjSRbtlWhIeMCHlwDCCxExw4CYzCAwINJ5ZzV3WvfhwFL2fGacf1RXUdNJKvV6xCHDgzgASE4wAZ9upQx8HttZhQ1khT1HhJW3FpZD8jBBU/0wBziH5IkuWGbJYODDRsDUFznDcXXjVrVlVhvZ56aFY6pGVqA6FXV7hv1A9jVLXgjUM8Kx/T7dX787GIFblRcX/8OwK/6AoZNeZ/Ke6xJc2R0o4p1JDyGTXmfBV/s39escFxngYICSueb/Rg2431V9TrXEsfsPY0FDrG5Hm8eIWzG2/u69rXE4b3dUCCIfuwMYWv+PIcMoxRC3LTv6zKd75wczavYe6BANnT3IeCdcM5QhZ7/CC4skArdj4VcgbsoZ1CFAoILC2RCV1TtiryDBQhvDVSZ0DxwdVUuFGoKriEtADzdrIB95kKBTKg6d+AGXmCoDAtZNikgruURQKs+I7BKuFTLHbgYv/QZ2Rd+zS9aRf0BF/KvF4hPSf+SVdTcNpX0mZSua2bnqwAX49Y+k+jrunb3TLoK4UJ+7TOJvnxoz0oVB1WGe7J9XdeJPwtVrmtvESb4C/hMLjRW2p2q4lO7mF/V3psVyPRVcyrwAr+Y0wk82ncy/kN9qhAQq/TeWIVzNfOdFgU2cpD+ylU29FlDqhAu5i/AkCtAuAIIoMCASJWKQE38xU54DWVShtRN1Q1ypdYTsBy+CQjswrxCgjLaHJkngDwBqqb464Q+CPEpvLFVMQmTze9/9y9OalPxjwJFhqDe9fwL7z8p4KL5C+Jzt82E9x8KsHxBSradOWQX0cvk4D0lvrS0wnt52T4F95T6EhkugzSpY8gLZSRL1XPff9zGOuBX6C/s2509QaRKTAgEfgW+FJBXxLtk+USvrf8P13SDLyk5GVSXUuhjO1yGvcXJuMTDT1UoC9lv9A4eEC+qq+t+S+QzFte/1eyidrOnRDCb4AKQyLfv0a9KpQpvJXHzp2pxRpbTYDc+ZYeuhOTzUnkzMnVQZ4JT+dmXBUeEZKnymdQDvIOL8IS7L92j1akmqMTAEnlkZnF06S6zp5DLEyMgQNo8JFB5RSqoCWmxyalPZZT1YqGyE0fo1SfCKl9TpTCWnliRy4L2A1uw5OVaAQLYxL3PnaX+FDN8gUxIQ7BWvn1xIagSrkz45EXUTbOTtZg/DYlJeOlXn9TKm/hC+2VFQPMw8HEqKhMuetDitOQXJiA1gdPHI9IjhrJm2Sp+zuKfolRg9GYN5sOh+7wsfsLWXn4Ad78PLaVSjp7/7a77/cnTCgf/kD9PVqHg5QfYGQ6L7h5gf2vhXs0XAA==">
10
- <script type="module" async="">var s={hash:"c6b562a",published:"20260106",version:"0.1.7"};var ge={id:"mem-prop-5x6",name:"mem 5x6",cellW:5,cellH:6,leading:1,lineH:7,baseline:1,kerning:{" ":0," 0":0," 1":0," 2":0," 3":0," 4":0," 5":0," 6":0," 7":0," 8":0," 9":0,"##":-1,"#_":0,"',":0,"'.":0,"'/":0,"'J":0,"'S":0,"'_":0,"'j":0,"'s":0,"(+":0,"(-":0,"(<":0,"(f":0,"({":0,"(~":0,")_":0,"*,":0,"*.":0,"*/":0,"*S":0,"*_":0,"*j":0,"*s":0,"+)":0,"+,":0,"+.":0,"+/":0,"+>":0,"+?":0,"+I":0,"+S":0,"+T":0,"+Z":0,"+]":0,"+_":0,"+`":0,"+j":0,"+s":0,"+}":0,",'":0,",*":0,",+":0,",-":0,",<":0,",?":0,",T":0,",Y":0,",Z":0,',"':0,",\\":0,",^":0,",`":0,",f":0,",t":0,",z":0,",{":0,",~":0,"-)":0,"-,":0,"--":0,"-.":0,"-/":0,"->":0,"-?":0,"-I":0,"-S":0,"-T":0,"-Z":0,"-]":0,"-_":0,"-`":0,"-j":0,"-s":0,"-}":0,".'":0,".*":0,".+":0,".-":0,".<":0,".?":0,".T":0,".Y":0,".Z":0,'."':0,".\\":0,".^":0,".`":0,".f":0,".t":0,".z":0,".{":0,".~":0,"/,":0,"/.":0,"//":0,"/J":0,"/S":0,"/_":0,"/j":0,"/s":0,"0 ":0,"1 ":0,"1T":0,"1Y":0,"1Z":0,"1f":0,"1t":0,"1z":0,"2 ":0,"3 ":0,"4 ":0,"5 ":0,"6 ":0,"7 ":0,"8 ":0,"9 ":0,":?":0,":T":0,":Z":0,":`":0,";?":0,";T":0,";Z":0,"<+":0,"<-":0,"<<":0,"<f":0,"<{":0,"<~":0,"==":0,"=_":0,">)":0,">,":0,">.":0,">/":0,">>":0,">?":0,">I":0,">S":0,">T":0,">Z":0,">]":0,">_":0,">`":0,">j":0,">s":0,">}":0,"?,":0,"?.":0,"?/":0,"?S":0,"?_":0,"?j":0,"?s":0,"@_":0,"C+":0,"C-":0,"C<":0,Cf:0,"C{":0,"C~":0,D_:0,"E+":0,"E-":0,"E<":0,Ef:0,"E{":0,"E~":0,"F&":0,"F+":0,"F,":0,"F-":0,"F.":0,"F/":0,"F:":0,"F;":0,"F<":0,FJ:0,FS:0,F_:0,Fa:0,Fe:0,Ff:0,Fg:0,Fj:0,Fq:0,Fs:0,"F{":0,"F~":0,"I+":0,"I-":0,"I<":0,If:0,"I{":0,"I~":0,"L'":0,"L*":0,"L+":0,"L-":0,L4:0,L7:0,"L<":0,"L?":0,LT:0,LY:0,LZ:0,'L"':0,"L\\":0,"L^":0,"L`":0,Lf:0,Lt:0,Lz:0,"L{":0,"L~":0,"P,":0,"P.":0,"P/":0,PS:0,P_:0,Pj:0,Ps:0,"S&":0,"S+":0,"S,":0,"S-":0,"S.":0,"S/":0,"S:":0,"S;":0,"S<":0,SJ:0,SS:0,S_:0,Sa:0,Se:0,Sf:0,Sg:0,Sj:0,Sq:0,Ss:0,"S{":0,"S~":0,"T&":0,"T+":0,"T,":0,"T-":0,"T.":0,"T/":0,"T:":0,"T;":0,"T<":0,TJ:0,TS:0,T_:0,Ta:0,Te:0,Tf:0,Tg:0,Tj:0,Tq:0,Ts:0,"T{":0,"T~":0,V_:0,"Y,":0,"Y.":0,"Y/":0,YS:0,Y_:0,Yj:0,Ys:0,"Z'":0,"Z*":0,"Z+":0,"Z-":0,Z4:0,Z7:0,"Z<":0,"Z?":0,ZT:0,ZY:0,ZZ:0,'Z"':0,"Z\\":0,"Z^":0,"Z`":0,Zf:0,Zt:0,Zz:0,"Z{":0,"Z~":0,"[+":0,"[-":0,"[<":0,"[f":0,"[{":0,"[~":0,'",':0,'".':0,'"/':0,'"J':0,'"S':0,'"_':0,'"j':0,'"s':0,"\\'":0,"\\*":0,"\\+":0,"\\-":0,"\\<":0,"\\?":0,"\\T":0,"\\Y":0,"\\Z":0,'\\"':0,"\\\\":0,"\\^":0,"\\`":0,"\\f":0,"\\t":0,"\\z":0,"\\{":0,"\\~":0,"^,":0,"^.":0,"^/":0,"^J":0,"^S":0,"^_":0,"^j":0,"^s":0,"_#":0,"_%":0,"_'":0,"_(":0,"_*":0,"_+":0,"_-":0,"_<":0,"_=":0,"_?":0,"_@":0,_T:0,_V:0,_Y:0,_Z:0,'_"':0,"_\\":0,"_^":0,__:0,"_`":0,_a:0,_e:0,_f:0,_t:0,_v:0,_z:0,"_{":0,"_~":0,"`,":0,"`.":0,"`/":0,"`J":0,"`S":0,"`_":0,"`j":0,"`s":0,"f,":0,"f.":0,"f/":0,fS:0,f_:0,fj:0,fs:0,"q#":0,q$:0,"q%":0,"q&":0,"q'":0,"q(":0,"q*":0,"q+":0,"q-":0,q0:0,q1:0,q2:0,q3:0,q4:0,q5:0,q6:0,q7:0,q8:0,q9:0,"q<":0,"q=":0,"q?":0,"q@":0,qA:0,qB:0,qC:0,qD:0,qE:0,qF:0,qG:0,qH:0,qI:0,qJ:0,qK:0,qL:0,qM:0,qN:0,qO:0,qP:0,qQ:0,qR:0,qS:0,qT:0,qU:0,qV:0,qW:0,qX:0,qY:0,qZ:0,"q[":0,'q"':0,"q\\":0,"q]":0,"q^":0,"q`":0,qa:0,qb:0,qc:0,qd:0,qe:0,qf:0,qh:0,qk:0,qm:0,qn:0,qo:0,qq:0,qr:0,qs:0,qt:0,qu:0,qv:0,qw:0,qx:0,qz:0,"q{":0,"q}":0,"q~":0,"r,":0,"r.":0,"r/":0,rS:0,r_:0,rj:-1,rs:0,"s,":0,"s.":0,"s/":0,sJ:0,sS:0,s_:0,sj:0,ss:0,"z'":0,"z*":0,"z+":0,"z-":0,z4:0,z7:0,"z<":0,"z?":0,zT:0,zY:0,zZ:0,'z"':0,"z\\":0,"z^":0,"z`":0,zf:0,zt:0,zz:0,"z{":0,"z~":0,"{+":0,"{-":0,"{<":0,"{f":0,"{{":0,"{~":0,"})":0,"},":0,"}.":0,"}/":0,"}>":0,"}?":0,"}I":0,"}S":0,"}T":0,"}Z":0,"}]":0,"}_":0,"}`":0,"}j":0,"}s":0,"}}":0,"~'":0,"~?":0,"~T":0,"~Z":0,'~"':0,"~\\":0,"~^":0,"~_":0,"~`":0,"~t":0,"~z":0},defaultKerning:1,defaultWhitespaceKerning:-1,endOfLineKerning:0,charW:{" ":4,"!":1,"#":5,"&":4,"'":1,"(":2,")":2,",":1,".":1,":":1,";":1,"@":5,M:5,W:5,"[":2,"\n":0,"]":2,"`":2,i:1,l:1,m:5,q:4,w:5,"|":1},defaultCharW:3,descends:{$:!0,",":!0,"/":!0,";":!0,Q:!0,"\\":!0,_:!0,g:!0,j:!0,p:!0,q:!0,y:!0}};var E=ge;var P=class{query="button & sprite";free(e){rt(e)}update(e,i){if(!e.invalid&&!i.input.invalid)return;e.invalid=!0;let{button:r}=e,n=r.type==="Toggle";r.pressed.x=e.sprite.x,r.pressed.y=e.sprite.y,r.pressed.w=e.sprite.w,r.pressed.h=e.sprite.h,r.selected.x=e.sprite.x,r.selected.y=e.sprite.y,r.selected.w=e.sprite.w,r.selected.h=e.sprite.h;let o=!!i.loader.cursor&&i.loader.cursor.sprite.hitsZ(e.sprite,i.cam),a=o&&i.input.isOnStart("A")?n?!T(e):!0:n?T(e):i.input.isOn("A")||!!i.loader.cursor?.cursor.keyboard&&i.input.isOn("A");r.started=T(e)!==a,r.pressed.visible=a,r.selected.visible=o,i.input.handled||=o}};function rt(t){t.button.pressed.free(),t.button.selected.free(),t.invalid=!0}function we(t,e){t.button.pressed.visible=e,t.invalid=!0}function T(t){return t.button.pressed.visible}var c={Bottom:0,A:1,B:2,C:3,D:4,E:5,F:6,G:7,UIA:8,UIB:9,UIC:10,UID:11,UIE:12,UIF:13,UIG:14,Top:15};function R(t){return t>=c.UIA}function ve(t,e){t.x=e.x,t.y=e.y,t.w=e.w,t.h=e.h}function b(t,e){let i={w:e.w??1,h:e.h??1};if(!t.w||!t.h||!i.w||!i.h)return!1;let r={x:t.x??0,y:t.y??0};return r.x<e.x+i.w&&r.x+t.w>e.x&&r.y<e.y+i.h&&r.y+t.h>e.y}function Se(t,e){return t.w===e.w&&t.h===e.h}function Ee(t,e){return{x:t.x+e.x,y:t.y+e.y}}function Te(t,e){return nt(de(t,e))}function nt(t){return Math.hypot(t.x,t.y)}function Re(t,e){return{x:Math.max(t.x,e.x),y:Math.max(t.y,e.y)}}function Ce(t,e){return{x:Math.min(t.x,e.x),y:Math.min(t.y,e.y)}}function de(t,e){return{x:t.x-e.x,y:t.y-e.y}}function Pe(t,e){return(t%e+e)%e}var x=16,pe=1/64,Be={w:4095,h:4095},ue=class{i;#e;constructor(e,i){this.#e=e,this.i=i}above(e){return(this.z===e.z?(this.zend?this.y+this.h:this.y)-(e.zend?e.y+e.h:e.y):this.z-e.z)>0}get cel(){return this.#e.view.getUint8(this.i+10)&31}set cel(e){let i=this.#e.view.getUint8(this.i+10);this.#e.view.setUint8(this.i+10,i&-32|e&31)}get clipbox(){return{x:this.x,y:this.y,w:this.w,h:this.h}}clips(e){return b(this,e)}clipsZ(e,i){if(this.ui===e.ui)return this.clips(e);let r={x:e.x+(e.ui?1:-1)*Math.floor(i.x),y:e.y+(e.ui?1:-1)*Math.floor(i.y),w:e.w,h:e.h};return b(this,r)}get flipX(){return!!(this.#e.view.getUint8(this.i+6)&64)}set flipX(e){let i=this.#e.view.getUint8(this.i+6);this.#e.view.setUint8(this.i+6,i&-65|-e&64)}get flipY(){return!!(this.#e.view.getUint8(this.i+6)&32)}set flipY(e){let i=this.#e.view.getUint8(this.i+6);this.#e.view.setUint8(this.i+6,i&-33|-e&32)}free(){this.#e.free(this)}get h(){return this.#e.view.getUint16(this.i+8,!0)>>>4}set h(e){let i=this.#e.view.getUint16(this.i+8,!0);this.#e.view.setUint16(this.i+8,i&-65521|(e&4095)<<4,!0)}get id(){return this.#e.view.getUint16(this.i+10,!0)>>>5&2047}set id(e){let i=this.#e.view.getUint16(this.i+10,!0);this.#e.view.setUint16(this.i+10,i&-65505|(e&2047)<<5,!0)}init(){this.cel=0,this.flipX=!1,this.flipY=!1,this.h=0,this.id=0,this.stretch=!1,this.visible=!0,this.w=0,this.x=0,this.y=0,this.z=c.Bottom,this.zend=!1}get stretch(){return!!(this.#e.view.getUint8(this.i+6)&128)}set stretch(e){let i=this.#e.view.getUint8(this.i+6);this.#e.view.setUint8(this.i+6,i&-129|-e&128)}get ui(){return R(this.z)}get visible(){return(this.#e.view.getUint8(this.i+12)&1)===1}set visible(e){let i=this.#e.view.getUint8(this.i+12);this.#e.view.setUint8(this.i+12,i&-2|(e?1:0))}get w(){return this.#e.view.getUint16(this.i+7,!0)&4095}set w(e){let i=this.#e.view.getUint16(this.i+7,!0);this.#e.view.setUint16(this.i+7,i&-4096|e&4095,!0)}get x(){return(this.#e.view.getUint32(this.i+0,!0)<<8>>8)/64}set x(e){let i=this.#e.view.getUint32(this.i+0,!0);this.#e.view.setUint32(this.i+0,i&-16777216|e*64&16777215,!0)}get y(){return(this.#e.view.getUint32(this.i+3,!0)<<8>>8)/64}set y(e){let i=this.#e.view.getUint32(this.i+3,!0);this.#e.view.setUint32(this.i+3,i&-16777216|e*64&16777215,!0)}get z(){return this.#e.view.getUint8(this.i+6)&15}set z(e){let i=this.#e.view.getUint8(this.i+6);this.#e.view.setUint8(this.i+6,i&-16|e&15)}get zend(){return!!(this.#e.view.getUint8(this.i+6)&16)}set zend(e){let i=this.#e.view.getUint8(this.i+6);this.#e.view.setUint8(this.i+6,i&-17|-e&16)}},B=class t extends ue{#e;#t;#i;#r;constructor(e,i,r,n){super(e,i),this.#e=r,this.#r=n}get anim(){return this.#e.anim[this.tag]}diagonalize(e){me(this,e.x*e.y)}get flipX(){return super.flipX}set flipX(e){this.flipX!==e&&(super.flipX=e,this.#t=void 0,this.#i=void 0)}get flipY(){return super.flipY}set flipY(e){this.flipY!==e&&(super.flipY=e,this.#t=void 0,this.#i=void 0)}get h(){return super.h}set h(e){this.h!==e&&(super.h=e,this.#t=void 0,this.#i=void 0)}get hitbox(){if(this.#t)return this.#t;let{hitbox:e}=this.anim;if(e)return this.#t??={x:Math.floor(this.x+(this.flipX?this.w-e.w-e.x:e.x)),y:Math.floor(this.y+(this.flipY?this.h-e.h-e.y:e.y)),w:e.w,h:e.h}}hits(e){let i=e instanceof t?e.hurtbox??e:e;return b(this.hitbox??this,i)}hitsZ(e,i){if(this.ui===e.ui)return this.hits(e);let r={...e.hurtbox??e.clipbox};return r.x+=(e.ui?1:-1)*Math.floor(i.x),r.y+=(e.ui?1:-1)*Math.floor(i.y),b(this.hitbox??this,r)}get hurtbox(){if(this.#i)return this.#i;let{hurtbox:e}=this.anim;if(e)return this.#i??={x:Math.floor(this.x+(this.flipX?this.w-e.w-e.x:e.x)),y:Math.floor(this.y+(this.flipY?this.h-e.h-e.y:e.y)),w:e.w,h:e.h}}get id(){return super.id}set id(e){this.id!==e&&(super.id=e,this.#t=void 0,this.#i=void 0)}get looped(){return Pe(this.looperCel-this.cel,32)>=this.anim.cels}get looperCel(){return this.#r.age/62.5%(this.anim.cels*2)}reset(){this.cel=this.looperCel}get tag(){return this.#e.tags[this.id]}set tag(e){let i=this.#e.anim[e];this.w=i.w,this.h=i.h,this.id=i.id,this.reset()}toString(){return`Sprite{${this.tag} (${this.x} ${this.y} ${this.z}) ${this.w}\xD7${this.h}}`}get w(){return super.w}set w(e){this.w!==e&&(super.w=e,this.#t=void 0,this.#i=void 0)}get x(){return super.x}set x(e){this.x!==e&&(super.x=e,this.#t=void 0,this.#i=void 0)}get y(){return super.y}set y(e){this.y!==e&&(super.y=e,this.#t=void 0,this.#i=void 0)}};function me(t,e){e&&(t.x=Math.floor(t.x)+.5,t.y=Math.floor(t.y)+.5-(e>0?0:pe))}function L(t){return Math.trunc(t/pe)*pe}var M=class{query="cursor & sprite";update(e,i){if(i.input.point?.invalid&&st(e,i.input.point),at(e,i),e.cursor.keyboard&&(i.input.dir.x||i.input.dir.y||!i.input.point&&i.input.isAnyStarted("A"))&&ot(e,i.input,i.tick.s),e.cursor.pick){let r=i.input.isOn("A")?e.cursor.pick:e.cursor.point;r!==e.sprite.tag&&(e.sprite.tag=r,e.invalid=!0)}}};function ot(t,e,i){let r=L(t.cursor.keyboard*i);e.isAnyOnStart("U","D","L","R")&&e.dir.x&&e.dir.y&&t.sprite.diagonalize(e.dir),e.dir.x&&(t.sprite.x=Math.min(t.cursor.bounds.x+t.cursor.bounds.w,Math.max(t.cursor.bounds.x,t.sprite.x+e.dir.x*r))),e.dir.y&&(t.sprite.y=Math.min(t.cursor.bounds.y+t.cursor.bounds.h,Math.max(t.cursor.bounds.y,t.sprite.y+e.dir.y*r))),t.sprite.z=c.Top,t.sprite.visible=!0,t.invalid=!0}function st(t,e){t.sprite.x=e.local.x,t.sprite.y=e.local.y,t.sprite.z=c.Top,t.sprite.visible=e.type==="Mouse",t.invalid=!0}function at(t,e){e.cam.invalid&&(t.cursor.bounds.x=-t.sprite.w,t.cursor.bounds.y=-t.sprite.h,t.cursor.bounds.w=e.cam.w+t.sprite.w,t.cursor.bounds.h=e.cam.h+t.sprite.h)}var l=lt(globalThis.location?.href);function lt(t){if(!t)return;let e=[...new URL(t).searchParams].find(([o])=>o.toLowerCase()==="debug")?.[1];if(e==null)return;let i=Object.fromEntries(e.split(",").filter(Boolean).map(o=>o.split("="))),r={};for(let o in i)r[o.toLowerCase()]=i[o]||"true";let n={cam:"",input:"",mem:"",render:""};return new Proxy(r,{get(o,a){if(typeof a!="string"||(a=a.toLowerCase(),o[a]))return o[a];if(!e||"all"in i||a in n&&"void"in i)return"true"}})}var _=class{query="debugInput";update(e,i){if(l?.input){if(i.input.started){let r=!!i.input.on.length;console.debug(r?`[input] buttons on: ${i.input.on.join(" ")}.`:"[input] buttons off.");let n=i.input.combo;n.length>1&&r&&console.debug(`[input] combo: ${n.map(o=>o.join("+")).join(" ")}.`)}i.input.point?.invalid&&i.input.point?.click&&!i.input.point.pinch&&console.debug(`[input] ${i.input.point.drag.on?"drag":"click"} xy: ${i.input.point.x} ${i.input.point.y}.`),i.input.point?.pinch&&console.debug(`[input] pinch xy: ${i.input.point.pinch.xy.x} ${i.input.point.pinch.xy.y}.`),i.input.wheel&&console.debug(`[input] wheel xy: ${i.input.wheel.delta.xy.x} ${i.input.wheel.delta.xy.y}.`)}}};function Le(t,e){let i=e.codePointAt(0);return(i==null||i>255)&&(i=63),`${t.id}--${i.toString(16).padStart(2,"0")}`}function he(t,e){return t.cellH-(t.descends[e]?0:t.baseline)}function Me(t,e,i){return e===`
11
- `||i==null||i===`
12
- `?t.endOfLineKerning:t.kerning[e+i]!=null?t.kerning[e+i]:/^\s?$/.test(e)||/^\s?$/.test(i)?t.defaultWhitespaceKerning:t.defaultKerning}function ye(t,e){return t.charW[e]??t.defaultCharW}function Ye(t){let e=[],i=t.scale??1,r=t.start??{x:0,y:0},n=t.maxW??1/0,o={x:r.x,y:r.y},a=0,d=0;for(;e.length<t.text.length;){let u=e.length,m=t.text[u],p;m===`
13
- `?p=dt(t.font,o,r.x,i,a):/^\s*$/.test(m)?p=pt(t.font,o,n,Ae(t.font,m,t.text[u+1],i),r.x,i,d,m,a):(p=_e(t.font,o,n,t.text,u,r.x,i,d,a),o.x>0&&p.cursor.y===w(t.font,r.x,o.y,i).y&&n-o.x+p.cursor.x<=n&&(o=w(t.font,r.x,o.y,i),p=_e(t.font,o,n,t.text,u,r.x,i,d,a))),e.push(...p.chars),o.x=p.cursor.x,o.y=p.cursor.y,a=p.w,d=p.trimmedLineH}return{chars:e,cursor:o,w:a,h:w(t.font,o.x,o.y,i).y-r.y,trimmedH:o.y+d*i-r.y}}function _e(t,e,i,r,n,o,a,d,u){let m=[],{x:p,y:f}=e;for(;;n++){let S=r[n];if(!S||/^\s*$/.test(S))break;let fe=he(t,S),xe=Ae(t,S,r[n+1],a),be=p>o&&p+xe>o+i;be&&({x:p,y:f}=w(t,o,f,a)),d=be?fe:Math.max(d,fe),m.push({x:p,y:f,w:ye(t,S),h:t.cellH}),p+=xe,u=Math.max(u,p-o)}return{chars:m,cursor:{x:p,y:f},trimmedLineH:d,w:u}}function w(t,e,i,r){return{x:e,y:i+t.lineH*r}}function dt(t,e,i,r,n){let o=w(t,i,e.y,r);return{chars:[void 0],cursor:o,trimmedLineH:0,w:Math.max(n,e.x-i)}}function pt(t,e,i,r,n,o,a,d,u){let m=e.x>n&&e.x+r>=i?w(t,n,e.y,o):{x:e.x+r,y:e.y},p=he(t,d);return{chars:[void 0],cursor:m,trimmedLineH:e.y===m.y?Math.max(a,p):p,w:Math.max(u,e.x-n)}}function Ae(t,e,i,r){return r*(ye(t,e)+Me(t,e,i))}var Y=class{query="sprite & text & textWH";update(e){e.invalid&&ut(e)}},A=class{query="sprite & text & textWH & textXY";free(e){for(let i of e.textXY.chars)i.free();e.textXY.chars.length=0,e.invalid=!0}update(e,i){e.invalid&&ct(e,i)}};function ut(t){let e=Ye({font:E,maxW:t.textWH.maxW,scale:t.textWH.scale,start:{x:0,y:0},text:t.text});t.textWH.layout=e;let i=e.w+t.textWH.pad.w+t.textWH.pad.e,r=(t.textWH.trim==="Leading"?e.h-E.leading*t.textWH.scale:t.textWH.trim==="Descender"?e.trimmedH:e.h)+t.textWH.pad.n+t.textWH.pad.s;t.ninePatch&&(i+=t.ninePatch.border.w+t.ninePatch.border.e+t.ninePatch.pad.w+t.ninePatch.pad.e,r+=t.ninePatch.border.n+t.ninePatch.border.s+t.ninePatch.pad.n+t.ninePatch.pad.s),t.sprite.w=i,t.sprite.h=r,t.invalid=!0}function ct(t,e){let i=0,r=t.textWH.layout;for(let[n,o]of r.chars.entries()){if(o==null)continue;let a=t.textXY.chars[i]??=e.alloc();a.x=t.sprite.x+o.x+t.textWH.pad.w+(t.ninePatch?t.ninePatch.border.w+t.ninePatch.pad.w:0),a.y=t.sprite.y+o.y+t.textWH.pad.n+(t.ninePatch?t.ninePatch.border.n+t.ninePatch.pad.n:0),a.z=t.textXY.z,a.tag=Le(E,t.text[n]),a.stretch=!0,a.w*=t.textWH.scale,a.h*=t.textWH.scale,i++}for(;t.textXY.chars.length>i;)t.textXY.chars.pop().free();t.invalid=!0}function v(t,e){e!==t.text&&(t.text=e,t.invalid=!0)}var k=class{query="fps & text";update(e,i){let r=performance.now();r-e.fps.next.created>=1e3&&(e.fps.prevFrames=i.renderer.clears+1-e.fps.next.startClears,e.fps.next={created:r,startClears:i.renderer.clears+1}),v(e,e.fps.prevFrames.toString().padStart(3," "))}};var X=class{query="hud & sprite";update(e,i){if(!e.invalid&&!i.cam.invalid)return;let r=i.cam.follow(e.sprite,e.sprite.z,e.hud.origin,e.hud);ve(e.sprite,r),e.invalid=!0}};var H=class{query="ninePatch & sprite";free(e){mt(e)}update(e){if(!e.invalid)return;let i=ht(e);xt(e,i),yt(e),ft(e,i)}};function mt(t){t.ninePatch.patch.w?.free(),t.ninePatch.patch.nw?.free(),t.ninePatch.patch.n?.free(),t.ninePatch.patch.ne?.free(),t.ninePatch.patch.e?.free(),t.ninePatch.patch.se?.free(),t.ninePatch.patch.s?.free(),t.ninePatch.patch.sw?.free(),t.ninePatch.patch.center?.free(),t.invalid=!0}function ht(t){let{sprite:e,ninePatch:i}=t;return{x:e.x+i.pad.w,y:e.y+i.pad.n}}function yt(t){let{border:e,pad:i,patch:r}=t.ninePatch,n=t.sprite.w-e.w-e.e-i.w-i.e,o=t.sprite.h-e.n-e.s-i.n-i.s;r.n&&(r.n.w=n),r.s&&(r.s.w=n),r.w&&(r.w.h=o),r.e&&(r.e.h=o),r.center&&(r.center.w=n,r.center.h=o)}function ft(t,e){let{patch:i,pad:r,border:n}=t.ninePatch,o={x:t.sprite.x+t.sprite.w-n.e-r.e,y:t.sprite.y+t.sprite.h-n.s-r.s};i.ne&&(i.ne.x=o.x,i.ne.y=e.y),i.e&&(i.e.x=o.x,i.e.y=e.y+n.n),i.se&&(i.se.x=o.x,i.se.y=o.y),i.s&&(i.s.x=e.x+n.w,i.s.y=o.y),i.sw&&(i.sw.x=e.x,i.sw.y=o.y)}function xt(t,e){let{border:i,patch:r}=t.ninePatch;r.nw&&(r.nw.x=e.x,r.nw.y=e.y),r.w&&(r.w.x=e.x,r.w.y=e.y+i.n),r.n&&(r.n.x=e.x+i.w,r.n.y=e.y),r.center&&(r.center.x=e.x+i.w,r.center.y=e.y+i.n)}var z=class{query="override";update(e){e.override.invalid!=null&&(e.invalid=e.override.invalid)}};var W=class{query="sprite";free(e){e.sprite.free(),e.invalid=!0}};function ke(t,e){for(let i of t)if(i.id===e)return i}function Xe(t,e,i){for(let r of t){for(let n in r)e[n]?.update?.(r,i);r.invalid&&l?.invalid&&console.debug("[invalid] ent update invalid",r),i.invalid||=!!r.invalid,r.invalid=!1}}function He(t){return{anim:t.anim,celXYWH:bt(t),tags:Object.keys(t.anim)}}function bt(t){let e=[],i=0;for(let r of Object.values(t.anim))e.push(...gt(r,t.celXY,i)),i+=r.cels*2;return e}function gt(t,e,i){let r=[];for(let n=0;n<16;n++){let o=i+2*(n%t.cels);r.push(e[o],e[o+1],t.w,t.h)}return r}var D=class{#e=0;#t=1;#i=!0;#r=1;#o={w:1/0,h:1/0};#n="Int";#s=1;#l=1;#d={w:1,h:1};#u=0;#a=0;#c=0;center(e){this.x=Math.floor(e.x-this.w/2),this.y=Math.floor(e.y-this.h/2)}clientToXY(e){let i=this.clientToXYLocal(e);return{x:this.#u+i.x,y:this.#a+i.y}}clientToXYLocal(e){return{x:e.x/this.#d.w*this.#l,y:e.y/this.#d.h*this.#t}}diagonalize(e){me(this,e.x*e.y)}follow(e,i,r,n){let o=R(i)?0:Math.floor(this.x);switch(r){case"SW":case"W":case"NW":o+=n?.margin?.w??0;break;case"SE":case"E":case"NE":o+=this.w-(e.w+(n?.margin?.e??0));break;case"N":case"S":case"Center":o+=Math.trunc(this.w/2)-Math.trunc(e.w/2);break}o-=o%((n?.modulo?.x??o)||1);let a=R(i)?0:Math.floor(this.y);switch(r){case"N":case"NE":case"NW":a+=n?.margin?.n??0;break;case"SE":case"S":case"SW":a+=this.h-(e.h+(n?.margin?.s??0));break;case"E":case"W":case"Center":a+=Math.trunc(this.h/2)-Math.trunc(e.h/2);break}a-=a%((n?.modulo?.y??a)||1);let d=n?.fill==="X"||n?.fill==="XY"?this.w-(n?.margin?.w??0)-(n?.margin?.e??0):e.w,u=n?.fill==="Y"||n?.fill==="XY"?this.h-(n?.margin?.n??0)-(n?.margin?.s??0):e.h;return{x:o,y:a,w:d,h:u}}get h(){return this.#t}isVisible(e){return b(this,e)}get invalid(){return this.#i}get minScale(){return this.#r}set minScale(e){this.#s!==e&&(this.#s=e,this.#p())}get minWH(){return this.#o}set minWH(e){this.#o.w===e.w&&this.#o.h===e.h||(this.#o.w=e.w,this.#o.h=e.h,this.#p())}get mode(){return this.#n}set mode(e){this.#n!==e&&(this.#n=e,this.#p())}get portrait(){return this.h>this.w}postupdate(){this.#i=!1}get scale(){return this.#s}toString(){return`Cam{(${this.x} ${this.y}) ${this.w}\xD7${this.h}}`}update(e){if(!e.parentElement)throw Error("canvas has no parent");let{clientWidth:i,clientHeight:r}=e.parentElement;this.#i||=this.#d.w!==i||this.#d.h!==r||this.#e!==devicePixelRatio,this.#i&&(this.#e=devicePixelRatio,this.#d.w=i,this.#d.h=r,this.#p(),e.width=this.#l,e.height=this.#t,e.style.width=`${this.#l*this.#s/devicePixelRatio}px`,e.style.height=`${this.#t*this.#s/devicePixelRatio}px`)}get w(){return this.#l}get whClient(){return this.#d}get x(){return this.#u}set x(e){this.#i||=this.x!==e,this.#u=e}get y(){return this.#a}set y(e){this.#i||=this.y!==e,this.#a=e}get zoomOut(){return this.#c}set zoomOut(e){e=Math.max(0,e),this.#c!==e&&(this.#c=e,this.#p())}#p(){!this.#i&&l?.invalid&&console.debug("[invalid] cam invalid"),this.#i=!0;let e={w:this.#d.w*devicePixelRatio,h:this.#d.h*devicePixelRatio},i=Math.max(this.#r,Math.min(e.w/this.#o.w,e.h/this.#o.h)-(this.#n==="Int"?Math.trunc(this.#c):this.#c));this.#s=this.#n==="Int"?Math.trunc(i):i,this.#l=Math.ceil(e.w/this.#s),this.#t=Math.ceil(e.h/this.#s)}};var I=class{enable=!1;#e;constructor(e){this.#e=e}register(e){let i=this.#e[`${e}EventListener`].bind(this.#e);return i("contextmenu",this.#t),i("touchstart",this.#t,{passive:!1}),this}[Symbol.dispose](){this.register("remove")}#t=e=>{!e.isTrusted||e.metaKey||e.altKey||e.ctrlKey||this.enable||e.preventDefault()}};var U=class{bits=0;bitByAxis={};bitByButton={};onEvent=()=>{};#e;constructor(e){this.#e=e}get connected(){return isSecureContext&&navigator.getGamepads().filter(Boolean).length>0}register(e){let i=this.#e[`${e}EventListener`].bind(this.#e);return i("gamepadconnected",this.onEvent),i("gamepaddisconnected",this.onEvent),this}reset(){this.bits=0}[Symbol.dispose](){this.register("remove")}update(){if(this.bits=0,!!isSecureContext){for(let e of navigator.getGamepads())if(e){for(let[i,r]of e.axes.entries()??[]){let n=this.bitByAxis[i];if(!n)continue;let o=r<0?n[0]:r===0?0:n[1];this.bits|=Math.abs(r)>=.5?o:0}for(let[i,r]of e.buttons.entries()??[]){let n=this.bitByButton[i];n!=null&&(this.bits|=r.pressed?n:0)}}}}};var O=class{bitByCode={};invalid=!1;onEvent=()=>{};#e={};#t;constructor(e){this.#t=e}get bits(){let e=0;for(let i in this.bitByCode)e|=this.#e[i]?this.bitByCode[i]:0;return e}postupdate(){this.invalid=!1}register(e){let i=this.#t[`${e}EventListener`].bind(this.#t);for(let r of["keydown","keyup"])i(r,this.#i);return this}reset(){this.invalid=!1,this.#e={}}[Symbol.dispose](){this.register("remove")}#i=e=>{!e.isTrusted||this.bitByCode[e.code]==null||e.type==="keydown"&&(e.metaKey||e.altKey||e.ctrlKey)||(this.invalid=!0,this.#e[e.code]=e.type==="keydown",e.preventDefault(),this.onEvent())}};var wt={mouse:"Mouse",pen:"Pen",touch:"Touch"},vt=["pointercancel","pointerdown","pointermove","pointerup"],V=class{bitByButton={};dragMinClient=5;invalid=!1;onEvent=()=>{};primary;secondary={};#e;#t;constructor(e){this.#t=e}get boundsClient(){if(!this.primary?.bits&&!Object.keys(this.secondary).length)return;let e={x:1/0,y:1/0},i={x:-1/0,y:-1/0};for(let r of[this.primary,...Object.values(this.secondary)])r?.bits&&(e=Ce(e,r.xyClient),i=Re(i,r.xyClient));return{x:e.x,y:e.y,w:i.x-e.x,h:i.y-e.y}}get centerClient(){let e=this.boundsClient;return e?Ee(e,{x:e.w/2,y:e.h/2}):this.primary?.xyClient}get locked(){return this.#t.ownerDocument.pointerLockElement===this.#t}get pinchClient(){if(!this.#e)return;let e=this.#o;return e?de(e,this.#e):void 0}postupdate(){this.invalid=!1}register(e){let i=this.#t[`${e}EventListener`].bind(this.#t);for(let r of vt)i(r,this.#r);return this}reset(){this.invalid=!1,this.primary=void 0;for(let e in this.secondary)delete this.secondary[e];this.#e=void 0}update(){((this.primary?.bits?1:0)+Object.values(this.secondary).length<2||!this.#e)&&(this.#e=this.#o)}[Symbol.dispose](){this.register("remove")}#i(e){let i=0;for(let r=1;r<=e;r<<=1)(r&e)===r&&(i|=this.bitByButton[r]??0);return i}#r=e=>{if(!e.isTrusted)return;this.invalid=!0;let i=e.metaKey||e.altKey||e.ctrlKey?0:this.#i(e.buttons),r=this.locked;if(i&&e.type==="pointerdown"&&(e.preventDefault(),!r))try{this.#t.setPointerCapture(e.pointerId)}catch{}let n=e.isPrimary?this.primary:this.secondary[e.pointerId],o;if(r){let f=1/devicePixelRatio;o={x:Math.min(Math.max(0,(n?.xyClient.x??e.offsetX)+e.movementX*f),this.#t.clientWidth),y:Math.min(Math.max(0,(n?.xyClient.y??e.offsetY)+e.movementY*f),this.#t.clientHeight)}}else o={x:e.offsetX,y:e.offsetY};let a=e.type,d=wt[e.pointerType],u;i&&(e.type==="pointerdown"?u={x:o.x,y:o.y}:e.type==="pointermove"&&(u=n?.clickClient));let m=!!i&&(n?.drag||!!u&&Te(u,o)>=this.dragMinClient),p={clickClient:u,bits:i,drag:m,ev:a,id:e.pointerId,primary:e.isPrimary,type:d,xyClient:o};e.isPrimary?this.primary=p:i?this.secondary[e.pointerId]=p:delete this.secondary[e.pointerId],this.onEvent()};get#o(){if((this.primary?.bits?1:0)+Object.values(this.secondary).length<2)return;let e=this.boundsClient;return e?{x:e.w,y:e.h}:void 0}};var q=class{deltaClient;onEvent=()=>{};#e;constructor(e){this.#e=e}postupdate(){this.deltaClient=void 0}register(e){return this.#e[`${e}EventListener`].bind(this.#e)("wheel",this.#t,{passive:!0}),this}reset(){this.deltaClient=void 0}[Symbol.dispose](){this.register("remove")}#t=e=>{!e.isTrusted||e.metaKey||e.altKey||e.ctrlKey||(this.deltaClient={x:e.deltaX,y:e.deltaY,z:e.deltaZ},this.onEvent())}};var F=class{comboMaxIntervalMillis=300;gestured=!1;handled=!1;invalid=!1;minHeldMillis=300;#e={};#t={};#i=0;#r;#o=[];#n;#s={x:0,y:0};#l;#d=0;#u;#a;#c;#p=0;#m;#f;constructor(e,i){this.#r=e,this.#n=new I(i),this.#l=new U(globalThis),this.#u=new O(i.ownerDocument),this.#a=new V(i),this.#m=new q(i)}get anyOn(){return this.#i!==0}get combo(){let e=[];for(let i of this.#o){let r=[];for(let n=1;n<=i;n<<=1)(n&i)===n&&this.#t[n]&&r.push(this.#t[n]);r.sort(),e.push(r)}return e}get contextMenu(){return this.#n}get dir(){return this.#s}get gamepad(){return this.#l.connected?{}:void 0}get held(){return!this.handled&&this.#d>=this.minHeldMillis}isAnyOn(...e){return!this.handled&&!!(this.#i&this.#h(e))}isAnyOnStart(...e){return this.started&&this.isAnyOn(...e)}isAnyOnStill(...e){let i=this.#h(e);return!this.handled&&!!(this.#i&this.#p&i)}isAnyStarted(...e){let i=this.#h(e);return!this.handled&&(this.#i&i)!==(this.#p&i)}isCombo(...e){return e.length===this.#o.length&&this.isComboEndsWith(...e)}isComboEndsWith(...e){for(let[i,r]of e.entries()){let n=this.#h(r);if(this.#o.at(-e.length+i)!==n)return!1}return!this.handled&&(this.#o.at(-1)===this.#i||!this.#i)}isComboEndsWithStart(...e){return this.isOnStart(...e.at(-1))&&this.isComboEndsWith(...e)}isComboStart(...e){return this.isOnStart(...e.at(-1))&&this.isCombo(...e)}isOff(...e){return!this.handled&&!this.isOn(...e)}isOffStart(...e){let i=this.#h(e);return(this.#p&i)===i&&this.started&&this.isOff(...e)}isOn(...e){let i=this.#h(e);return!this.handled&&(this.#i&i)===i}isOnStart(...e){let i=this.#h(e);return!((this.#p&i)===i)&&this.started&&this.isOn(...e)}get key(){return{invalid:this.#u.invalid}}mapDefault(){this.mapKeyboardCode("U","ArrowUp"),this.mapKeyboardCode("D","ArrowDown"),this.mapKeyboardCode("L","ArrowLeft"),this.mapKeyboardCode("R","ArrowRight"),this.mapKeyboardCode("C","KeyC"),this.mapKeyboardCode("A","KeyX","Space"),this.mapKeyboardCode("B","KeyZ"),this.mapKeyboardCode("Menu","Enter"),this.mapKeyboardCode("Back","Escape"),this.mapGamepadAxis("U","D",1,3,7),this.mapGamepadAxis("L","R",0,2,6),this.mapGamepadButton("U",12),this.mapGamepadButton("D",13),this.mapGamepadButton("L",14),this.mapGamepadButton("R",15),this.mapGamepadButton("C",2),this.mapGamepadButton("B",0),this.mapGamepadButton("A",1),this.mapGamepadButton("Menu",9),this.mapGamepadButton("Back",8),this.mapPointerClick("A",1),this.mapPointerClick("B",2),this.mapPointerClick("C",4)}mapGamepadAxis(e,i,...r){for(let n of r)this.#l.bitByAxis[n]=[this.#y(e),this.#y(i)]}mapGamepadButton(e,...i){for(let r of i)this.#l.bitByButton[r]=this.#y(e)}mapKeyboardCode(e,...i){for(let r of i)this.#u.bitByCode[r]=this.#y(e)}mapPointerClick(e,...i){for(let r of i)this.#a.bitByButton[r]=this.#y(e)}get on(){let e=[];for(let i in this.#e)this.isOn(i)&&e.push(i);return e.sort()}set onEvent(e){this.#l.onEvent=e,this.#u.onEvent=e,this.#a.onEvent=e,this.#m.onEvent=e}get point(){return this.#c}get pointer(){return this.#a}register(e){return globalThis[`${e}EventListener`]("blur",this.reset),this.#n.register(e),this.#l.register(e),this.#u.register(e),this.#a.register(e),this.#m.register(e),this}reset=()=>{this.#i=0,this.#p=0,this.handled=!1,this.#d=0,this.#o.length=0,this.#l.reset(),this.#u.reset(),this.#a.reset(),this.#c=void 0,this.#m.reset(),this.#f=void 0};get started(){return!this.handled&&this.#i!==this.#p}update(e){if(this.handled=!1,this.#l.update(),this.#a.update(),this.#p=this.#i,this.#i=this.#l.bits|this.#u.bits|(this.#a.primary?.bits??0),this.invalid=this.#i!==this.#p||this.#a.invalid||!!this.#m.deltaClient,this.gestured||=!!this.#i,this.#s.x=this.#s.y=0,(this.#e.U&this.#i)===this.#e.U&&(this.#s.y-=1),(this.#e.D&this.#i)===this.#e.D&&(this.#s.y+=1),(this.#e.L&this.#i)===this.#e.L&&(this.#s.x-=1),(this.#e.R&this.#i)===this.#e.R&&(this.#s.x+=1),(e>this.comboMaxIntervalMillis&&this.#i!==this.#p||this.#d+e>this.comboMaxIntervalMillis&&!this.#i)&&(this.#o.length=0),this.#i===this.#p?this.#d=this.#d+e:this.#d=e,this.#i&&this.#i!==this.#p&&(this.#p&&(this.#o.length=0),this.#o.push(this.#i)),this.#a.primary){let i=this.#a.pinchClient,r=this.#a.primary.drag&&!Object.values(this.#a.secondary).length,n=[];for(let d of Object.values(this.#a.secondary))n.push({type:d.type,click:d.clickClient?{client:d.clickClient,local:this.#r.clientToXYLocal(d.clickClient),...this.#r.clientToXY(d.clickClient)}:void 0,...this.#r.clientToXY(d.xyClient),client:d.xyClient,local:this.#r.clientToXYLocal(d.xyClient)});let o=this.#a.centerClient,a={client:o,local:this.#r.clientToXYLocal(o),...this.#r.clientToXY(o)};this.#c={center:a,click:this.#a.primary.clickClient?{client:this.#a.primary.clickClient,local:this.#r.clientToXYLocal(this.#a.primary.clickClient),...this.#r.clientToXY(this.#a.primary.clickClient)}:void 0,drag:{on:r,start:!this.#c?.drag.on&&r,end:!!this.#c?.drag.on&&!r},invalid:this.#a.invalid,pinch:i?{client:i,xy:this.#r.clientToXY(i)}:void 0,secondary:n,type:this.#a.primary.type,...this.#r.clientToXY(this.#a.primary.xyClient),client:this.#a.primary.xyClient,local:this.#r.clientToXYLocal(this.#a.primary.xyClient)}}else this.#c=void 0;this.#f=this.#m.deltaClient?{delta:{client:this.#m.deltaClient,xy:this.#r.clientToXY(this.#m.deltaClient)}}:void 0,this.#u.postupdate(),this.#a.postupdate(),this.#m.postupdate()}[Symbol.dispose](){this.register("remove")}get wheel(){return this.#f}#h(e){let i=0;for(let r of e)i|=this.#e[r]??0;return i}#y(e){let i=this.#e[e]??=1<<Object.keys(this.#e).length;return this.#t[i]=e,i}};function y(t){return t!=null&&!Array.isArray(t)&&typeof t=="object"}function ze(t){return t[0]?`${t[0].toLocaleLowerCase()}${t.slice(1)}`:t}function We(t,e,i,r){let n={default:new Set};for(let[o,a]of Object.entries(t.zoo))n[o]=new Set(a.map(d=>Tt(d,e,i,r)));return{background:t.background?parseInt(t.background,16):void 0,minScale:t.minScale,minWH:t.minWH?Yt(t.minWH):void 0,zoo:n,zoomOut:t.zoomOut}}function $(t){if(!t||typeof t=="number"){let e=t??0;return{n:e,s:e,w:e,e}}return"x"in t||"y"in t?{n:t.y??0,s:t.y??0,w:t.x??0,e:t.x??0}:{n:t.n??0,s:t.s??0,w:t.w??0,e:t.e??0}}function St(t,e,i){let r=h(t.pressed,e,i);t.z&&(r.z=c[t.z]),r.visible=!1;let n=h(t.selected,e,i);return t.z&&(n.z=c[t.z]),{pressed:r,selected:n,started:!1,type:t.type??"Button"}}function Et(t,e){if(!t.sprite)throw Error("cursor missing sprite");return t.sprite.visible=!1,{bounds:{x:0,y:0,w:0,h:0},keyboard:e.keyboard??0,pick:e.pick,point:t.sprite.tag}}function Tt(t,e,i,r){let n={};for(let o in t){let a=o;n[a]=i(n,t,a,e,r)??Rt(n,t,a,e,r)}return n.invalid=!0,n}function Rt(t,e,i,r,n){if(e[i]!=null)switch(i){case"button":return St(e[i],r,n);case"cursor":return Et(t,e[i]);case"fps":return Ct(e[i]);case"hud":return Pt(e[i]);case"cam":case"draw":case"debugInput":case"id":case"name":case"text":return e[i];case"ninePatch":return Bt(t,e[i],r,n);case"override":return Lt(e[i]);case"sprite":return h(e[i],r,n);case"textWH":return Mt(e[i]);case"textXY":return _t(t,e[i]);default:}}function Ct(t){return{prevFrames:0,next:{created:performance.now(),startClears:0}}}function Pt(t){return{fill:t.fill,margin:$(t.margin??0),modulo:At(t.modulo??0),origin:t.origin}}function Bt(t,e,i,r){if(!t.sprite)throw Error("nine patch missing sprite");let n={center:e.patch.center==null?void 0:h(e.patch.center,i,r),n:e.patch.n==null?void 0:h(e.patch.n,i,r),s:e.patch.s==null?void 0:h(e.patch.s,i,r),w:e.patch.w==null?void 0:h(e.patch.w,i,r),e:e.patch.e==null?void 0:h(e.patch.e,i,r),nw:e.patch.nw==null?void 0:h(e.patch.nw,i,r),ne:e.patch.ne==null?void 0:h(e.patch.ne,i,r),sw:e.patch.sw==null?void 0:h(e.patch.sw,i,r),se:e.patch.se==null?void 0:h(e.patch.se,i,r)},o=$(e.border),a={border:o,pad:$(e.pad),patch:n};return n.center&&(n.center.z=t.sprite.z),n.n&&(n.n.h=o.n,(!y(e.patch.n)||e.patch.n.z==null)&&(n.n.z=t.sprite.z)),n.s&&(n.s.h=o.s,(!y(e.patch.s)||e.patch.s.z==null)&&(n.s.z=t.sprite.z)),n.w&&(n.w.w=o.w,(!y(e.patch.w)||e.patch.w.z==null)&&(n.w.z=t.sprite.z)),n.e&&(n.e.w=o.e,(!y(e.patch.e)||e.patch.e.z==null)&&(n.e.z=t.sprite.z)),n.nw&&(n.nw.w=o.w,n.nw.h=o.n,(!y(e.patch.nw)||e.patch.nw.z==null)&&(n.nw.z=t.sprite.z)),n.ne&&(n.ne.w=o.e,n.ne.h=o.n,(!y(e.patch.ne)||e.patch.ne.z==null)&&(n.ne.z=t.sprite.z)),n.sw&&(n.sw.w=o.w,n.sw.h=o.s,(!y(e.patch.sw)||e.patch.sw.z==null)&&(n.sw.z=t.sprite.z)),n.se&&(n.se.w=o.e,n.se.h=o.s,(!y(e.patch.se)||e.patch.se.z==null)&&(n.se.z=t.sprite.z)),a}function Lt(t){return{invalid:t.invalid}}function h(t,e,i){let r=typeof t=="string"?"default":ze(t.pool??"Default");if(!e[r])throw Error(`no ${r} sprite pool`);let n=e[r].alloc();if(typeof t=="string"){if(!(t in i.anim))throw Error(`no tag "${t}"`);return n.tag=t,n}if(t.tag!=null){if(!(t.tag in i.anim))throw Error(`no tag "${t.tag}"`);n.tag=t.tag}return n.visible=t.visible??t.tag!=null,t.flip&&(n.flipX=t.flip==="X"||t.flip==="XY",n.flipY=t.flip==="Y"||t.flip==="XY"),t.stretch!=null&&(n.stretch=t.stretch),t.w!=null&&(n.w=t.w),t.h!=null&&(n.h=t.h),t.scale!=null&&(n.w*=typeof t.scale=="number"?t.scale:t.scale.x??1,n.h*=typeof t.scale=="number"?t.scale:t.scale.y??1),t.x!=null&&(n.x=t.x),t.y!=null&&(n.y=t.y),t.z!=null&&(n.z=c[t.z]),t.zend!=null&&(n.zend=t.zend),n}function Mt(t){return{layout:{chars:[],cursor:{x:0,y:0},w:0,h:0,trimmedH:0},maxW:t.maxW??Be.w,pad:$(t.pad),scale:t.scale??1,trim:t.trim}}function _t(t,e){return{chars:[],z:e.z?c[e.z]:t.sprite?.z??c.Bottom}}function Yt(t){return typeof t=="number"?{w:t,h:t}:{w:Number(t?.w??0),h:Number(t?.h??0)}}function At(t){return typeof t=="number"?{x:t,y:t}:{x:t.x??0,y:t.y??0}}var N=class{#e;#t;#i=0;#r;#o;constructor(e){if(e.allocBytes<=0)throw Error("byte allocation must be > 0");if(e.pageBlocks<=0)throw Error("page blocks must be > 0");this.#t={...e,init:e.init??(()=>{}),minPages:e.minPages??1};let i=this.#t.minPages*e.pageBlocks;this.#e=new Array(i),this.#r=new Uint8Array,this.#s(i,"Init")}alloc(){this.#i>=this.#n&&this.#s(this.#n+this.#t.pageBlocks,"Call");let e=this.#e[this.#i];return e.i=this.#i*this.#t.allocBytes,this.#i++,this.#t.init(e),e}clear(){this.#i=0;let e=this.#t.minPages*this.#t.pageBlocks;this.#n>e&&this.#s(e,"Call")}free(e){if(!this.#i)throw Error("pool underflow");this.#i--;let i=this.#i*this.#t.allocBytes;this.#r.copyWithin(e.i,i,i+this.#t.allocBytes),this.#e[this.#i].i=e.i,[this.#e[e.i],this.#e[this.#i]]=[this.#e[this.#i],this.#e[e.i]];let r=Math.floor((this.#n-this.#i)/this.#t.pageBlocks);r&&this.#n/this.#t.pageBlocks-r>=this.#t.minPages&&this.#s(this.#n-r*this.#t.pageBlocks,"Call")}get size(){return this.#i}get view(){return this.#o}toDebugString(){let e="";for(let i=0;i<this.#r.buffer.byteLength;i++)i&&!(i%this.#t.allocBytes)&&(e+=" "),e+=this.#r[i].toString(16).padStart(2,"0");return e}get#n(){return this.#r.buffer.byteLength/this.#t.allocBytes}#s(e,i){i==="Call"&&l?.mem&&console.debug(`[mem] ${e<this.#n?"shrinking":"growing"} pool to ${e}`),this.#e.length=e;for(let o=this.#n;o<e;o++)this.#e[o]=this.#t.alloc(this);let r=new ArrayBuffer(e*this.#t.allocBytes),n=new Uint8Array(r);n.set(this.#r.subarray(0,e*this.#t.allocBytes)),this.#r=n,this.#o=new DataView(r)}};function G(t){return new N({alloc:e=>new B(e,0,t.atlas,t.looper),init:e=>e.init(),allocBytes:x,...t})}var K=class{#e;constructor(e){this.#e=e*16807%2147483647,this.#e<=0&&(this.#e=(this.#e+2147483646)%2147483646+1)}get num(){return this.#e=this.#e*16807%2147483647,(this.#e-1)/2147483646}get seed(){return this.#e}};var Q=s;function Z(t,e){return((e==="Sec"?0:(59-t.getSeconds()%60)*1e3)+1e3-t.getMilliseconds()%1e3)%(e==="Sec"?1e3:6e4)}function De(){document.body.style.margin="0",document.body.style.width="100dvw",document.body.style.height="100dvh",document.body.style.overflow="hidden"}function Ie(t){if(!document.querySelector('meta[name="viewport"]')){let e=document.createElement("meta");e.name="viewport",e.content="width=device-width, maximum-scale=1, minimum-scale=1, user-scalable=no",document.head.appendChild(e)}if(t&&!document.querySelector('meta[name="description"]')){let e=document.createElement("meta");e.name="description",e.content=t,document.head.appendChild(e)}}function Ue(t,e){if(t??=document.createElement("canvas"),t.width=0,t.style.cursor="none",t.style.display="block",t.style.outline="none",e==="Int"&&(t.style.imageRendering="pixelated"),t.style.touchAction="none",t.tabIndex=0,t.focus(),!t.parentNode){let i=document.createElement("main");i.style.backgroundColor=document.body.style.backgroundColor,i.style.height="100%",i.append(t),document.body.append(i)}return t}function Oe(t){return`#${t.toString(16).padStart(8,"0")}`}function Ve(t){let[e,i,r,n]=t.match(/[0-9.]+/g)?.map(Number)??[];return(Math.round(e??0)<<24|Math.round(i??0)<<16|Math.round(r??0)<<8|Math.round((n??1)*255))>>>0}var J=class{#e;#t;#i=0;#r;#o=0;constructor(e,i,r){this.#e=e,this.#t=i,this.#r=r}register(e){return e==="add"?this.#o=setTimeout(()=>{this.#r(),this.#i=setInterval(this.#r,this.#t)},this.#e()):(clearTimeout(this.#o),clearInterval(this.#i)),this}[Symbol.dispose](){this.register("remove")}};async function qe(t){let e=new Promise((i,r)=>{t.onload=()=>i(t),t.onerror=()=>r(Error(`image load error for ${t.src}`))});return t.complete?t:await e}var j=class{onChange=()=>{};#e;register(e){return this.#e?.removeEventListener("change",this.#t),e==="add"?(this.#e=matchMedia(`not (resolution: ${devicePixelRatio}dppx)`),this.#e.addEventListener("change",this.#t)):this.#e=void 0,this}[Symbol.dispose](){this.register("remove")}#t=()=>{this.register("add"),this.onChange()}};function $e(t,e,i,r){let n=Xt(t,e,i);return t.useProgram(n),{buffer:t.createBuffer(),program:n,textures:r,uniform:kt(t,n),vao:t.createVertexArray()}}function kt(t,e){let i=e?t.getProgramParameter(e,t.ACTIVE_UNIFORMS):0,r=l?.render?new Proxy({},{get(n,o){if(n[o]==null)throw Error(`no shader uniform "${o}"`);return n[o]}}):{};for(let n=0;n<i;++n){let o=t.getActiveUniform(e,n);if(!o)throw Error(`no shader uniform at index ${n}`);let a=t.getUniformLocation(e,o.name);if(!a)throw Error(`no shader uniform "${o.name}"`);let d=o.name.replace("[0]","");r[d]=a}return r}function Xt(t,e,i){let r=t.createProgram();if(!r)return null;let n=Fe(t,"VERTEX_SHADER",e),o=Fe(t,"FRAGMENT_SHADER",i);if(!n||!o)return null;if(t.attachShader(r,n),t.attachShader(r,o),t.linkProgram(r),l?.render&&!t.getProgramParameter(r,t.LINK_STATUS)){let a=t.getProgramInfoLog(r)?.slice(0,-1);throw Error(`shader link failure; ${a}`)}return t.detachShader(r,o),t.detachShader(r,n),t.deleteShader(o),t.deleteShader(n),r}function Fe(t,e,i){let r=t.createShader(t[e]);if(!r)return r;if(t.shaderSource(r,i.trim()),t.compileShader(r),l?.render&&!t.getShaderParameter(r,t.COMPILE_STATUS)){let n=t.getShaderInfoLog(r)?.slice(0,-1);throw Error(`shader compile failure; ${n}`)}return r}var Ne=`#version 300 es
14
- #pragma debug(${l?.render?"on":"off"})
15
- #pragma optimize(${l?.render?"off":"on"})
16
-
17
- precision highp int;
18
- precision highp float;
19
- precision highp usampler2D;
20
-
21
- uniform sampler2D uTex;
22
- uniform uvec2 uTexWH;
23
-
24
- flat in uint vStretch;
25
- flat in ivec4 vTexXYWH;
26
- flat in uint vVisible;
27
- in vec2 vDstWH;
28
- flat in ivec2 vDstWHFixed;
29
-
30
- out vec4 oRGBA;
31
-
32
- void main() {
33
- if (vVisible == 0u || vDstWHFixed.x == 0 || vDstWHFixed.y == 0)
34
- discard;
35
-
36
- vec2 px = vec2(vTexXYWH.xy) + (
37
- vStretch == 1u ? (vDstWH * vec2(vTexXYWH.zw) / vec2(vDstWHFixed))
38
- : mod(vDstWH, vec2(vTexXYWH.zw))
39
- );
40
-
41
- oRGBA = texture(uTex, px / vec2(uTexWH));
42
- if(oRGBA.a < .001) discard;
43
- }
44
- `;var Ge=`#version 300 es
45
- #pragma debug(${l?.render?"on":"off"})
46
- #pragma optimize(${l?.render?"off":"on"})
47
-
48
- // https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/WebGL_best_practices#essl300_minimum_requirements_webgl_2
49
- precision highp int;
50
- precision highp float;
51
- precision highp usampler2D;
52
-
53
- uniform ivec4 uCam;
54
- uniform usampler2D uCels;
55
- uniform float uAge;
56
-
57
- layout (location=0) in ivec2 iUV;
58
- layout (location=1) in uint iy8_x24;
59
- layout (location=2) in uint iw8_sxyz_llll_y16;
60
- layout (location=3) in uint ii11_c5_h12_w4;
61
- layout (location=4) in uint r31_v;
62
-
63
- const int maxY = 0x20000;
64
- const int layers = 16;
65
- const int maxDepth = maxY * layers;
66
-
67
- flat out uint vStretch;
68
- flat out ivec4 vTexXYWH;
69
- flat out uint vVisible;
70
- out vec2 vDstWH;
71
- flat out ivec2 vDstWHFixed;
72
-
73
- void main() {
74
- int x = int(floor(float(int((iy8_x24 & 0xffffffu) << 8) >> 8) / 64.));
75
- int y = int(floor(float(int(iy8_x24 >> 24) | (int(iw8_sxyz_llll_y16 & 0xffffu) << 16 >> 8)) / 64.));
76
- int z = int((iw8_sxyz_llll_y16 >> 16) & 0xfu);
77
- bool zend = bool(iw8_sxyz_llll_y16 & 0x100000u);
78
- bool flipY = bool(iw8_sxyz_llll_y16 & 0x200000u);
79
- bool flipX = bool(iw8_sxyz_llll_y16 & 0x400000u);
80
- bool stretch = bool(iw8_sxyz_llll_y16 & 0x800000u);
81
- int id = int((ii11_c5_h12_w4 >> 17) & 0x7ff0u); // ignore cel.
82
- int cel = int((ii11_c5_h12_w4 >> 16) & 0xfu); // ignore the MSB.
83
- int w = int(((ii11_c5_h12_w4 & 0xfu) << 8) | (iw8_sxyz_llll_y16 >> 24));
84
- int h = int((ii11_c5_h12_w4 >> 4) & 0xfffu);
85
- bool visible = bool(r31_v & 0x1u);
86
-
87
- // https://www.patternsgameprog.com/opengl-2d-facade-25-get-the-z-of-a-pixel
88
- float depth = float((${c.Top} - z + 1) * maxY - (y + (zend ? 0 : h))) / float(maxDepth);
89
-
90
- ivec2 targetWH = iUV * ivec2(w, h);
91
-
92
- vec2 end = vec2(x + targetWH.x, y + targetWH.y);
93
- // UI layers are always given in screen coordinates.
94
- // to-do: how to handle non-int mode?
95
- vec2 camXY = z >= ${c.UIA} ? vec2(0, 0) : vec2(uCam.xy);
96
- vec2 clip = ((-2. * camXY + 2. * end) / vec2(uCam.zw) - 1.) * vec2(1, -1);
97
- gl_Position = vec4(clip, depth, 1);
98
-
99
- int frame = (((int(uAge / ${62.5}) & 0x1f) - cel) + ${16}) & 0xf;
100
- uvec4 texXYWH = texelFetch(uCels, ivec2(0, id + frame), 0);
101
- vTexXYWH = ivec4(texXYWH);
102
- vVisible = uint(visible);
103
-
104
- vDstWH = vec2(targetWH * ivec2(flipX ? -1 : 1, flipY ? -1 : 1));
105
- vDstWHFixed = ivec2(w, h) * ivec2(flipX ? -1 : 1, flipY ? -1 : 1);
106
-
107
- vStretch = stretch ? 1u : 0u;
108
- }
109
- `;var Ke=new Int8Array([1,1,0,1,1,0,0,0]),ee=class{always=l?.render==="always";clears=0;loseContext;#e;#t;#i;#r=0;#o=!0;#n;#s=!1;#l;constructor(e,i,r){this.#e=e,this.#i=i,this.#l=r}clear(e){if(!this.#n)return;let{gl:i}=this.#n;this.#r!==e&&(this.#r=e,i.clearColor((e>>>24&255)/255,(e>>>16&255)/255,(e>>>8&255)/255,(e>>>0&255)/255)),i.clear(i.COLOR_BUFFER_BIT|i.DEPTH_BUFFER_BIT),this.clears++}draw(e){if(!this.#t||!this.#n)return;let{gl:i,spriteShader:r}=this.#n;if(i.bindBuffer(i.ARRAY_BUFFER,r.buffer),i.bufferData(i.ARRAY_BUFFER,e.view,i.DYNAMIC_DRAW,0,e.size*x),i.bindBuffer(i.ARRAY_BUFFER,null),i.bindVertexArray(r.vao),i.drawArraysInstanced(i.TRIANGLE_STRIP,0,Ke.length/2,e.size),i.bindVertexArray(null),l?.render){let n=i.getError();n!==i.NO_ERROR&&console.error(`[render] GL error x${n.toString(16)}`)}this.#s=!1}get hasContext(){return this.#n!=null}get invalid(){return this.#s||this.always}load(e){this.#t=e,this.#n=this._Context()}predraw(e){if(!this.#n)return;let{gl:i,spriteShader:r,viewport:n}=this.#n;Se(n,e)||(i.viewport(0,0,e.w,e.h),n.w=e.w,n.h=e.h),i.useProgram(r.program),i.uniform4i(r.uniform.uCam,Math.floor(e.x),Math.floor(e.y),e.w,e.h),i.uniform1f(r.uniform.uAge,this.#l.age);for(let[o,a]of r.textures.entries())i.activeTexture(i.TEXTURE0+o),i.bindTexture(i.TEXTURE_2D,a)}register(e){return this.#i[`${e}EventListener`]("webglcontextlost",this.#d),this.#i[`${e}EventListener`]("webglcontextrestored",this.#u),this}setDepth(e){this.#o=e,this.#n&&(e?this.#n.gl.enable(this.#n.gl.DEPTH_TEST):this.#n.gl.disable(this.#n.gl.DEPTH_TEST))}[Symbol.dispose](){this.register("remove")}_Context(){let e=this.#n?.gl??Ht(this.#i,this.always);if(!e)return;let i=$e(e,Ge,Ne,[e.createTexture(),e.createTexture()]);return e.enable(e.BLEND),e.blendFuncSeparate(e.SRC_ALPHA,e.ONE_MINUS_SRC_ALPHA,e.ONE,e.ONE_MINUS_SRC_ALPHA),this.setDepth(this.#o),e.depthRange(0,1),e.clearDepth(1),e.depthFunc(e.LESS),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,!1),e.bindVertexArray(i.vao),e.bindBuffer(e.ARRAY_BUFFER,e.createBuffer()),e.bufferData(e.ARRAY_BUFFER,Ke,e.STATIC_DRAW),e.enableVertexAttribArray(0),e.vertexAttribIPointer(0,2,e.BYTE,0,0),e.bindBuffer(e.ARRAY_BUFFER,null),e.bindBuffer(e.ARRAY_BUFFER,i.buffer),e.enableVertexAttribArray(1),e.vertexAttribIPointer(1,1,e.UNSIGNED_INT,x,0),e.vertexAttribDivisor(1,1),e.enableVertexAttribArray(2),e.vertexAttribIPointer(2,1,e.UNSIGNED_INT,x,4),e.vertexAttribDivisor(2,1),e.enableVertexAttribArray(3),e.vertexAttribIPointer(3,1,e.UNSIGNED_INT,x,8),e.vertexAttribDivisor(3,1),e.enableVertexAttribArray(4),e.vertexAttribIPointer(4,1,e.UNSIGNED_INT,x,12),e.vertexAttribDivisor(4,1),e.bindBuffer(e.ARRAY_BUFFER,null),e.bindTexture(e.TEXTURE_2D,i.textures[0]),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),this.#t&&e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,this.#t),e.bindTexture(e.TEXTURE_2D,null),e.bindTexture(e.TEXTURE_2D,i.textures[1]),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texImage2D(e.TEXTURE_2D,0,e.RGBA16UI,1,this.#e.celXYWH.length/4,0,e.RGBA_INTEGER,e.UNSIGNED_SHORT,new Uint16Array(this.#e.celXYWH)),e.bindTexture(e.TEXTURE_2D,null),e.bindVertexArray(null),e.uniform1i(i.uniform.uTex,0),e.uniform1i(i.uniform.uCels,1),this.#t&&e.uniform2ui(i.uniform.uTexWH,this.#t.naturalWidth,this.#t.naturalHeight),!this.#s&&l?.invalid&&console.debug("[invalid] renderer invalid"),this.#s=!0,this.loseContext=e.getExtension("WEBGL_lose_context")??void 0,this.#n={gl:e,spriteShader:i,viewport:{w:0,h:0}}}#d=e=>{e.preventDefault(),console.debug("[render] GL context lost"),this.#n=void 0};#u=()=>{console.debug("[render] GL context restored"),this.#n=this._Context()}};function Ht(t,e){let i=t.getContext("webgl2",{antialias:!1,powerPreference:"low-power",preserveDrawingBuffer:!0,...!l?.render&&{desynchronized:e}});if(!i){console.debug("[render] no GL context");return}return i}var te=class{age=0;onFrame;#e=0;#t=!1;#i=0;register(e){let i=`${e}EventListener`;return document[i]("visibilitychange",this.#n),e==="remove"&&this.#r(),this.#t=e==="add",this}requestFrame(){this.#e||document.hidden||!this.#t||(this.#i=performance.now(),this.#e=requestAnimationFrame(this.#o))}[Symbol.dispose](){this.register("remove")}#r(){this.#e&&cancelAnimationFrame(this.#e),this.#e=0}#o=()=>{let e=performance.now(),i=e-this.#i;this.age=e,this.#e=0,this.onFrame?.(i)};#n=e=>{e.isTrusted&&(document.hidden?this.#r():this.requestFrame())}};var ie=class{atlas;cam=new D;canvas;input;loader;looper=new te;pool;random;renderer;tick={ms:0,s:0};#e;#t;#i=!1;#r=new j;#o;#n=!1;#s=new ResizeObserver(()=>this.onResize());constructor(e){if(Ie(e.description),this.canvas=Ue(e.canvas,e.config.mode),!this.canvas.parentElement)throw Error("no canvas parent");if(this.#t=Ve(getComputedStyle(this.canvas.parentElement).backgroundColor),e.canvas||De(),this.cam.mode=e.config.mode,this.cam.update(this.canvas),this.random=e.random??new K(Date.now()),this.input=new F(this.cam,this.canvas),e.config.input!=="Custom"&&this.input.mapDefault(),this.input.onEvent=()=>this.onEvent(),this.#r.onChange=()=>this.onResize(),!e.atlas)throw Error("no atlas image");this.#e=e.atlas,this.atlas={default:e.config.atlas?He(e.config.atlas):{anim:{},celXYWH:[],tags:[]}},this.renderer=new ee(this.atlas.default,this.canvas,this.looper),this.pool={default:G({atlas:this.atlas.default,looper:this.looper,minPages:e.sprites?.minPages??3,pageBlocks:e.sprites?.pageBlocks??1e3})},this.looper.onFrame=i=>this.onFrame(i),this.loader=e.loader,l&&(globalThis.v=this)}alloc(e="default"){return this.pool[e].alloc()}get backgroundRGBA(){return this.#t}set backgroundRGBA(e){if(!this.canvas.parentElement)throw Error("no canvas parent");this.canvas.parentElement.style.backgroundColor=Oe(e),this.#t=e}get invalid(){return this.cam.invalid||this.renderer.invalid||this.#i}set invalid(e){this.#i=e}loadLevel(e,i,r){let n=We(e,this.pool,r,this.atlas[i]);return n.background!=null&&(this.backgroundRGBA=n.background),n.minScale!=null&&(this.cam.minScale=n.minScale),n.minWH!=null&&(this.cam.minWH=n.minWH),n.zoomOut!=null&&(this.cam.zoomOut=n.zoomOut),n.zoo}onEvent(){this.requestFrame("Force")}onFrame(e){this.tick.ms=e,this.tick.s=e/1e3,!document.hidden&&(this.input.update(e),this.requestFrame(),this.#i=!1,this.loader.update(this),this.cam.postupdate())}onPoll(){this.requestFrame("Force")}onResize(){this.requestFrame("Force")}setPoller(e,i){this.#o&&this.#o.register("remove"),this.#o=new J(i??(()=>0),e,()=>this.onPoll()),this.#n&&this.#o.register("add")}async register(e){this.input.register(e),this.renderer.register(e),this.looper.register(e),e==="add"?this.#s.observe(this.canvas.parentElement):this.#s.unobserve(this.canvas.parentElement),this.#r.register(e),e==="add"&&this.looper.requestFrame(),this.#o?.register(e),await qe(this.#e),this.renderer.load(this.#e),this.#n=e==="add"}requestFrame(e){(e||this.renderer.always||this.input.anyOn||this.input.gamepad)&&this.looper.requestFrame()}async[Symbol.asyncDispose](){await this.register("remove")}};var Qe="void 2D game library demo.";var Ze={atlas:{anim:{"background--OrangeCheckerboard":{cels:1,h:2,id:0,w:2},"background--GreyCheckerboard":{cels:1,h:2,id:1,w:2},"background--Kiwi":{cels:1,h:2,id:2,w:2},"background--Strawberry":{cels:1,h:2,id:3,w:2},"background--Grape":{cels:1,h:2,id:4,w:2},"background--Blueberry":{cels:1,h:2,id:5,w:2},"background--Bubblegum":{cels:1,h:2,id:6,w:2},"background--Transparent":{cels:1,h:2,id:7,w:2},"background--Black":{cels:1,h:2,id:8,w:2},"backpacker--WalkRight":{cels:16,h:13,hitbox:{x:2,y:0,w:4,h:4},id:9,w:8},"backpacker--WalkDown":{cels:16,h:13,hitbox:{x:2,y:0,w:4,h:4},id:10,w:8},"backpacker--WalkUp":{cels:16,h:13,hitbox:{x:2,y:0,w:4,h:4},id:11,w:8},"cursor--Pointer":{cels:1,h:14,hitbox:{x:0,y:0,w:2,h:2},hurtbox:{x:0,y:0,w:2,h:2},id:12,w:8},"mem-prop-5x6--00":{cels:1,h:6,id:13,w:5},"mem-prop-5x6--01":{cels:1,h:6,id:14,w:5},"mem-prop-5x6--02":{cels:1,h:6,id:15,w:5},"mem-prop-5x6--03":{cels:1,h:6,id:16,w:5},"mem-prop-5x6--04":{cels:1,h:6,id:17,w:5},"mem-prop-5x6--05":{cels:1,h:6,id:18,w:5},"mem-prop-5x6--06":{cels:1,h:6,id:19,w:5},"mem-prop-5x6--07":{cels:1,h:6,id:20,w:5},"mem-prop-5x6--08":{cels:1,h:6,id:21,w:5},"mem-prop-5x6--09":{cels:1,h:6,id:22,w:5},"mem-prop-5x6--0a":{cels:1,h:6,id:23,w:5},"mem-prop-5x6--0b":{cels:1,h:6,id:24,w:5},"mem-prop-5x6--0c":{cels:1,h:6,id:25,w:5},"mem-prop-5x6--0d":{cels:1,h:6,id:26,w:5},"mem-prop-5x6--0e":{cels:1,h:6,id:27,w:5},"mem-prop-5x6--0f":{cels:1,h:6,id:28,w:5},"mem-prop-5x6--10":{cels:1,h:6,id:29,w:5},"mem-prop-5x6--11":{cels:1,h:6,id:30,w:5},"mem-prop-5x6--12":{cels:1,h:6,id:31,w:5},"mem-prop-5x6--13":{cels:1,h:6,id:32,w:5},"mem-prop-5x6--14":{cels:1,h:6,id:33,w:5},"mem-prop-5x6--15":{cels:1,h:6,id:34,w:5},"mem-prop-5x6--16":{cels:1,h:6,id:35,w:5},"mem-prop-5x6--17":{cels:1,h:6,id:36,w:5},"mem-prop-5x6--18":{cels:1,h:6,id:37,w:5},"mem-prop-5x6--19":{cels:1,h:6,id:38,w:5},"mem-prop-5x6--1a":{cels:1,h:6,id:39,w:5},"mem-prop-5x6--1b":{cels:1,h:6,id:40,w:5},"mem-prop-5x6--1c":{cels:1,h:6,id:41,w:5},"mem-prop-5x6--1d":{cels:1,h:6,id:42,w:5},"mem-prop-5x6--1e":{cels:1,h:6,id:43,w:5},"mem-prop-5x6--1f":{cels:1,h:6,id:44,w:5},"mem-prop-5x6--20":{cels:1,h:6,id:45,w:5},"mem-prop-5x6--21":{cels:1,h:6,id:46,w:5},"mem-prop-5x6--22":{cels:1,h:6,id:47,w:5},"mem-prop-5x6--23":{cels:1,h:6,id:48,w:5},"mem-prop-5x6--24":{cels:1,h:6,id:49,w:5},"mem-prop-5x6--25":{cels:1,h:6,id:50,w:5},"mem-prop-5x6--26":{cels:1,h:6,id:51,w:5},"mem-prop-5x6--27":{cels:1,h:6,id:52,w:5},"mem-prop-5x6--28":{cels:1,h:6,id:53,w:5},"mem-prop-5x6--29":{cels:1,h:6,id:54,w:5},"mem-prop-5x6--2a":{cels:1,h:6,id:55,w:5},"mem-prop-5x6--2b":{cels:1,h:6,id:56,w:5},"mem-prop-5x6--2c":{cels:1,h:6,id:57,w:5},"mem-prop-5x6--2d":{cels:1,h:6,id:58,w:5},"mem-prop-5x6--2e":{cels:1,h:6,id:59,w:5},"mem-prop-5x6--2f":{cels:1,h:6,id:60,w:5},"mem-prop-5x6--30":{cels:1,h:6,id:61,w:5},"mem-prop-5x6--31":{cels:1,h:6,id:62,w:5},"mem-prop-5x6--32":{cels:1,h:6,id:63,w:5},"mem-prop-5x6--33":{cels:1,h:6,id:64,w:5},"mem-prop-5x6--34":{cels:1,h:6,id:65,w:5},"mem-prop-5x6--35":{cels:1,h:6,id:66,w:5},"mem-prop-5x6--36":{cels:1,h:6,id:67,w:5},"mem-prop-5x6--37":{cels:1,h:6,id:68,w:5},"mem-prop-5x6--38":{cels:1,h:6,id:69,w:5},"mem-prop-5x6--39":{cels:1,h:6,id:70,w:5},"mem-prop-5x6--3a":{cels:1,h:6,id:71,w:5},"mem-prop-5x6--3b":{cels:1,h:6,id:72,w:5},"mem-prop-5x6--3c":{cels:1,h:6,id:73,w:5},"mem-prop-5x6--3d":{cels:1,h:6,id:74,w:5},"mem-prop-5x6--3e":{cels:1,h:6,id:75,w:5},"mem-prop-5x6--3f":{cels:1,h:6,id:76,w:5},"mem-prop-5x6--40":{cels:1,h:6,id:77,w:5},"mem-prop-5x6--41":{cels:1,h:6,id:78,w:5},"mem-prop-5x6--42":{cels:1,h:6,id:79,w:5},"mem-prop-5x6--43":{cels:1,h:6,id:80,w:5},"mem-prop-5x6--44":{cels:1,h:6,id:81,w:5},"mem-prop-5x6--45":{cels:1,h:6,id:82,w:5},"mem-prop-5x6--46":{cels:1,h:6,id:83,w:5},"mem-prop-5x6--47":{cels:1,h:6,id:84,w:5},"mem-prop-5x6--48":{cels:1,h:6,id:85,w:5},"mem-prop-5x6--49":{cels:1,h:6,id:86,w:5},"mem-prop-5x6--4a":{cels:1,h:6,id:87,w:5},"mem-prop-5x6--4b":{cels:1,h:6,id:88,w:5},"mem-prop-5x6--4c":{cels:1,h:6,id:89,w:5},"mem-prop-5x6--4d":{cels:1,h:6,id:90,w:5},"mem-prop-5x6--4e":{cels:1,h:6,id:91,w:5},"mem-prop-5x6--4f":{cels:1,h:6,id:92,w:5},"mem-prop-5x6--50":{cels:1,h:6,id:93,w:5},"mem-prop-5x6--51":{cels:1,h:6,id:94,w:5},"mem-prop-5x6--52":{cels:1,h:6,id:95,w:5},"mem-prop-5x6--53":{cels:1,h:6,id:96,w:5},"mem-prop-5x6--54":{cels:1,h:6,id:97,w:5},"mem-prop-5x6--55":{cels:1,h:6,id:98,w:5},"mem-prop-5x6--56":{cels:1,h:6,id:99,w:5},"mem-prop-5x6--57":{cels:1,h:6,id:100,w:5},"mem-prop-5x6--58":{cels:1,h:6,id:101,w:5},"mem-prop-5x6--59":{cels:1,h:6,id:102,w:5},"mem-prop-5x6--5a":{cels:1,h:6,id:103,w:5},"mem-prop-5x6--5b":{cels:1,h:6,id:104,w:5},"mem-prop-5x6--5c":{cels:1,h:6,id:105,w:5},"mem-prop-5x6--5d":{cels:1,h:6,id:106,w:5},"mem-prop-5x6--5e":{cels:1,h:6,id:107,w:5},"mem-prop-5x6--5f":{cels:1,h:6,id:108,w:5},"mem-prop-5x6--60":{cels:1,h:6,id:109,w:5},"mem-prop-5x6--61":{cels:1,h:6,id:110,w:5},"mem-prop-5x6--62":{cels:1,h:6,id:111,w:5},"mem-prop-5x6--63":{cels:1,h:6,id:112,w:5},"mem-prop-5x6--64":{cels:1,h:6,id:113,w:5},"mem-prop-5x6--65":{cels:1,h:6,id:114,w:5},"mem-prop-5x6--66":{cels:1,h:6,id:115,w:5},"mem-prop-5x6--67":{cels:1,h:6,id:116,w:5},"mem-prop-5x6--68":{cels:1,h:6,id:117,w:5},"mem-prop-5x6--69":{cels:1,h:6,id:118,w:5},"mem-prop-5x6--6a":{cels:1,h:6,id:119,w:5},"mem-prop-5x6--6b":{cels:1,h:6,id:120,w:5},"mem-prop-5x6--6c":{cels:1,h:6,id:121,w:5},"mem-prop-5x6--6d":{cels:1,h:6,id:122,w:5},"mem-prop-5x6--6e":{cels:1,h:6,id:123,w:5},"mem-prop-5x6--6f":{cels:1,h:6,id:124,w:5},"mem-prop-5x6--70":{cels:1,h:6,id:125,w:5},"mem-prop-5x6--71":{cels:1,h:6,id:126,w:5},"mem-prop-5x6--72":{cels:1,h:6,id:127,w:5},"mem-prop-5x6--73":{cels:1,h:6,id:128,w:5},"mem-prop-5x6--74":{cels:1,h:6,id:129,w:5},"mem-prop-5x6--75":{cels:1,h:6,id:130,w:5},"mem-prop-5x6--76":{cels:1,h:6,id:131,w:5},"mem-prop-5x6--77":{cels:1,h:6,id:132,w:5},"mem-prop-5x6--78":{cels:1,h:6,id:133,w:5},"mem-prop-5x6--79":{cels:1,h:6,id:134,w:5},"mem-prop-5x6--7a":{cels:1,h:6,id:135,w:5},"mem-prop-5x6--7b":{cels:1,h:6,id:136,w:5},"mem-prop-5x6--7c":{cels:1,h:6,id:137,w:5},"mem-prop-5x6--7d":{cels:1,h:6,id:138,w:5},"mem-prop-5x6--7e":{cels:1,h:6,id:139,w:5},"mem-prop-5x6--7f":{cels:1,h:6,id:140,w:5},"oidoid--Default":{cels:1,h:16,id:141,w:16}},celXY:[22,37,21,27,21,29,21,31,20,33,22,33,20,35,22,35,20,37,24,26,24,26,8,16,8,16,0,16,0,16,16,14,16,14,72,13,72,13,32,26,32,26,0,16,0,16,64,13,64,13,56,13,56,13,48,13,48,13,40,13,40,13,32,13,32,13,56,13,56,13,24,13,24,13,72,0,72,0,64,0,64,0,24,0,24,0,56,0,56,0,48,0,48,0,48,0,48,0,24,0,24,0,40,0,40,0,32,0,32,0,32,0,32,0,16,0,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,45,56,40,56,10,53,5,53,0,53,35,51,30,51,25,51,20,51,15,51,35,45,70,50,65,50,60,50,55,50,50,50,45,50,40,50,10,47,5,47,0,47,70,62,50,56,65,62,60,62,55,62,50,62,45,62,40,62,10,59,5,59,0,59,35,57,70,32,30,57,25,57,20,57,15,57,75,56,70,56,65,56,60,56,75,50,55,56,10,35,75,32,15,33,0,35,5,35,40,38,45,38,65,32,60,32,55,32,50,32,45,32,40,26,50,26,55,26,60,26,65,26,70,26,75,26,16,27,0,29,5,29,10,29,40,32,45,26,10,41,30,45,25,45,20,45,15,45,75,44,70,44,65,44,60,44,55,44,50,44,45,44,40,44,50,38,5,41,0,41,35,39,30,39,25,39,20,39,15,39,75,38,70,38,65,38,60,38,55,38,45,56,0,0]},input:"Default",mode:"Int"};var Je={$schema:"../level/level-file.v0.json",minWH:{w:320,h:240},zoo:{default:[{name:"Debug",debugInput:{}},{name:"Cam",cam:{}},{id:"Cursor",sprite:{tag:"cursor--Pointer"},cursor:{}},{name:"FPS",fps:{},text:"",sprite:{z:"UIA"},textWH:{trim:"Descender"},hud:{origin:"SE",margin:4},textXY:{},override:{invalid:!1}},{name:"Overlay",sprite:{pool:"Overlay",tag:"background--GreyCheckerboard",w:4095,h:4095,z:"Top"}},{id:"RenderToggle",name:"RenderToggle",text:"render",sprite:{z:"UID"},textWH:{pad:2,scale:2,trim:"Leading"},hud:{origin:"NE",margin:{n:2,e:2}},ninePatch:{border:1,pad:2,patch:{center:"background--Grape",n:"background--Bubblegum",s:"background--Kiwi",w:"background--Strawberry",e:"background--Blueberry"}},button:{pressed:"background--Bubblegum",selected:"background--OrangeCheckerboard",type:"Toggle",z:"UIC"},renderToggle:{},textXY:{z:"UIE"}},{name:"Clock",text:"",sprite:{z:"UIF"},clock:{},textWH:{scale:2,trim:"Descender"},hud:{margin:{y:4},origin:"S"},textXY:{}},{name:"Logo",sprite:{tag:"oidoid--Default",z:"UIF"},hud:{origin:"SW",margin:4}},{name:"Border",sprite:{z:"UIG"},hud:{origin:"NW",fill:"XY"},ninePatch:{patch:{n:"background--Black",s:"background--Black",w:"background--Black",e:"background--Black",nw:"background--Black",ne:"background--Black",sw:"background--Black",se:"background--Black"},border:1}},{name:"Backpacker",sprite:{tag:"backpacker--WalkRight",x:7,y:7,z:"C",stretch:!0,scale:5}},{name:"Tally",text:"",sprite:{z:"UIA"},tally:{},textWH:{},hud:{origin:"NE",margin:{n:4,e:60}},textXY:{},override:{invalid:!1}},{name:"Draw",draw:{}}]}};var re=class{query="cam";update(e,i){i.input.isAnyOnStart("U","D","L","R")&&i.cam.diagonalize(i.input.dir);let r=L(25*i.tick.s);i.cam.x+=i.input.dir.x*r,i.cam.y+=i.input.dir.y*r,i.input.wheel?.delta.xy.y&&(i.cam.zoomOut-=i.input.wheel.delta.client.y*.01),i.cam.update(i.canvas)}};var ne=class{query="clock & text";update(e){v(e,It(new Date))}};function It(t){let e=`${t.getHours()%12||12}`.padStart(2," "),i=`${t.getMinutes()}`.padStart(2,"0"),r=`${t.getSeconds()}`.padStart(2,"0");return`${e}:${i}:${r}`}var oe=class{query="draw";update(e,i){i.invalid&&(i.renderer.clear(i.backgroundRGBA),i.renderer.predraw(i.cam),i.renderer.setDepth(!0),i.renderer.draw(i.pool.default),i.renderer.setDepth(!1),i.renderer.draw(i.pool.overlay))}};var se=class{query="button & renderToggle & sprite";update(e,i){i.renderer.always=T(e)}};var ae=class{query="tally & text";update(e,i){e.tally.updates++;let r=[`${`${e.tally.updates}`.padStart(8," ")} updates`,`${`${i.renderer.clears+1}`.padStart(8," ")} renders`].join(`
110
- `);v(e,r)}};var je=(t,e,i)=>{if(e[i]==null)throw Error("no component val");switch(i){case"clock":return e[i];case"renderToggle":if(!t.button)throw Error("no button in render toggle");return we(t,l?.render==="always"),e[i];case"tally":return{updates:0}}};var le=class{cursor;#e;#t={button:new P,cursor:new M,debugInput:new _,fps:new k,hud:new X,ninePatch:new H,override:new z,sprite:new W,textWH:new Y,textXY:new A,cam:new re,clock:new ne,draw:new oe,renderToggle:new se,tally:new ae};#i={default:new Set};update(e){switch(this.#e){case void 0:this.#r(e);break;case"Init":break;default:this.#e}for(let i of Object.values(this.#i))Xe(i,this.#t,e)}#r(e){e.pool.overlay=G({atlas:e.atlas.default,looper:e.looper,pageBlocks:10}),e.setPoller((l?.seconds?1:60)*1e3,()=>Z(new Date,l?.seconds?"Sec":"Min")),this.#i=e.loadLevel(Je,"default",je),this.cursor=ke(this.#i.default,"Cursor"),this.#e="Init"}};console.debug(`void v${Q.version}+${Q.published}.${Q.hash} \u2500\u2500\u2500oidoid>\xB0\u2500\u2500`);var et=new ie({atlas:document.querySelector("#atlas"),config:Ze,description:Qe,loader:new le});et.setPoller((l?.seconds?1:60)*1e3,()=>Z(new Date,l?.seconds?"Sec":"Min"));await et.register("add");
111
- //# sourceMappingURL=index.js.map
112
- </script>
113
-
114
-
115
- </body></html>