/
index.js
138 lines (114 loc) · 4.59 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/**
* @author Richard Davey <rich@photonstorm.com>, Michael Kelly <me@mkelly.me>
* @copyright 2019 Photon Storm Ltd.
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
*/
export default function registerTiledJSONExternalLoader(Phaser) {
const FileTypesManager = Phaser.Loader.FileTypesManager;
const GetFastValue = Phaser.Utils.Objects.GetFastValue;
const IsPlainObject = Phaser.Utils.Objects.IsPlainObject;
const JSONFile = Phaser.Loader.FileTypes.JSONFile;
const MultiFile = Phaser.Loader.MultiFile;
class TiledJSONExternalFile extends MultiFile {
constructor(loader, key, tilemapURL, path, baseURL, tilemapXhrSettings, tilesetXhrSettings) {
if (IsPlainObject(key)) {
const config = key;
key = GetFastValue(config, 'key');
tilemapURL = GetFastValue(config, 'url');
tilemapXhrSettings = GetFastValue(config, 'xhrSettings');
path = GetFastValue(config, 'path');
baseURL = GetFastValue(config, 'baseURL');
tilesetXhrSettings = GetFastValue(config, 'tilesetXhrSettings');
}
const tilemapFile = new JSONFile(loader, key, tilemapURL, tilemapXhrSettings);
super(loader, 'tilemapJSON', key, [tilemapFile]);
this.config.path = path;
this.config.baseURL = baseURL;
this.config.tilesetXhrSettings = tilesetXhrSettings;
}
onFileComplete(file) {
const index = this.files.indexOf(file);
if (index !== -1) {
this.pending--;
if (file.type === 'json' && file.data.hasOwnProperty('tilesets')) {
// Inspect the data for the files to now load
const tilesets = file.data.tilesets;
const config = this.config;
const loader = this.loader;
const currentBaseURL = loader.baseURL;
const currentPath = loader.path;
const currentPrefix = loader.prefix;
const baseURL = GetFastValue(config, 'baseURL', currentBaseURL);
const path = GetFastValue(config, 'path', currentPath);
const prefix = GetFastValue(config, 'prefix', currentPrefix);
const tilesetXhrSettings = GetFastValue(config, 'tilesetXhrSettings');
loader.setBaseURL(baseURL);
loader.setPath(path);
loader.setPrefix(prefix);
for (const [index, tileset] of tilesets.entries()) {
if (!tileset.source) {
continue;
}
// Tileset is relative to the tilemap filename, so we abuse URL to
// get the relative path.
const url = new URL(file.src, 'http://example.com');
url.pathname += `/../${tileset.source}`;
const tilesetUrl = url.pathname.slice(1);
const tilesetFile = new JSONFile(
loader,
`_TILESET_${file.key}_${tilesetUrl}`,
tilesetUrl,
tilesetXhrSettings,
);
tilesetFile.tilesetIndex = index;
this.addToMultiFile(tilesetFile);
loader.addFile(tilesetFile);
}
// Reset the loader settings
loader.setBaseURL(currentBaseURL);
loader.setPath(currentPath);
loader.setPrefix(currentPrefix);
}
}
}
addToCache() {
if (this.isReadyToProcess()) {
const tilemapFile = this.files[0];
for (const file of this.files.slice(1)) {
const index = file.tilesetIndex;
tilemapFile.data.tilesets[index] = {
...tilemapFile.data.tilesets[index],
...file.data,
source: undefined, // Avoid throwing in tilemap creator
};
}
this.loader.cacheManager.tilemap.add(tilemapFile.key, {
format: Phaser.Tilemaps.Formats.TILED_JSON,
data: tilemapFile.data,
});
this.complete = true;
for (const file of this.files) {
file.pendingDestroy();
}
}
}
}
FileTypesManager.register(
'tilemapTiledJSONExternal',
function (key, tilemapURL, path, baseURL, tilemapXhrSettings) {
// Supports an Object file definition in the key argument
// Or an array of objects in the key argument
// Or a single entry where all arguments have been defined
if (Array.isArray(key)) {
for (var i = 0; i < key.length; i++) {
const multifile = new TiledJSONExternalFile(this, key[i]);
this.addFile(multifile.files);
}
} else {
const multifile = new TiledJSONExternalFile(this, key, tilemapURL, path, baseURL, tilemapXhrSettings);
this.addFile(multifile.files);
}
return this;
},
);
}