@osbjs/osbjs
Version:
a minimalist osu! storyboarding framework
163 lines (162 loc) • 8.14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ImportOsb = void 0;
const Core_1 = require("../Core");
const fs_1 = require("fs");
class ImportOsb extends Core_1.Component {
/**
* Import existing osb file. Useful if you are doing collab with people using different develop platforms like storybrew, sgl etc.
* @param osbPath Full path to .osb file.
*/
constructor(osbPath) {
super();
this.name = 'importOsb';
if (!(0, fs_1.existsSync)(osbPath))
throw new Error("ImportOsb: osb file doesn't exists");
this._osb = (0, fs_1.readFileSync)(osbPath, 'utf-8');
}
generate() {
const components = getComponentsFromOsb(this._osb);
components.forEach((component) => {
this.registerComponents(component);
});
}
}
exports.ImportOsb = ImportOsb;
function getComponentsFromOsb(raw) {
let components = [];
const sprites = parseSprites(raw), animations = parseAnimations(raw), samples = parseSamples(raw);
components = components.concat(sprites, animations, samples);
return components;
}
function parseSprites(raw) {
let sArr = raw.match(/Sprite,\w+,\w+,\".+\",-*\w+\.*\w*,-*\w+\.*\w*\r*\n((?:[ _]+\w+,\w+,-*\w+\.*\w*,-*\w*\.*\w*,.*\r*\n*)+)/g)?.map((str) => {
// @ts-ignore
const { layer, origin, path, x, y } = extractProps(str);
const sprite = new Core_1.Sprite(path, layer, origin, new Core_1.OsbVector2(x, y));
registerCommands(str, sprite);
return sprite;
});
function extractProps(str) {
const _init = str.match(/Sprite,\w+,\w+,\".+\",-*\w+\.*\w*,-*\w+\.*\w*/g)?.toString();
// @ts-ignore
const props = _init.split(',');
const layer = Core_1.Layer[props[1]], origin = Core_1.Origin[props[2]], path = props[3].replace(/\"/g, ''), x = parseInt(props[4]), y = parseInt(props[5]);
return { layer, origin, path, x, y };
}
return sArr ?? [];
}
function parseSamples(raw) {
let sArr = raw.match(/Sample,-*\w+,\w+,\".+\",\w+\.*\w*/g)?.map((str) => {
// @ts-ignore
const { startTime, layer, path, volume } = extractProps(str);
const sample = new Core_1.Sample(startTime, layer, path, volume);
return sample;
});
function extractProps(str) {
const props = str.split(',');
const startTime = parseInt(props[1]), layer = Core_1.SampleLayer[Core_1.SampleLayer[parseInt(props[2])]], path = props[3].replace(/\"/g, ''), volume = parseInt(props[4]);
return { startTime, layer, path, volume };
}
return sArr ?? [];
}
function parseAnimations(raw) {
let aArr = raw
.match(/Animation,\w+,\w+,\".+\",-*\w+\.*\w*,-*\w+\.*\w*,\w+,\w+,\w+\r*\n((?:[ _]+\w+,\w+,-*\w+\.*\w*,-*\w*\.*\w*,.*\r*\n*)+)/g)
?.map((str) => {
// @ts-ignore
const { layer, origin, path, x, y, frameCount, frameDelay, loopType } = extractProps(str);
const animation = new Core_1.Animation(path, frameCount, frameDelay, loopType, layer, origin, new Core_1.OsbVector2(x, y));
registerCommands(str, animation);
return animation;
});
function extractProps(str) {
const _init = str.match(/Animation,\w+,\w+,\".+\",-*\w+,-*\w+,\w+,\w+,\w+/g)?.toString();
// @ts-ignore
const props = _init.split(',');
const layer = Core_1.Layer[props[1]], origin = Core_1.Origin[props[2]], path = props[3].replace(/\"/g, ''), x = parseInt(props[4]), y = parseInt(props[5]), frameCount = parseInt(props[6]), frameDelay = parseInt(props[7]), loopType = Core_1.LoopType[props[8]];
return { layer, origin, path, x, y, frameCount, frameDelay, loopType };
}
return aArr ?? [];
}
function registerCommands(str, component) {
const _commands = str.match(/[ _]+\w+,\w+,-*\w+\.*\w*,-*\w*\.*\w*,.*/g);
let tempLoop, tempTrigger;
// @ts-ignore
for (let i = 0; i < _commands.length; i++) {
// @ts-ignore
const _command = _commands[i];
const params = _command.split(',');
const commandName = params[0].replace(/[ _]+/g, '');
if (commandName == 'L') {
const startTime = parseInt(params[1]), count = parseInt(params[2]);
tempLoop = new Core_1.Loop(startTime, count);
}
else if (commandName == 'T') {
const triggerName = params[1], startTime = parseInt(params[2]), endTime = params[3] ? parseInt(params[3]) : startTime;
tempTrigger = new Core_1.Trigger(triggerName, startTime, endTime);
}
else {
// no longer in group
if (!_command.startsWith(' ') && !_command.startsWith('__')) {
if (tempLoop) {
component.Loop(tempLoop);
tempLoop = undefined;
}
if (tempTrigger) {
component.Trigger(tempTrigger);
tempTrigger = undefined;
}
}
if (tempLoop) {
registerCommand(_command.replace(/[ _]+/g, ''), tempLoop);
}
else if (tempTrigger) {
registerCommand(_command.replace(/[ _]+/g, ''), tempTrigger);
}
else {
registerCommand(_command.replace(/[ _]+/g, ''), component);
}
}
}
}
function registerCommand(command, component) {
const params = command.split(',');
const commandName = params[0], easing = Core_1.Easing[Core_1.Easing[parseInt(params[1])]], startTime = parseInt(params[2]), endTime = params[3] ? parseInt(params[3]) : startTime;
if (commandName == 'F') {
const startOpacity = parseFloat(params[4]), endOpacity = params[5] ? parseFloat(params[5]) : startOpacity;
component.Fade(startTime, endTime, startOpacity, endOpacity, easing);
}
if (commandName == 'S') {
const startScale = parseFloat(params[4]), endScale = params[5] ? parseFloat(params[5]) : startScale;
component.Scale(startTime, endTime, startScale, endScale, easing);
}
if (commandName == 'R') {
const startAngle = parseFloat(params[4]), endAngle = params[5] ? parseFloat(params[5]) : startAngle;
component.Rotate(startTime, endTime, startAngle, endAngle, easing);
}
if (commandName == 'M') {
const startX = parseFloat(params[4]), startY = parseFloat(params[5]), endX = params[6] ? parseFloat(params[6]) : startX, endY = params[7] ? parseFloat(params[7]) : startY;
component.Move(startTime, endTime, new Core_1.OsbVector2(startX, startY), new Core_1.OsbVector2(endX, endY), easing);
}
if (commandName == 'V') {
const startX = parseFloat(params[4]), startY = parseFloat(params[5]), endX = params[6] ? parseFloat(params[6]) : startX, endY = params[7] ? parseFloat(params[7]) : startY;
component.ScaleVec(startTime, endTime, new Core_1.OsbVector2(startX, startY), new Core_1.OsbVector2(endX, endY), easing);
}
if (commandName == 'MX') {
const startX = parseFloat(params[4]), endX = params[5] ? parseFloat(params[5]) : startX;
component.MoveX(startTime, endTime, startX, endX, easing);
}
if (commandName == 'MY') {
const startY = parseFloat(params[4]), endY = params[5] ? parseFloat(params[5]) : startY;
component.MoveY(startTime, endTime, startY, endY, easing);
}
if (commandName == 'P') {
const p = Core_1.Parameter[params[4]];
component.Parameter(startTime, endTime, p);
}
if (commandName == 'C') {
const startR = parseFloat(params[4]), startG = parseFloat(params[5]), startB = parseFloat(params[6]), endR = params[7] ? parseFloat(params[7]) : startR, endG = params[8] ? parseFloat(params[8]) : startG, endB = params[9] ? parseFloat(params[9]) : startB;
component.Color(startTime, endTime, new Core_1.OsbColor(startR, startG, startB), new Core_1.OsbColor(endR, endG, endB), easing);
}
}