@bscotch/stitch
Version:
Stitch: The GameMaker Studio 2 Asset Pipeline Development Kit.
70 lines • 2.48 kB
JavaScript
import { yyRoomInstanceSchema, } from '@bscotch/yy';
import { camelCase } from 'change-case';
import { assert } from '../../../utility/errors.js';
import { info } from '../../../utility/log.js';
import { uuidV4 } from '../../../utility/uuid.js';
import { Gms2ResourceBase, } from './Gms2ResourceBase.js';
export class Gms2Room extends Gms2ResourceBase {
constructor(...setup) {
super('rooms', ...setup);
}
get instanceLayers() {
const layers = this.yyData.layers;
const instanceLayers = [];
for (const layer of layers) {
if ('instances' in layer) {
instanceLayers.push(layer);
}
}
return instanceLayers;
}
hasObjectInstance(object) {
const targetName = typeof object === 'string' ? object : object.name;
for (const instanceLayer of this.instanceLayers || []) {
for (const instance of instanceLayer.instances) {
if (instance.objectId.name === targetName) {
return true;
}
}
}
return false;
}
addObjectInstance(object, x = 0, y = 0) {
const instanceLayer = this.instanceLayers[0];
assert(instanceLayer, `No instance layer found in room ${this.name}`);
// Add to the list of instances in the instance layer
const instanceName = camelCase(uuidV4()); // Need a unique identifier;
const newInstance = yyRoomInstanceSchema.parse({
name: instanceName,
x,
y,
objectId: object.id,
});
instanceLayer.instances.push(newInstance);
// Add to the instancing order
this.yyData.instanceCreationOrder.push({
name: instanceName,
path: `rooms/${this.name}/${this.name}.yy`,
});
info(`Added object ${object.name} instance to room ${this.name}`);
return this.save();
}
static async create(name, comms) {
const room = new Gms2Room(name, comms);
await room.replaceYyFile({
name,
layers: [
{
resourceType: 'GMRBackgroundLayer',
},
{
resourceType: 'GMRInstanceLayer',
},
],
// Rooms start with 8 views
views: Array.from({ length: 8 }).map(() => ({})),
});
return room;
}
}
//# sourceMappingURL=Gms2Room.js.map