@canvasengine/tiled 2.0.0-beta.25

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 (54) hide show
  1. package/dist/classes/Gid.d.ts +13 -0
  2. package/dist/classes/Layer.d.ts +26 -0
  3. package/dist/classes/Map.d.ts +232 -0
  4. package/dist/classes/Object.d.ts +8 -0
  5. package/dist/classes/Properties.d.ts +11 -0
  6. package/dist/classes/Tile.d.ts +19 -0
  7. package/dist/classes/Tileset.d.ts +13 -0
  8. package/dist/generate/tileset.d.ts +11 -0
  9. package/dist/generate/wangtile.d.ts +21 -0
  10. package/dist/index.d.ts +16 -0
  11. package/dist/index.js +6205 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/parser/open-file.d.ts +24 -0
  14. package/dist/parser/parser.d.ts +27 -0
  15. package/dist/types/Layer.d.ts +116 -0
  16. package/dist/types/Map.d.ts +72 -0
  17. package/dist/types/Objects.d.ts +57 -0
  18. package/dist/types/Text.d.ts +47 -0
  19. package/dist/types/Tile.d.ts +17 -0
  20. package/dist/types/Tileset.d.ts +92 -0
  21. package/dist/types/Types.d.ts +147 -0
  22. package/dist/types/WorldMaps.d.ts +12 -0
  23. package/dist/utils.d.ts +10 -0
  24. package/package.json +31 -0
  25. package/readme.md +1 -0
  26. package/src/classes/Gid.ts +46 -0
  27. package/src/classes/Layer.ts +135 -0
  28. package/src/classes/Map.ts +443 -0
  29. package/src/classes/Object.ts +16 -0
  30. package/src/classes/Properties.ts +30 -0
  31. package/src/classes/Tile.ts +22 -0
  32. package/src/classes/Tileset.ts +34 -0
  33. package/src/generate/tileset.ts +35 -0
  34. package/src/generate/wangtile.ts +166 -0
  35. package/src/index.ts +16 -0
  36. package/src/parser/open-file.ts +155 -0
  37. package/src/parser/parser.ts +309 -0
  38. package/src/types/Layer.ts +127 -0
  39. package/src/types/Map.ts +83 -0
  40. package/src/types/Objects.ts +64 -0
  41. package/src/types/Text.ts +47 -0
  42. package/src/types/Tile.ts +19 -0
  43. package/src/types/Tileset.ts +99 -0
  44. package/src/types/Types.ts +157 -0
  45. package/src/types/WorldMaps.ts +13 -0
  46. package/src/utils.ts +22 -0
  47. package/tests/class.spec.ts +88 -0
  48. package/tests/data.ts +5440 -0
  49. package/tests/parser.spec.ts +112 -0
  50. package/tests/tile-properties.spec.ts +99 -0
  51. package/tests/tiledmap-multi-layers.spec.ts +99 -0
  52. package/tests/tiledmap.spec.ts +223 -0
  53. package/tsconfig.json +28 -0
  54. package/vite.config.ts +21 -0
@@ -0,0 +1,112 @@
1
+ import { TiledParser } from '../src/parser/parser'
2
+ import { TiledLayerType } from '../src/types/Layer'
3
+ import { xml, xmlDeepProperties, xmlGroup, xmlImage, xmlObject, xmlProperties, xmlText, xmlTile } from './data'
4
+ import { test, expect } from 'vitest'
5
+
6
+ test('propToNumber() method', () => {
7
+ const ret = TiledParser.propToNumber({
8
+ test: '1',
9
+ other: '2'
10
+ }, ['test'])
11
+ expect(ret.test).toBe(1)
12
+ expect(ret.other).toBe('2')
13
+ })
14
+
15
+ test('propToBool() method', () => {
16
+ const ret = TiledParser.propToBool({
17
+ test: 'true',
18
+ other: 'false',
19
+ foo: 'false'
20
+ }, ['test', 'other'])
21
+ expect(ret.test).toBe(true)
22
+ expect(ret.other).toBe(false)
23
+ expect(ret.foo).toBe('false')
24
+ })
25
+
26
+ test('toArray() method', () => {
27
+ const ret = TiledParser.toArray({ test: 1 })
28
+ expect(ret).toMatchObject([ { test: 1 }])
29
+ })
30
+
31
+ test('parseMap() method', () => {
32
+ const parser = new TiledParser(xml)
33
+ const map = parser.parseMap()
34
+ expect(map.version).toBe(1.8)
35
+ expect(map.width).toBe(10)
36
+ expect(map.layers).toHaveLength(2)
37
+ const layer = map.layers[0]
38
+ expect(layer).toHaveProperty('name', 'Tile Layer 1')
39
+ expect(layer).toHaveProperty('encoding', 'base64')
40
+ expect(layer).toHaveProperty('data')
41
+ })
42
+
43
+ test('parseMap() method - test data', () => {
44
+ const parser = new TiledParser(xml)
45
+ const map = parser.parseMap()
46
+ const data = map.layers[0].data
47
+ expect(data).toHaveLength(map.width * map.height)
48
+ expect(data[0]).toBe(1)
49
+ })
50
+
51
+ test('parseMap() method - test objectgroup', () => {
52
+ const parser = new TiledParser(xmlObject)
53
+ const map = parser.parseMap()
54
+ const layer = map.layers[1]
55
+ expect(layer.type).toBe(TiledLayerType.ObjectGroup)
56
+ expect(layer.objects).toHaveLength(1)
57
+ expect(layer.objects[0]).toMatchObject({ id: 1, x: 62.0593, y: 24.752, width: 19.0124, height: 20.0886 })
58
+ })
59
+
60
+ test('parseMap() method - test properties', () => {
61
+ const parser = new TiledParser(xmlProperties)
62
+ const map = parser.parseMap()
63
+ const layer = map.layers[1]
64
+ expect(layer.properties).toMatchObject({ test: 0 })
65
+ expect(layer.objects[0].properties).toMatchObject({ objectprop: 0 })
66
+ })
67
+
68
+ test('parseMap() method - test properties', () => {
69
+ const parser = new TiledParser(xmlDeepProperties)
70
+ const map = parser.parseMap()
71
+ const properties: any = map.properties
72
+ expect(properties.test).toHaveProperty('hp', 5)
73
+ expect(properties.test).toHaveProperty('mode', 'scenario')
74
+ expect(properties.test).toHaveProperty('_classname', 'Event')
75
+ })
76
+
77
+ test('parseMap() method - test group', () => {
78
+ const parser = new TiledParser(xmlGroup)
79
+ const map = parser.parseMap()
80
+ const layer = map.layers[2]
81
+ expect(layer.type).toBe(TiledLayerType.Group)
82
+ expect(layer.layers).toHaveLength(1)
83
+ expect(layer.properties).toMatchObject({ grouptest: 0 })
84
+ })
85
+
86
+ test('parseMap() method - test image', () => {
87
+ const parser = new TiledParser(xmlImage)
88
+ const map = parser.parseMap()
89
+ const layer = map.layers[1]
90
+ expect(layer.type).toBe(TiledLayerType.Image)
91
+ expect(layer).toHaveProperty('image')
92
+ expect(layer.image).toMatchObject({ source: 'assets/test.png', width: 1536, height: 2112 })
93
+ })
94
+
95
+ test('parseMap() method - test tileset', () => {
96
+ const parser = new TiledParser(xmlTile)
97
+ const map = parser.parseMap()
98
+ expect(map).toHaveProperty('tilesets')
99
+ expect(map.tilesets).toHaveLength(1)
100
+ const tileset = map.tilesets[0]
101
+ expect(tileset).toHaveProperty('firstgid', 1)
102
+ expect(tileset).toHaveProperty('source', '[Base]BaseChip_pipo.tsx')
103
+ })
104
+
105
+ test('parseMap() method - test text object', () => {
106
+ const parser = new TiledParser(xmlText)
107
+ const map = parser.parseMap()
108
+ const layer = map.layers[0].objects[0]
109
+ expect(layer).toHaveProperty('text')
110
+ expect(layer.text).toHaveProperty('text', 'Hello World')
111
+ expect(layer.text).toHaveProperty('wrap', true)
112
+ })
@@ -0,0 +1,99 @@
1
+ import { test, expect } from 'vitest'
2
+ import { TiledParser } from "../src/parser/parser"
3
+ import { MapClass } from '../src'
4
+
5
+ const xmlWithTileProperties = `<?xml version="1.0" encoding="UTF-8"?>
6
+ <map version="1.8" tiledversion="1.8.2" orientation="orthogonal" renderorder="right-down" width="2" height="2" tilewidth="32" tileheight="32" infinite="0" nextlayerid="2" nextobjectid="1">
7
+ <tileset firstgid="1" name="test" tilewidth="32" tileheight="32" tilecount="4" columns="2">
8
+ <image source="test.png" width="64" height="64"/>
9
+ <tile id="0">
10
+ <properties>
11
+ <property name="collision" type="bool" value="true"/>
12
+ <property name="damage" type="int" value="10"/>
13
+ </properties>
14
+ </tile>
15
+ <tile id="1">
16
+ <properties>
17
+ <property name="collision" type="bool" value="false"/>
18
+ <property name="heal" type="int" value="5"/>
19
+ </properties>
20
+ </tile>
21
+ </tileset>
22
+ <layer id="1" name="Tile Layer 1" width="2" height="2">
23
+ <data encoding="csv">
24
+ 1,2,
25
+ 3,4
26
+ </data>
27
+ </layer>
28
+ </map>`
29
+
30
+ const tileset = `<?xml version="1.0" encoding="UTF-8"?>
31
+ <tileset version="1.9" tiledversion="1.9.2" name="test" tilewidth="32" tileheight="32" tilecount="4" columns="2">
32
+ <image source="test.png" width="64" height="64"/>
33
+ <tile id="0">
34
+ <properties>
35
+ <property name="collision" type="bool" value="true"/>
36
+ <property name="damage" type="int" value="10"/>
37
+ </properties>
38
+ </tile>
39
+ <tile id="1">
40
+ <properties>
41
+ <property name="collision" type="bool" value="false"/>
42
+ <property name="heal" type="int" value="5"/>
43
+ </properties>
44
+ </tile>
45
+ </tileset>`
46
+
47
+ function getMap(xml: string): MapClass {
48
+ const parser = new TiledParser(xml)
49
+ const mapData = parser.parseMap()
50
+ mapData.tilesets = mapData.tilesets.map(source => {
51
+ const parserTileset = new TiledParser(tileset)
52
+ const tilesetData = parserTileset.parseTileset()
53
+ return {
54
+ ...source,
55
+ ...tilesetData
56
+ }
57
+ })
58
+ return new MapClass(mapData)
59
+ }
60
+
61
+ test('Tile properties should be preserved after creation', () => {
62
+ const map = getMap(xmlWithTileProperties)
63
+
64
+ // Get tile at position (0, 0) which should be tile ID 1 (firstgid=1, so tile 0 from tileset)
65
+ const tileInfo = map.getTileByPosition(0, 0)
66
+ const [tile] = tileInfo.tiles
67
+
68
+ expect(tile).toBeDefined()
69
+ expect(tile.properties).toBeDefined()
70
+ expect(Object.keys(tile.properties)).toHaveLength(2)
71
+ expect(tile.getProperty('collision')).toBe(true)
72
+ expect(tile.getProperty('damage')).toBe(10)
73
+ })
74
+
75
+ test('Multiple tiles should have their own properties', () => {
76
+ const map = getMap(xmlWithTileProperties)
77
+
78
+ // Get tile at position (32, 0) which should be tile ID 2 (tile 1 from tileset)
79
+ const tileInfo = map.getTileByPosition(32, 0)
80
+ const [tile] = tileInfo.tiles
81
+
82
+ expect(tile).toBeDefined()
83
+ expect(tile.properties).toBeDefined()
84
+ expect(Object.keys(tile.properties)).toHaveLength(2)
85
+ expect(tile.getProperty('collision')).toBe(false)
86
+ expect(tile.getProperty('heal')).toBe(5)
87
+ })
88
+
89
+ test('Tiles without properties should have empty properties object', () => {
90
+ const map = getMap(xmlWithTileProperties)
91
+
92
+ // Get tile at position (0, 32) which should be tile ID 3 (tile 2 from tileset, no properties defined)
93
+ const tileInfo = map.getTileByPosition(0, 32)
94
+ const [tile] = tileInfo.tiles
95
+
96
+ expect(tile).toBeDefined()
97
+ expect(tile.properties).toBeDefined()
98
+ expect(Object.keys(tile.properties)).toHaveLength(0)
99
+ })
@@ -0,0 +1,99 @@
1
+ import { TiledParser } from "../src/parser/parser"
2
+ import { tileset } from "./data"
3
+ import { MapClass } from '../src'
4
+ import { test, expect, describe, beforeEach } from 'vitest'
5
+
6
+ const getXmlMap = (properties = '') => `<?xml version="1.0" encoding="UTF-8"?>
7
+ <map version="1.8" tiledversion="1.8.2" orientation="orthogonal" renderorder="right-down" width="10" height="10" tilewidth="32" tileheight="32" infinite="0" nextlayerid="5" nextobjectid="5">
8
+ ${properties}
9
+ <tileset firstgid="1" source="[Base]BaseChip_pipo.tsx"/>
10
+ <layer id="1" name="Tile Layer 1" width="10" height="10">
11
+ <data encoding="base64">
12
+ AQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAA==
13
+ </data>
14
+ </layer>
15
+ <layer id="2" name="Tile Layer 2" width="10" height="10">
16
+ <data encoding="base64">
17
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
18
+ </data>
19
+ </layer>
20
+ <layer id="3" name="Tile Layer 3" width="10" height="10">
21
+ <data encoding="base64">
22
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
23
+ </data>
24
+ </layer>
25
+ </map>
26
+ `
27
+
28
+ const xml = getXmlMap()
29
+ const xmlLowMemory = getXmlMap(`
30
+ <properties>
31
+ <property name="low-memory" value="true" type="bool" />
32
+ </properties>
33
+ `)
34
+
35
+ function getMap(xml) {
36
+ const parser = new TiledParser(xml)
37
+ const mapData = parser.parseMap()
38
+ mapData.tilesets = mapData.tilesets.map(source => {
39
+ const parserTileset = new TiledParser(tileset)
40
+ const tilesetData = parserTileset.parseTileset()
41
+ return {
42
+ ...source,
43
+ ...tilesetData
44
+ }
45
+ })
46
+ return new MapClass(mapData)
47
+ }
48
+
49
+ test('Has 3 Layers', () => {
50
+ const map = getMap(xml)
51
+ expect(map.layers).toHaveLength(3)
52
+ })
53
+
54
+ test('Test Allocate memory Size', () => {
55
+ const map = getMap(xml)
56
+ expect(map['allocateMemory']).toBe(3)
57
+ })
58
+
59
+ describe('Get Tile In Memory', () => {
60
+ test('3 tiles found', () => {
61
+ const map = getMap(xml)
62
+ const { tiles } = map.getTileByIndex(44)
63
+ expect(tiles).toHaveLength(3)
64
+ })
65
+
66
+ test('3 tiles found', () => {
67
+ const map = getMap(xml)
68
+ const { tiles } = map.getTileByIndex(44)
69
+ expect(tiles[0].id).toBe(41)
70
+ expect(tiles[0].layerIndex).toBe(2)
71
+ expect(tiles[1].id).toBe(41)
72
+ expect(tiles[1].layerIndex).toBe(1)
73
+ expect(tiles[2].id).toBe(0)
74
+ expect(tiles[2].layerIndex).toBe(0)
75
+ })
76
+ })
77
+
78
+ describe('Memory Optimization', () => {
79
+ let map: MapClass
80
+
81
+ beforeEach(() => {
82
+ map = getMap(xmlLowMemory)
83
+ })
84
+
85
+ test('Test Allocate memory Size', () => {
86
+ expect(map['allocateMemory']).toBe(1)
87
+ })
88
+
89
+ test('1 tile only found', () => {
90
+ const { tiles } = map.getTileByIndex(44)
91
+ expect(tiles).toHaveLength(1)
92
+ })
93
+
94
+ test('1 tile only found', () => {
95
+ const { tiles } = map.getTileByIndex(44)
96
+ expect(tiles[0].id).toBe(41)
97
+ expect(tiles[0].layerIndex).toBe(2)
98
+ })
99
+ })
@@ -0,0 +1,223 @@
1
+ import { TiledParser } from "../src/parser/parser"
2
+ import { tileset, xml, xmlGroup, xmlObjectImage, xmlTile } from "./data"
3
+ import { Tileset } from '../src/classes/Tileset'
4
+ import { Layer, MapClass, Tile, TiledLayerType, TiledObjectClass } from '../src'
5
+ import { test, expect, describe } from 'vitest'
6
+
7
+ function getMap(xml) {
8
+ const parser = new TiledParser(xml)
9
+ const mapData = parser.parseMap()
10
+ mapData.tilesets = mapData.tilesets.map(source => {
11
+ const parserTileset = new TiledParser(tileset)
12
+ const tilesetData = parserTileset.parseTileset()
13
+ return {
14
+ ...source,
15
+ ...tilesetData
16
+ }
17
+ })
18
+ return new MapClass(mapData)
19
+ }
20
+
21
+
22
+ test('Map is loaded', () => {
23
+ const map = getMap(xml)
24
+ expect(map).toBeDefined()
25
+ expect(map.tilesets[0]).toBeInstanceOf(Tileset)
26
+ expect(map.layers[0]).toBeInstanceOf(Layer)
27
+ })
28
+
29
+ test('Map Tile Size', () => {
30
+ const map = getMap(xml)
31
+ expect(map.tileheight).toBe(32)
32
+ expect(map.tilewidth).toBe(32)
33
+ })
34
+
35
+ test('Layers', () => {
36
+ const map = getMap(xmlGroup)
37
+ expect(map.layers).toHaveLength(4)
38
+ expect(map.layers[2].type).toBe(TiledLayerType.Group)
39
+ })
40
+
41
+ test('Group Properties', () => {
42
+ const map = getMap(xmlGroup)
43
+ const layerGroup = map.layers[2]
44
+ const prop = layerGroup.getProperty<number>('grouptest')
45
+ expect(prop).toBe(0)
46
+ })
47
+
48
+ test('Layers Properties has parent', () => {
49
+ const map = getMap(xmlGroup)
50
+ const layer = map.layers[3]
51
+ const parent = layer.getLayerParent()
52
+ expect(parent).toBeInstanceOf(Layer)
53
+ expect(parent?.name).toBe('Group 1')
54
+ })
55
+
56
+ test('Layers Properties same properties of group parent', () => {
57
+ const map = getMap(xmlGroup)
58
+ const layerGroup = map.layers[3]
59
+ const prop = layerGroup.getProperty<number>('grouptest')
60
+ expect(prop).toBe(0)
61
+ })
62
+
63
+ test('Layers Properties same properties of group parent (incrementation z value)', () => {
64
+ const map = getMap(`<?xml version="1.0" encoding="UTF-8"?>
65
+ <map version="1.8" tiledversion="1.8.2" orientation="orthogonal" renderorder="right-down" width="10" height="10" tilewidth="32" tileheight="32" infinite="0" nextlayerid="5" nextobjectid="2">
66
+ <group id="3" name="Group 1">
67
+ <properties>
68
+ <property name="z" type="int" value="2"/>
69
+ </properties>
70
+ <layer id="4" name="Tile Layer 2" width="10" height="10">
71
+ <data encoding="base64">
72
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
73
+ </data>
74
+ <properties>
75
+ <property name="z" type="int" value="3"/>
76
+ </properties>
77
+ </layer>
78
+ </group>
79
+ </map>
80
+ `)
81
+ const layerGroup = map.layers[1]
82
+ const prop = layerGroup.getProperty<number>('z')
83
+ expect(prop).toBe(5)
84
+ })
85
+
86
+ test('Layers Properties same properties of group parent (erase parent value)', () => {
87
+ const map = getMap(`<?xml version="1.0" encoding="UTF-8"?>
88
+ <map version="1.8" tiledversion="1.8.2" orientation="orthogonal" renderorder="right-down" width="10" height="10" tilewidth="32" tileheight="32" infinite="0" nextlayerid="5" nextobjectid="2">
89
+ <group id="3" name="Group 1">
90
+ <properties>
91
+ <property name="test" type="int" value="2"/>
92
+ </properties>
93
+ <layer id="4" name="Tile Layer 2" width="10" height="10">
94
+ <data encoding="base64">
95
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
96
+ </data>
97
+ <properties>
98
+ <property name="test" type="int" value="3"/>
99
+ </properties>
100
+ </layer>
101
+ </group>
102
+ </map>
103
+ `)
104
+ const layerGroup = map.layers[1]
105
+ const prop = layerGroup.getProperty<number>('test')
106
+ expect(prop).toBe(3)
107
+ })
108
+
109
+ test('Opacity', () => {
110
+ const map = getMap(`<?xml version="1.0" encoding="UTF-8"?>
111
+ <map version="1.8" tiledversion="1.8.6" orientation="orthogonal" renderorder="right-down" width="10" height="10" tilewidth="32" tileheight="32" infinite="0" nextlayerid="14" nextobjectid="8">
112
+ <group id="13" name="Group 1" opacity="0.9">
113
+ <layer id="12" name="Tile Layer 1" width="10" height="10" opacity="0.56">
114
+ <data encoding="base64">
115
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
116
+ </data>
117
+ </layer>
118
+ </group>
119
+ </map>
120
+
121
+ `)
122
+ const layer1 = map.layers[0]
123
+ const layer2 = map.layers[1]
124
+ expect(layer1.opacity).toBe(0.9)
125
+ expect(layer2.opacity).toBe(0.5)
126
+ })
127
+
128
+ describe('Test Tiles Index', () => {
129
+ const xmlZ = `<?xml version="1.0" encoding="UTF-8"?>
130
+ <map version="1.8" tiledversion="1.8.2" orientation="orthogonal" renderorder="right-down" width="10" height="10" tilewidth="32" tileheight="32" infinite="0" nextlayerid="5" nextobjectid="5">
131
+ <tileset firstgid="1" source="[Base]BaseChip_pipo.tsx"/>
132
+ <layer id="1" name="Tile Layer 1" width="10" height="10">
133
+ <data encoding="base64">
134
+ AQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAA==
135
+ </data>
136
+ <properties>
137
+ <property name="z" type="int" value="1"/>
138
+ </properties>
139
+ </layer>
140
+ <layer id="2" name="Tile Layer 2" width="10" height="10">
141
+ <data encoding="base64">
142
+ AQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAA==
143
+ </data>
144
+ <properties>
145
+ <property name="z" type="int" value="2"/>
146
+ </properties>
147
+ </layer>
148
+ </map>
149
+ `
150
+
151
+ test('getTileIndex()', () => {
152
+ const map = getMap(xml)
153
+ const { width } = map
154
+ expect(map.getTileIndex(32, 32)).toEqual(width + 1)
155
+ })
156
+
157
+ test('getTilePosition() #1', () => {
158
+ const map = getMap(xml)
159
+ expect(map.getTilePosition(85)).toMatchObject({
160
+ x: 5 * 32,
161
+ y: 8 * 32
162
+ })
163
+ expect(map.getTilePosition(11)).toMatchObject({
164
+ x: 1 * 32,
165
+ y: 1 * 32
166
+ })
167
+ expect(map.getTilePosition(9)).toMatchObject({
168
+ x: 9 * 32,
169
+ y: 0 * 32
170
+ })
171
+ expect(map.getTilePosition(99)).toMatchObject({
172
+ x: 9 * 32,
173
+ y: 9 * 32
174
+ })
175
+ })
176
+
177
+ test('Tiles Index', () => {
178
+ const map = getMap(xml)
179
+ const tileInfo = map.getTileByIndex(0)
180
+ expect(tileInfo.tiles).toHaveLength(2)
181
+ expect(tileInfo.hasCollision).toBe(false)
182
+ })
183
+
184
+ test('Tiles Index, Not found layer', () => {
185
+ const map = getMap(xmlZ)
186
+ const tileInfo = map.getTileByIndex(0)
187
+ expect(tileInfo.tiles).toHaveLength(0)
188
+ expect(tileInfo.hasCollision).toBe(false)
189
+ })
190
+
191
+ test('Tiles Index, Z=1', () => {
192
+ const map = getMap(xmlZ)
193
+ const tileInfo = map.getTileByIndex(0, [32, 64])
194
+ expect(tileInfo.tiles).toHaveLength(2)
195
+ expect(tileInfo.hasCollision).toBe(false)
196
+ })
197
+
198
+ test('Tiles Index, Z=2', () => {
199
+ const map = getMap(xmlZ)
200
+ const tileInfo = map.getTileByIndex(0, [64, 64+32])
201
+ expect(tileInfo.tiles).toHaveLength(2)
202
+ expect(tileInfo.hasCollision).toBe(false)
203
+ })
204
+
205
+ const xmlFlipTiled = `<?xml version="1.0" encoding="UTF-8"?>
206
+ <map version="1.8" tiledversion="1.8.6" orientation="orthogonal" renderorder="right-down" width="10" height="10" tilewidth="32" tileheight="32" infinite="0" nextlayerid="14" nextobjectid="8">
207
+ <tileset firstgid="1" source="[Base]BaseChip_pipo.tsx"/>
208
+ <layer id="12" name="Tile Layer 1" width="10" height="10">
209
+ <data encoding="base64">
210
+ KQAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
211
+ </data>
212
+ </layer>
213
+ </map>
214
+ `
215
+
216
+ test('Get Flip Tile', () => {
217
+ const map = getMap(xmlFlipTiled)
218
+ const tileInfo = map.getTileByIndex(0)
219
+ const tile = tileInfo.tiles[0]
220
+ expect(tile.gid).toBe(41)
221
+ expect(tileInfo.hasCollision).toBe(true)
222
+ })
223
+ })
package/tsconfig.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "lib": ["dom", "esnext"],
5
+ "module": "ES2020",
6
+ "outDir": "./lib",
7
+ "rootDir": "./src",
8
+ "strict": true,
9
+ "sourceMap": true,
10
+ "strictNullChecks": true,
11
+ "strictPropertyInitialization": false,
12
+ "moduleResolution": "node",
13
+ "esModuleInterop": true,
14
+ "removeComments": false,
15
+ "noUnusedParameters": false,
16
+ "noUnusedLocals": false,
17
+ "noImplicitThis": false,
18
+ "noImplicitAny": false,
19
+ "noImplicitReturns": false,
20
+ "declaration": true,
21
+ "experimentalDecorators": true,
22
+ "emitDecoratorMetadata": true,
23
+ "stripInternal": true
24
+ },
25
+ "include": [
26
+ "src"
27
+ ]
28
+ }
package/vite.config.ts ADDED
@@ -0,0 +1,21 @@
1
+ import { defineConfig } from 'vite'
2
+ import dts from 'vite-plugin-dts'
3
+
4
+ export default defineConfig({
5
+ plugins: [
6
+ dts({
7
+ include: ['src/**/*.ts'],
8
+ outDir: 'dist'
9
+ })
10
+ ],
11
+ build: {
12
+ target: 'esnext',
13
+ sourcemap: true,
14
+ minify: false,
15
+ lib: {
16
+ entry: 'src/index.ts',
17
+ formats: ['es'],
18
+ fileName: 'index'
19
+ }
20
+ },
21
+ })