osbtools
Version:
A set of tools for working with osu! storyboards
108 lines (107 loc) • 4.6 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const enums_1 = require("../types/enums");
const parsers_1 = require("../utils/parsers");
const sbEmptyElement_1 = __importDefault(require("./sbEmptyElement"));
const layerData = (title) => ({
title,
elements: []
});
class Storyboard {
#elements = [];
#layers = {
[enums_1.ESbLayer.Background]: layerData("//Storyboard Layer 0 (Background)"),
[enums_1.ESbLayer.Fail]: layerData("//Storyboard Layer 1 (Fail)"),
[enums_1.ESbLayer.Pass]: layerData("//Storyboard Layer 2 (Pass)"),
[enums_1.ESbLayer.Foreground]: layerData("//Storyboard Layer 3 (Foreground)"),
[enums_1.ESbLayer.Overlay]: layerData("//Storyboard Layer 4 (Overlay)"),
[enums_1.ESbLayer.Sound]: layerData("//Storyboard Sound Samples")
};
constructor(osb) {
if (!osb)
return;
this.parse(osb, false);
}
addElement(element) {
this.#elements.push(element);
this.#layers[element.getData().layer].elements.push(element);
return this;
}
parse(osb, createNew = true) {
const sb = new Storyboard();
let currentPropertyType = null;
let currentPropertyTrimmedLine = null;
let currentGroupElement = new sbEmptyElement_1.default();
let currentElement = null;
const lines = osb.split("\n");
lines.forEach((line, index) => {
if (line.startsWith("//") || line.startsWith("["))
return;
const isElementTitle = line.startsWith(enums_1.ESbElementType.Sprite) ||
line.startsWith(enums_1.ESbElementType.Animation) ||
line.startsWith(enums_1.ESbElementType.Sample);
if (isElementTitle) {
currentElement = null;
}
const isElementProperty = line.startsWith(" ");
const isElementPropertyGroup = line.startsWith(" ");
if (currentElement) {
const trimmedLine = line.trim();
const type = trimmedLine.substring(0, trimmedLine[1] !== "," ? 2 : 1);
if (isElementProperty && !isElementPropertyGroup) {
currentPropertyType = type;
currentPropertyTrimmedLine = trimmedLine;
(0, parsers_1.parseElementProperty)(trimmedLine, type, currentElement);
}
else if (isElementPropertyGroup) {
const isLastElementPropertyGroup = (typeof lines[index + 1] === "string" && !lines[index + 1].startsWith(" ")) || !lines[index + 1];
(0, parsers_1.parseElementProperty)(trimmedLine, type, currentGroupElement);
if (isLastElementPropertyGroup && currentPropertyType && currentPropertyTrimmedLine) {
(0, parsers_1.parseElementGroupProperty)(currentPropertyTrimmedLine, currentPropertyType, currentElement, currentGroupElement);
currentGroupElement = new sbEmptyElement_1.default();
}
}
}
(0, parsers_1.parseElementTitle)(line, enums_1.ESbElementType.Sprite, (element) => {
currentElement = element;
});
(0, parsers_1.parseElementTitle)(line, enums_1.ESbElementType.Animation, (element) => {
currentElement = element;
});
(0, parsers_1.parseElementTitle)(line, enums_1.ESbElementType.Sample, (element) => {
currentElement = element;
});
if (currentElement && isElementTitle) {
if (!createNew)
this.addElement(currentElement);
else
sb.addElement(currentElement);
}
});
if (createNew)
return sb;
}
getElements() {
return this.#elements;
}
getElement(index) {
return this.#elements[index] || null;
}
getLayers() {
return this.#layers;
}
toString() {
return [
"[Events]",
"//Background and Video events",
...Object.entries(this.getLayers()).map(([, layerData]) => {
const { title, elements } = layerData ?? {};
return [title, ...elements.map((element) => element.toString())].join("\n");
})
].join("\n");
}
}
exports.default = Storyboard;