@bscotch/stitch
Version:
Stitch: The GameMaker Studio 2 Asset Pipeline Development Kit.
152 lines • 4.51 kB
JavaScript
import { listFilesByExtensionSync } from '@bscotch/utility';
import { yyObjectEventNames, yyObjectEventNums, } from '@bscotch/yy';
import { assert } from '../../../utility/errors.js';
import paths from '../../../utility/paths.js';
import { findTokenReferences } from '../../parser/codeParser.js';
import { Gms2ResourceBase, } from './Gms2ResourceBase.js';
export class Gms2ObjectEvent {
data;
dir;
io;
constructor(data, dir, io) {
this.data = data;
this.dir = dir;
this.io = io;
}
get eventNum() {
return this.data.eventNum;
}
get eventType() {
return this.data.eventType;
}
/**
* @example
* "Draw"
*/
get name() {
const name = yyObjectEventNames[this.data.eventType];
assert(name, `Unknown event type ${this.data.eventType}`);
return name;
}
/**
* @example
* "Draw_0"
*/
get fullName() {
return `${this.name}_${this.data.eventNum}`;
}
get fileName() {
return `${this.fullName}.gml`;
}
get filePath() {
return paths.join(this.dir, this.fileName);
}
get code() {
if (!this.io.storage.existsSync(this.filePath)) {
return '';
}
return this.io.storage.readTextSync(this.filePath);
}
set code(code) {
this.io.storage.writeBlobSync(this.filePath, code);
}
}
export class Gms2Object extends Gms2ResourceBase {
constructor(...setup) {
super('objects', ...setup);
}
/* This object's parent object. */
get parentName() {
return this.yyData.parentObjectId?.name;
}
/**
* Set this object's parent object.
* **WARNING** does not check if that object exists.
*/
set parentName(name) {
this.yyData.parentObjectId = name
? {
name,
path: `objects/${name}/${name}.yy`,
}
: null;
this.save();
}
get spriteName() {
return this.yyData.spriteId?.name;
}
set spriteName(name) {
this.yyData.spriteId = name
? {
name,
path: `sprites/${name}/${name}.yy`,
}
: null;
this.save();
}
get codeFilePathsAbsolute() {
return listFilesByExtensionSync(this.yyDirAbsolute, 'gml');
}
findEvent(eventType, eventNum = 0) {
return this.events().find((e) => {
if (e.eventType !== eventNum) {
return false;
}
return typeof eventType === 'string'
? e.name === eventType
: e.eventNum === eventType;
});
}
addEvent(eventType, eventNum = 0) {
let event = this.findEvent(eventType, eventNum);
if (!event) {
this.yyData.eventList.push({
isDnD: false,
eventNum,
eventType,
collisionObjectId: null,
resourceVersion: '1.0',
name: '',
tags: [],
resourceType: 'GMEvent',
});
this.save();
event = this.findEvent(eventType, eventNum);
assert(event, `Could not find event ${eventNum} after creating it`);
}
return event;
}
addCreateEvent() {
return this.addEvent(yyObjectEventNums.Create);
}
events() {
return this.yyData.eventList.map((data) => new Gms2ObjectEvent(data, this.yyDirAbsolute, this.io));
}
findTokenReferences(token, options) {
const refs = [];
for (const event of this.events()) {
refs.push(...findTokenReferences(event.code, token, {
resource: this,
suffixPattern: options?.suffix,
includeSelf: options?.includeSelf,
sublocation: event.fullName,
}));
}
return refs;
}
/**
* Create a new object
* @param subimageDirectory Absolute path to a directory containing the
* subimages for this sprite. Will non-recursively
* search for png images within that directory
* and sort them alphabetically.
*/
static async create(name, comms) {
const obj = new Gms2Object(name, comms);
await obj.replaceYyFile({
name: obj.name,
});
return obj;
}
}
//# sourceMappingURL=Gms2Object.js.map