forked from RDCNWebs/rd.rdlevel.cn
1413 lines
53 KiB
JavaScript
1413 lines
53 KiB
JavaScript
// AssetManager.ts
|
|
var Point = class _Point {
|
|
x = 0;
|
|
y = 0;
|
|
constructor(x, y) {
|
|
if (x !== void 0 && y !== void 0) {
|
|
this.x = x;
|
|
this.y = y;
|
|
return;
|
|
}
|
|
}
|
|
clone() {
|
|
return new _Point(this.x, this.y);
|
|
}
|
|
};
|
|
var Size = class {
|
|
width = 0;
|
|
height = 0;
|
|
constructor(width, height) {
|
|
if (width !== void 0 && height !== void 0) {
|
|
this.width = width;
|
|
this.height = height;
|
|
return;
|
|
}
|
|
}
|
|
clone() {
|
|
return new Point(this.width, this.height);
|
|
}
|
|
};
|
|
var Rect = class _Rect {
|
|
left = 0;
|
|
top = 0;
|
|
right = 0;
|
|
bottom = 0;
|
|
get x() {
|
|
return this.left;
|
|
}
|
|
set x(value) {
|
|
const diff = value - this.left;
|
|
this.left += diff;
|
|
this.right += diff;
|
|
}
|
|
get y() {
|
|
return this.top;
|
|
}
|
|
set y(value) {
|
|
const diff = value - this.top;
|
|
this.top += diff;
|
|
this.bottom += diff;
|
|
}
|
|
get width() {
|
|
return this.right - this.left;
|
|
}
|
|
set width(value) {
|
|
this.right = this.left + value;
|
|
}
|
|
get height() {
|
|
return this.bottom - this.top;
|
|
}
|
|
set height(value) {
|
|
this.bottom = this.top + value;
|
|
}
|
|
get centerX() {
|
|
return (this.left + this.right) / 2;
|
|
}
|
|
get centerY() {
|
|
return (this.top + this.bottom) / 2;
|
|
}
|
|
get location() {
|
|
let point = new Point();
|
|
point.x = this.centerX;
|
|
point.y = this.centerY;
|
|
return point;
|
|
}
|
|
set location(point) {
|
|
let w = this.width;
|
|
let h = this.height;
|
|
this.left = point.x;
|
|
this.right = this.left + w;
|
|
this.top = point.y;
|
|
this.bottom = this.top + h;
|
|
}
|
|
get size() {
|
|
let size = new Size();
|
|
size.width = this.width;
|
|
size.height = this.height;
|
|
return size;
|
|
}
|
|
set size(size) {
|
|
this.width = size.width;
|
|
this.height = size.height;
|
|
}
|
|
get isEmpty() {
|
|
return this.width <= 0 || this.height <= 0;
|
|
}
|
|
constructor(arg0, arg1, arg2, arg3) {
|
|
if (typeof arg0 === "number" && typeof arg1 === "number") {
|
|
if (typeof arg2 === "number" && typeof arg3 === "number") {
|
|
this.left = arg0;
|
|
this.top = arg1;
|
|
this.right = arg0 + arg2;
|
|
this.bottom = arg1 + arg3;
|
|
return;
|
|
}
|
|
this.right = arg0;
|
|
this.bottom = arg1;
|
|
return;
|
|
} else if (arg0 instanceof Point && arg1 instanceof Size) {
|
|
this.left = arg0.x;
|
|
this.top = arg0.y;
|
|
this.right = arg0.x + arg1.width;
|
|
this.bottom = arg0.y + arg1.height;
|
|
return;
|
|
} else if (arg0 instanceof Size) {
|
|
this.right = arg0.width;
|
|
this.bottom = arg0.height;
|
|
return;
|
|
}
|
|
}
|
|
inflate(dx, dy) {
|
|
this.left -= dx;
|
|
this.right += dx;
|
|
this.top -= dy;
|
|
this.bottom += dy;
|
|
}
|
|
clone() {
|
|
return new _Rect(this.left, this.top, this.width, this.height);
|
|
}
|
|
union(rect) {
|
|
const left = Math.min(this.left, rect.left);
|
|
const top = Math.min(this.top, rect.top);
|
|
const right = Math.max(this.right, rect.right);
|
|
const bottom = Math.max(this.bottom, rect.bottom);
|
|
return new _Rect(left, top, right - left, bottom - top);
|
|
}
|
|
};
|
|
var Color = class _Color {
|
|
argb = 0;
|
|
constructor(a, r, g, b) {
|
|
if (typeof a === "string") {
|
|
let s = a;
|
|
if (s.startsWith("#")) {
|
|
s = s.substring(1);
|
|
}
|
|
s = s.trim();
|
|
switch (s.length) {
|
|
case 3:
|
|
s = "ff" + s.split("").map((c) => c + c).join("");
|
|
break;
|
|
case 4:
|
|
s = s.split("").map((c) => c + c).join("");
|
|
break;
|
|
case 6:
|
|
s = "ff" + s;
|
|
break;
|
|
case 8:
|
|
break;
|
|
default:
|
|
s = "ffffffff";
|
|
}
|
|
const u = parseInt(s, 16);
|
|
this.argb = u;
|
|
return;
|
|
}
|
|
if (a !== void 0 && r === void 0 && g === void 0 && b === void 0) {
|
|
this.argb = a;
|
|
return;
|
|
}
|
|
if (a === void 0 && r !== void 0 && g !== void 0 && b !== void 0) {
|
|
const u = 255 << 24 | (r & 255) << 16 | (g & 255) << 8 | b & 255;
|
|
this.argb = u;
|
|
return;
|
|
}
|
|
if (a !== void 0 && r !== void 0 && g !== void 0 && b !== void 0) {
|
|
const u = a << 24 | (r & 255) << 16 | (g & 255) << 8 | b & 255;
|
|
this.argb = u;
|
|
return;
|
|
}
|
|
this.argb = 0;
|
|
}
|
|
get a() {
|
|
return this.argb >>> 24 & 255;
|
|
}
|
|
set a(value) {
|
|
const v = value & 255;
|
|
this.argb = v << 24 | this.argb & 16777215;
|
|
}
|
|
get r() {
|
|
return this.argb >>> 16 & 255;
|
|
}
|
|
set r(value) {
|
|
const v = value & 255;
|
|
this.argb = this.argb & 4278255615 | v << 16;
|
|
}
|
|
get g() {
|
|
return this.argb >>> 8 & 255;
|
|
}
|
|
set g(value) {
|
|
const v = value & 255;
|
|
this.argb = this.argb & 4294902015 | v << 8;
|
|
}
|
|
get b() {
|
|
return this.argb & 255;
|
|
}
|
|
set b(value) {
|
|
const v = value & 255;
|
|
this.argb = this.argb & 4294967040 | v;
|
|
}
|
|
toUint32() {
|
|
return this.argb;
|
|
}
|
|
clone() {
|
|
return new _Color(this.argb);
|
|
}
|
|
static FromRgba(r, g, b, a) {
|
|
if (typeof r === "string" && g === void 0 && b === void 0 && a === void 0) {
|
|
r = r.trim();
|
|
if (r[0] === "#") r = r.slice(1);
|
|
if (r.length === 8) {
|
|
return new _Color(r.slice(6, 8) + r.slice(0, 6));
|
|
} else if (r.length === 6) return new _Color(r);
|
|
else if (r.length === 4) {
|
|
return new _Color(r[3] + r[3] + r.slice(0, 3).split("").map((i) => i + i).join(""));
|
|
} else if (r.length === 3) {
|
|
return new _Color("FF" + r.split("").map((i) => i + i).join(""));
|
|
} else return new _Color();
|
|
} else if (typeof r === "number" && typeof g === "number" && typeof b === "number" && typeof a === "number") {
|
|
return new _Color(a, r, g, b);
|
|
} else {
|
|
return new _Color();
|
|
}
|
|
}
|
|
toRgbaString() {
|
|
return `rgba(${this.r}, ${this.g}, ${this.b}, ${this.a / 255})`;
|
|
}
|
|
toHexString(includeAlpha = true) {
|
|
if (includeAlpha) {
|
|
return `#${this.argb.toString(16).padStart(8, "0")}`;
|
|
} else {
|
|
const rgb = this.argb & 16777215;
|
|
return `#${rgb.toString(16).padStart(6, "0")}`;
|
|
}
|
|
}
|
|
equals(other) {
|
|
return this.argb === other.argb;
|
|
}
|
|
static get Transparent() {
|
|
return new _Color(0, 0, 0, 0);
|
|
}
|
|
static get Black() {
|
|
return new _Color(255, 0, 0, 0);
|
|
}
|
|
static get White() {
|
|
return new _Color(255, 255, 255, 255);
|
|
}
|
|
withAlpha(alpha) {
|
|
return new _Color(alpha, this.r, this.g, this.b);
|
|
}
|
|
withRed(red) {
|
|
return new _Color(this.a, red, this.g, this.b);
|
|
}
|
|
withGreen(green) {
|
|
return new _Color(this.a, this.r, green, this.b);
|
|
}
|
|
withBlue(blue) {
|
|
return new _Color(this.a, this.r, this.g, blue);
|
|
}
|
|
};
|
|
var SliceInfo = class {
|
|
bounds = new Rect();
|
|
center = new Rect();
|
|
pivot = new Point();
|
|
scale = 1;
|
|
blobUrl = "";
|
|
get isNinePatch() {
|
|
return !this.center.isEmpty;
|
|
}
|
|
};
|
|
var assetFilePath = "assets.png";
|
|
var slicesFilePath = "assets.bin";
|
|
var directoryPath = "./rdviewAssets";
|
|
async function loadAssetFile() {
|
|
const pngPath = directoryPath + "/" + assetFilePath;
|
|
return await new Promise((resolve, reject) => {
|
|
const img = new Image();
|
|
img.onload = () => resolve(img);
|
|
img.onerror = (e) => reject(new Error(`Failed to load asset file: ${pngPath}`));
|
|
img.src = pngPath;
|
|
});
|
|
}
|
|
async function readFromStream(stream) {
|
|
const canvas = new OffscreenCanvas(1, 1);
|
|
let offset = 0;
|
|
const count = stream.getUint8(0);
|
|
offset += 1;
|
|
const sliceInfos = /* @__PURE__ */ new Map();
|
|
for (let i = 0; i < count; i++) {
|
|
const sliceInfo = new SliceInfo();
|
|
const keyLength = stream.getUint8(offset);
|
|
offset += 1;
|
|
const key = new TextDecoder().decode(new Uint8Array(stream.buffer, offset, keyLength));
|
|
offset += keyLength;
|
|
const left = stream.getUint8(offset);
|
|
offset += 1;
|
|
const top = stream.getUint8(offset);
|
|
offset += 1;
|
|
const wh = stream.getUint16(offset, true);
|
|
offset += 2;
|
|
const width = wh & 31;
|
|
const height = wh >> 5 & 63;
|
|
sliceInfo.bounds = new Rect(left, top, width, height);
|
|
const hasCenter = (wh & 32768) !== 0;
|
|
const hasPivot = (wh & 16384) !== 0;
|
|
if (hasCenter) {
|
|
const centerByte = stream.getUint8(offset);
|
|
offset += 1;
|
|
const centerLeft = centerByte & 3;
|
|
const centerTop = centerByte >> 2 & 3;
|
|
const centerWidth = centerByte >> 4 & 3;
|
|
const centerHeight = centerByte >> 6 & 3;
|
|
sliceInfo.center = new Rect(centerLeft, centerTop, centerWidth, centerHeight);
|
|
}
|
|
if (hasPivot) {
|
|
const pivotByte = stream.getUint8(offset);
|
|
offset += 1;
|
|
let pivotLeft = pivotByte & 7;
|
|
let pivotTop = pivotByte >> 3 & 7;
|
|
if ((pivotByte & 128) !== 0) {
|
|
pivotLeft *= -1;
|
|
}
|
|
if ((pivotByte & 64) !== 0) {
|
|
pivotTop *= -1;
|
|
}
|
|
sliceInfo.pivot = new Point(pivotLeft, pivotTop);
|
|
}
|
|
canvas.width = width;
|
|
canvas.height = height;
|
|
const ctx = canvas.getContext("2d");
|
|
if (ctx === null) {
|
|
throw new Error("Failed to get 2D context");
|
|
}
|
|
ctx.clearRect(0, 0, width, height);
|
|
ctx.drawImage(assetFile, sliceInfo.bounds.left, sliceInfo.bounds.top, width, height, 0, 0, width, height);
|
|
const blob = await canvas.convertToBlob({
|
|
type: "image/png"
|
|
});
|
|
sliceInfo.blobUrl = URL.createObjectURL(blob);
|
|
sliceInfos.set(key, sliceInfo);
|
|
}
|
|
return sliceInfos;
|
|
}
|
|
var assetLoaded = false;
|
|
var assetFile = await loadAssetFile();
|
|
var slices = await readFromStream(new DataView(await (await fetch(directoryPath + "/" + slicesFilePath)).arrayBuffer())).finally(() => {
|
|
assetLoaded = true;
|
|
});
|
|
|
|
// Consts.ts
|
|
var Tab = /* @__PURE__ */ function(Tab2) {
|
|
Tab2["Sounds"] = "sounds";
|
|
Tab2["Rows"] = "rows";
|
|
Tab2["Actions"] = "actions";
|
|
Tab2["Decorations"] = "decorations";
|
|
Tab2["Rooms"] = "rooms";
|
|
Tab2["Windows"] = "windows";
|
|
Tab2["Unknown"] = "unknown";
|
|
return Tab2;
|
|
}({});
|
|
var SayReadyGetSetGoWords = /* @__PURE__ */ function(SayReadyGetSetGoWords2) {
|
|
SayReadyGetSetGoWords2["SayReaDyGetSetGoNew"] = "SayReaDyGetSetGoNew";
|
|
SayReadyGetSetGoWords2["SayReaDyGetSetOne"] = "SayReaDyGetSetOne";
|
|
SayReadyGetSetGoWords2["SayGetSetGo"] = "SayGetSetGo";
|
|
SayReadyGetSetGoWords2["SayGetSetOne"] = "SayGetSetOne";
|
|
SayReadyGetSetGoWords2["JustSayRea"] = "JustSayRea";
|
|
SayReadyGetSetGoWords2["JustSayDy"] = "JustSayDy";
|
|
SayReadyGetSetGoWords2["JustSayGet"] = "JustSayGet";
|
|
SayReadyGetSetGoWords2["JustSaySet"] = "JustSaySet";
|
|
SayReadyGetSetGoWords2["JustSayAnd"] = "JustSayAnd";
|
|
SayReadyGetSetGoWords2["JustSayGo"] = "JustSayGo";
|
|
SayReadyGetSetGoWords2["JustSayStop"] = "JustSayStop";
|
|
SayReadyGetSetGoWords2["JustSayAndStop"] = "JustSayAndStop";
|
|
SayReadyGetSetGoWords2["SaySwitch"] = "SaySwitch";
|
|
SayReadyGetSetGoWords2["SayWatch"] = "SayWatch";
|
|
SayReadyGetSetGoWords2["SayListen"] = "SayListen";
|
|
SayReadyGetSetGoWords2["Count1"] = "Count1";
|
|
SayReadyGetSetGoWords2["Count2"] = "Count2";
|
|
SayReadyGetSetGoWords2["Count3"] = "Count3";
|
|
SayReadyGetSetGoWords2["Count4"] = "Count4";
|
|
SayReadyGetSetGoWords2["Count5"] = "Count5";
|
|
SayReadyGetSetGoWords2["Count6"] = "Count6";
|
|
SayReadyGetSetGoWords2["Count7"] = "Count7";
|
|
SayReadyGetSetGoWords2["Count8"] = "Count8";
|
|
SayReadyGetSetGoWords2["Count9"] = "Count9";
|
|
SayReadyGetSetGoWords2["Count10"] = "Count10";
|
|
SayReadyGetSetGoWords2["SayReadyGetSetGo"] = "SayReadyGetSetGo";
|
|
SayReadyGetSetGoWords2["JustSayReady"] = "JustSayReady";
|
|
return SayReadyGetSetGoWords2;
|
|
}({});
|
|
var EventType = /* @__PURE__ */ function(EventType2) {
|
|
EventType2["AddClassicBeat"] = "AddClassicBeat";
|
|
EventType2["AddFreeTimeBeat"] = "AddFreeTimeBeat";
|
|
EventType2["AddOneshotBeat"] = "AddOneshotBeat";
|
|
EventType2["AdvanceText"] = "AdvanceText";
|
|
EventType2["BassDrop"] = "BassDrop";
|
|
EventType2["Blend"] = "Blend";
|
|
EventType2["CallCustomMethod"] = "CallCustomMethod";
|
|
EventType2["ChangeCharacter"] = "ChangeCharacter";
|
|
EventType2["ChangePlayersRows"] = "ChangePlayersRows";
|
|
EventType2["Comment"] = "Comment";
|
|
EventType2["CustomFlash"] = "CustomFlash";
|
|
EventType2["DesktopColor"] = "DesktopColor";
|
|
EventType2["FadeRoom"] = "FadeRoom";
|
|
EventType2["FinishLevel"] = "FinishLevel";
|
|
EventType2["Flash"] = "Flash";
|
|
EventType2["FlipScreen"] = "FlipScreen";
|
|
EventType2["FloatingText"] = "FloatingText";
|
|
EventType2["ForwardDecorationEvent"] = "ForwardDecorationEvent";
|
|
EventType2["ForwardEvent"] = "ForwardEvent";
|
|
EventType2["ForwardRowEvent"] = "ForwardRowEvent";
|
|
EventType2["HideRow"] = "HideRow";
|
|
EventType2["HideWindow"] = "HideWindow";
|
|
EventType2["InvertColors"] = "InvertColors";
|
|
EventType2["MacroEvent"] = "MacroEvent";
|
|
EventType2["MaskRoom"] = "MaskRoom";
|
|
EventType2["Move"] = "Move";
|
|
EventType2["MoveCamera"] = "MoveCamera";
|
|
EventType2["MoveRoom"] = "MoveRoom";
|
|
EventType2["MoveRow"] = "MoveRow";
|
|
EventType2["NarrateRowInfo"] = "NarrateRowInfo";
|
|
EventType2["NewWindowDance"] = "NewWindowDance";
|
|
EventType2["PaintHands"] = "PaintHands";
|
|
EventType2["PlayAnimation"] = "PlayAnimation";
|
|
EventType2["PlayExpression"] = "PlayExpression";
|
|
EventType2["PlaySong"] = "PlaySong";
|
|
EventType2["PlaySound"] = "PlaySound";
|
|
EventType2["PulseCamera"] = "PulseCamera";
|
|
EventType2["PulseFreeTimeBeat"] = "PulseFreeTimeBeat";
|
|
EventType2["ReadNarration"] = "ReadNarration";
|
|
EventType2["RenameWindow"] = "RenameWindow";
|
|
EventType2["ReorderRooms"] = "ReorderRooms";
|
|
EventType2["ReorderRow"] = "ReorderRow";
|
|
EventType2["ReorderSprite"] = "ReorderSprite";
|
|
EventType2["ReorderWindows"] = "ReorderWindows";
|
|
EventType2["SayReadyGetSetGo"] = "SayReadyGetSetGo";
|
|
EventType2["SetBackgroundColor"] = "SetBackgroundColor";
|
|
EventType2["SetBeatSound"] = "SetBeatSound";
|
|
EventType2["SetBeatsPerMinute"] = "SetBeatsPerMinute";
|
|
EventType2["SetClapSounds"] = "SetClapSounds";
|
|
EventType2["SetCountingSound"] = "SetCountingSound";
|
|
EventType2["SetCrotchetsPerBar"] = "SetCrotchetsPerBar";
|
|
EventType2["SetForeground"] = "SetForeground";
|
|
EventType2["SetGameSound"] = "SetGameSound";
|
|
EventType2["SetHandOwner"] = "SetHandOwner";
|
|
EventType2["SetHeartExplodeInterval"] = "SetHeartExplodeInterval";
|
|
EventType2["SetHeartExplodeVolume"] = "SetHeartExplodeVolume";
|
|
EventType2["SetMainWindow"] = "SetMainWindow";
|
|
EventType2["SetOneshotWave"] = "SetOneshotWave";
|
|
EventType2["SetPlayStyle"] = "SetPlayStyle";
|
|
EventType2["SetRoomContentMode"] = "SetRoomContentMode";
|
|
EventType2["SetRoomPerspective"] = "SetRoomPerspective";
|
|
EventType2["SetRowXs"] = "SetRowXs";
|
|
EventType2["SetSpeed"] = "SetSpeed";
|
|
EventType2["SetTheme"] = "SetTheme";
|
|
EventType2["SetVFXPreset"] = "SetVFXPreset";
|
|
EventType2["SetVisible"] = "SetVisible";
|
|
EventType2["SetWindowContent"] = "SetWindowContent";
|
|
EventType2["ShakeScreen"] = "ShakeScreen";
|
|
EventType2["ShakeScreenCustom"] = "ShakeScreenCustom";
|
|
EventType2["ShowDialogue"] = "ShowDialogue";
|
|
EventType2["ShowHands"] = "ShowHands";
|
|
EventType2["ShowRooms"] = "ShowRooms";
|
|
EventType2["ShowStatusSign"] = "ShowStatusSign";
|
|
EventType2["ShowSubdivisionsRows"] = "ShowSubdivisionsRows";
|
|
EventType2["SpinningRows"] = "SpinningRows";
|
|
EventType2["Stutter"] = "Stutter";
|
|
EventType2["TagAction"] = "TagAction";
|
|
EventType2["TextExplosion"] = "TextExplosion";
|
|
EventType2["Tile"] = "Tile";
|
|
EventType2["Tint"] = "Tint";
|
|
EventType2["TintRows"] = "TintRows";
|
|
EventType2["WindowResize"] = "WindowResize";
|
|
return EventType2;
|
|
}({});
|
|
var EventAttriblte = /* @__PURE__ */ function(EventAttriblte2) {
|
|
EventAttriblte2[EventAttriblte2["None"] = 0] = "None";
|
|
EventAttriblte2[EventAttriblte2["DurationEvent"] = 1] = "DurationEvent";
|
|
EventAttriblte2[EventAttriblte2["RoomEvent"] = 2] = "RoomEvent";
|
|
return EventAttriblte2;
|
|
}({});
|
|
var EventInfo = class {
|
|
defaultTab;
|
|
durationKey = "duration";
|
|
attr;
|
|
get isDurationEvent() {
|
|
return (this.attr & EventAttriblte.DurationEvent) !== 0;
|
|
}
|
|
get isRoomEvent() {
|
|
return (this.attr & EventAttriblte.RoomEvent) !== 0;
|
|
}
|
|
constructor(tab, enumAttriblte, durationKey) {
|
|
this.defaultTab = tab;
|
|
this.attr = enumAttriblte ?? EventAttriblte.None;
|
|
this.durationKey = durationKey ?? "duration";
|
|
}
|
|
};
|
|
var WordInfo = class {
|
|
phrase;
|
|
length;
|
|
constructor(phrase, length) {
|
|
this.phrase = phrase;
|
|
this.length = length;
|
|
}
|
|
};
|
|
var WordInfos = {
|
|
SayReaDyGetSetGoNew: new WordInfo("Rea, Dy, Get, Set, Go!", 4),
|
|
SayReaDyGetSetOne: new WordInfo("Rea, Dy, Get, Set, One!", 4),
|
|
SayGetSetGo: new WordInfo("Get, Set, Go!", 2),
|
|
SayGetSetOne: new WordInfo("Get, Set, One!", 2),
|
|
JustSayRea: new WordInfo("Rea", 0),
|
|
JustSayDy: new WordInfo("Dy", 0),
|
|
JustSayGet: new WordInfo("Get", 0),
|
|
JustSaySet: new WordInfo("Set", 0),
|
|
JustSayAnd: new WordInfo("And", 0),
|
|
JustSayGo: new WordInfo("Go!", 0),
|
|
JustSayStop: new WordInfo("Stop", 0),
|
|
JustSayAndStop: new WordInfo("And Stop!", 0),
|
|
SaySwitch: new WordInfo("Switch", 0),
|
|
SayWatch: new WordInfo("Watch", 0),
|
|
SayListen: new WordInfo("Listen", 0),
|
|
Count1: new WordInfo("1", 0),
|
|
Count2: new WordInfo("2", 0),
|
|
Count3: new WordInfo("3", 0),
|
|
Count4: new WordInfo("4", 0),
|
|
Count5: new WordInfo("5", 0),
|
|
Count6: new WordInfo("6", 0),
|
|
Count7: new WordInfo("7", 0),
|
|
Count8: new WordInfo("8", 0),
|
|
Count9: new WordInfo("9", 0),
|
|
Count10: new WordInfo("10", 0),
|
|
SayReadyGetSetGo: new WordInfo("Ready, Get, Set, Go!", 4),
|
|
JustSayReady: new WordInfo("Ready", 0)
|
|
};
|
|
var EventInfos = {
|
|
AddClassicBeat: new EventInfo(Tab.Rows),
|
|
AddFreeTimeBeat: new EventInfo(Tab.Rows),
|
|
AddOneshotBeat: new EventInfo(Tab.Rows),
|
|
AdvanceText: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent, "duration"),
|
|
BassDrop: new EventInfo(Tab.Actions),
|
|
Blend: new EventInfo(Tab.Decorations),
|
|
CallCustomMethod: new EventInfo(Tab.Actions),
|
|
ChangeCharacter: new EventInfo(Tab.Actions),
|
|
ChangePlayersRows: new EventInfo(Tab.Actions),
|
|
Comment: new EventInfo(Tab.Unknown),
|
|
CustomFlash: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent, "duration"),
|
|
DesktopColor: new EventInfo(Tab.Windows, EventAttriblte.DurationEvent, "duration"),
|
|
FadeRoom: new EventInfo(Tab.Rooms, EventAttriblte.DurationEvent, "duration"),
|
|
FinishLevel: new EventInfo(Tab.Actions),
|
|
Flash: new EventInfo(Tab.Actions),
|
|
FlipScreen: new EventInfo(Tab.Actions),
|
|
FloatingText: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent | EventAttriblte.RoomEvent, "duration"),
|
|
ForwardDecorationEvent: new EventInfo(Tab.Decorations),
|
|
ForwardEvent: new EventInfo(Tab.Unknown),
|
|
ForwardRowEvent: new EventInfo(Tab.Rows),
|
|
HideRow: new EventInfo(Tab.Actions),
|
|
HideWindow: new EventInfo(Tab.Windows),
|
|
InvertColors: new EventInfo(Tab.Actions),
|
|
MacroEvent: new EventInfo(Tab.Unknown),
|
|
MaskRoom: new EventInfo(Tab.Rooms),
|
|
Move: new EventInfo(Tab.Decorations, EventAttriblte.DurationEvent, "duration"),
|
|
MoveCamera: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent, "duration"),
|
|
MoveRoom: new EventInfo(Tab.Rooms, EventAttriblte.DurationEvent, "duration"),
|
|
MoveRow: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent, "duration"),
|
|
NarrateRowInfo: new EventInfo(Tab.Sounds),
|
|
NewWindowDance: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent, "duration"),
|
|
PaintHands: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent | EventAttriblte.RoomEvent, "duration"),
|
|
PlayAnimation: new EventInfo(Tab.Decorations),
|
|
PlayExpression: new EventInfo(Tab.Actions),
|
|
PlaySong: new EventInfo(Tab.Sounds),
|
|
PlaySound: new EventInfo(Tab.Sounds),
|
|
PulseCamera: new EventInfo(Tab.Actions),
|
|
PulseFreeTimeBeat: new EventInfo(Tab.Rows),
|
|
ReadNarration: new EventInfo(Tab.Sounds),
|
|
RenameWindow: new EventInfo(Tab.Windows),
|
|
ReorderRooms: new EventInfo(Tab.Rooms),
|
|
ReorderRow: new EventInfo(Tab.Rows),
|
|
ReorderSprite: new EventInfo(Tab.Decorations),
|
|
ReorderWindows: new EventInfo(Tab.Windows),
|
|
SayReadyGetSetGo: new EventInfo(Tab.Sounds),
|
|
SetBackgroundColor: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent | EventAttriblte.RoomEvent, "duration"),
|
|
SetBeatSound: new EventInfo(Tab.Sounds),
|
|
SetBeatsPerMinute: new EventInfo(Tab.Sounds),
|
|
SetClapSounds: new EventInfo(Tab.Sounds),
|
|
SetCountingSound: new EventInfo(Tab.Sounds),
|
|
SetCrotchetsPerBar: new EventInfo(Tab.Sounds),
|
|
SetForeground: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent | EventAttriblte.RoomEvent, "duration"),
|
|
SetGameSound: new EventInfo(Tab.Sounds),
|
|
SetHandOwner: new EventInfo(Tab.Actions),
|
|
SetHeartExplodeInterval: new EventInfo(Tab.Sounds),
|
|
SetHeartExplodeVolume: new EventInfo(Tab.Sounds),
|
|
SetMainWindow: new EventInfo(Tab.Windows),
|
|
SetOneshotWave: new EventInfo(Tab.Rows),
|
|
SetPlayStyle: new EventInfo(Tab.Actions),
|
|
SetRoomContentMode: new EventInfo(Tab.Rooms),
|
|
SetRoomPerspective: new EventInfo(Tab.Rooms, EventAttriblte.DurationEvent, "duration"),
|
|
SetRowXs: new EventInfo(Tab.Rows),
|
|
SetSpeed: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent, "duration"),
|
|
SetTheme: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent | EventAttriblte.RoomEvent, "duration"),
|
|
SetVFXPreset: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent | EventAttriblte.RoomEvent, "duration"),
|
|
SetVisible: new EventInfo(Tab.Decorations),
|
|
SetWindowContent: new EventInfo(Tab.Windows, EventAttriblte.DurationEvent, "duration"),
|
|
ShakeScreen: new EventInfo(Tab.Actions, EventAttriblte.RoomEvent),
|
|
ShakeScreenCustom: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent | EventAttriblte.RoomEvent, "duration"),
|
|
ShowDialogue: new EventInfo(Tab.Actions),
|
|
ShowHands: new EventInfo(Tab.Actions),
|
|
ShowRooms: new EventInfo(Tab.Rooms, EventAttriblte.DurationEvent, "duration"),
|
|
ShowStatusSign: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent, "duration"),
|
|
ShowSubdivisionsRows: new EventInfo(Tab.Actions),
|
|
SpinningRows: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent, "duration"),
|
|
Stutter: new EventInfo(Tab.Actions),
|
|
TagAction: new EventInfo(Tab.Actions),
|
|
TextExplosion: new EventInfo(Tab.Actions),
|
|
Tile: new EventInfo(Tab.Decorations, EventAttriblte.DurationEvent, "duration"),
|
|
Tint: new EventInfo(Tab.Decorations, EventAttriblte.DurationEvent, "duration"),
|
|
TintRows: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent | EventAttriblte.RoomEvent, "duration"),
|
|
WindowResize: new EventInfo(Tab.Actions, EventAttriblte.DurationEvent, "duration")
|
|
};
|
|
|
|
// View.ts
|
|
var lineHeight = 6;
|
|
var charHeight = 8;
|
|
var iconSize = 14;
|
|
var IconStyle = class {
|
|
enabled = true;
|
|
active = false;
|
|
hover = false;
|
|
scale = 1;
|
|
showDuration = false;
|
|
};
|
|
function withState(color, active, enabled) {
|
|
return (enabled ? color : new Color(4286874756)).withAlpha(active ? 192 : 91);
|
|
}
|
|
function createLayer(key, bound, color, style) {
|
|
const layer = document.createElement("div");
|
|
const info = slices.get(key);
|
|
layer.style.position = "absolute";
|
|
layer.style.boxSizing = "content-box";
|
|
if (info?.isNinePatch) {
|
|
const center = info.center;
|
|
const width = bound?.width ?? info.bounds.width;
|
|
const height = bound?.height ?? info.bounds.height;
|
|
layer.style.left = `${(bound?.left ?? bound?.x ?? 0) * style.scale}px`;
|
|
layer.style.top = `${(bound?.top ?? bound?.y ?? 0) * style.scale}px`;
|
|
layer.style.borderStyle = "solid";
|
|
layer.style.borderWidth = `${center.top * style.scale}px ${(info.bounds.width - center.right) * style.scale}px ${(info.bounds.height - center.bottom) * style.scale}px ${center.left * style.scale}px`;
|
|
layer.style.borderImageSource = `url(${info.blobUrl})`;
|
|
layer.style.borderImageSlice = `${center.top} ${info.bounds.width - center.right} ${info.bounds.height - center.bottom} ${center.left} fill`;
|
|
layer.style.borderImageWidth = `1`;
|
|
layer.style.borderImageOutset = `0`;
|
|
layer.style.borderImageRepeat = `repeat`;
|
|
layer.style.width = `${(width - center.left - (info.bounds.width - center.right)) * style.scale}px`;
|
|
layer.style.height = `${(height - center.top - (info.bounds.height - center.bottom)) * style.scale}px`;
|
|
} else {
|
|
if (bound instanceof Rect) {
|
|
layer.style.left = `${(bound.left - (info?.pivot.x ?? 0)) * style.scale}px`;
|
|
layer.style.top = `${(bound.top - (info?.pivot.y ?? 0)) * style.scale}px`;
|
|
layer.style.width = `${(bound.width ?? info?.bounds.width ?? 0) * style.scale}px`;
|
|
layer.style.height = `${(bound.height ?? info?.bounds.height ?? 0) * style.scale}px`;
|
|
if (info) {
|
|
layer.style.backgroundImage = `url(${info.blobUrl})`;
|
|
}
|
|
layer.style.backgroundSize = `${(bound.width ?? info?.bounds.width ?? 0) * style.scale}px ${(bound.height ?? info?.bounds.height ?? 0) * style.scale}px`;
|
|
} else {
|
|
layer.style.left = `${((bound?.x ?? 0) - (info?.pivot.x ?? 0)) * style.scale}px`;
|
|
layer.style.top = `${((bound?.y ?? 0) - (info?.pivot.y ?? 0)) * style.scale}px`;
|
|
layer.style.width = `${(info?.bounds.width ?? 0) * style.scale}px`;
|
|
layer.style.height = `${(info?.bounds.height ?? 0) * style.scale}px`;
|
|
if (info) {
|
|
layer.style.backgroundImage = `url(${info.blobUrl})`;
|
|
}
|
|
layer.style.backgroundSize = `${(info?.bounds.width ?? 0) * style.scale}px ${(info?.bounds.height ?? 0) * style.scale}px`;
|
|
}
|
|
}
|
|
if (color && Color.White.equals(color) === false) {
|
|
const filterId = getColorMatrixId(color);
|
|
layer.style.filter = `url(#${filterId})`;
|
|
layer.onColorChange = (color2) => {
|
|
if (!color2) {
|
|
return;
|
|
}
|
|
const newFilterId = getColorMatrixId(color2);
|
|
layer.style.filter = `url(#${newFilterId})`;
|
|
};
|
|
} else {
|
|
}
|
|
return layer;
|
|
}
|
|
var colorMatrixIds = /* @__PURE__ */ new Map();
|
|
var colorMatrixCache = document.createElement("div");
|
|
document.body.appendChild(colorMatrixCache);
|
|
function getColorMatrixId(rgba) {
|
|
if (colorMatrixIds.has(rgba.toUint32())) {
|
|
return colorMatrixIds.get(rgba.toUint32());
|
|
}
|
|
const feColorMatrix = document.createElementNS("http://www.w3.org/2000/svg", "feColorMatrix");
|
|
feColorMatrix.setAttribute("type", "matrix");
|
|
const r = rgba.r / 255;
|
|
const g = rgba.g / 255;
|
|
const b = rgba.b / 255;
|
|
const a = rgba.a / 255;
|
|
feColorMatrix.setAttribute("values", `${r} 0 0 0 0 0 ${g} 0 0 0 0 0 ${b} 0 0 0 0 0 ${a} 0`);
|
|
const filter = document.createElementNS("http://www.w3.org/2000/svg", "filter");
|
|
filter.setAttribute("id", `filter_${rgba.toHexString()}`);
|
|
filter.appendChild(feColorMatrix);
|
|
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
svg.setAttribute("width", "0");
|
|
svg.setAttribute("height", "0");
|
|
svg.appendChild(filter);
|
|
colorMatrixCache.appendChild(svg);
|
|
colorMatrixIds.set(rgba.toUint32(), filter.getAttribute("id"));
|
|
return filter.getAttribute("id");
|
|
}
|
|
function measureRDFontText(text) {
|
|
let len = 0;
|
|
for (let i = 0; i < text.length; i++) {
|
|
const char = text.charAt(i);
|
|
if (char === "\n") {
|
|
len = 0;
|
|
} else {
|
|
const charCode = char.charCodeAt(0);
|
|
const charKey = `char_${charCode.toString(16).padStart(4, "0")}`;
|
|
const charInfo = slices.get(charKey);
|
|
len += charInfo?.bounds.width ?? 0;
|
|
}
|
|
}
|
|
return len;
|
|
}
|
|
function createRDFontLayer(text, style, color) {
|
|
const lineHead = new Point(0, -charHeight);
|
|
const start = lineHead.clone();
|
|
const layer = document.createElement("div");
|
|
layer.style.position = "absolute";
|
|
for (let i = 0; i < text.length; i++) {
|
|
const char = text.charAt(i);
|
|
if (char === "\n") {
|
|
start.x = lineHead.x;
|
|
start.y += lineHeight * style.scale;
|
|
} else {
|
|
const charCode = char.charCodeAt(0);
|
|
const charKey = `char_${charCode.toString(16).padStart(4, "0")}`;
|
|
const charInfo = slices.get(charKey);
|
|
if (charInfo) {
|
|
const charLayer = createLayer(charKey, new Point(start.x, start.y), color, style);
|
|
start.x += charInfo.bounds.width * style.scale;
|
|
layer.appendChild(charLayer);
|
|
}
|
|
}
|
|
}
|
|
return layer;
|
|
}
|
|
function createBackLayer(size, color, style) {
|
|
const outline = "event_outline";
|
|
const back = "event_back";
|
|
const backLayer = createLayer(back, new Rect(1, 1, (size?.width ?? iconSize) - 2, (size?.height ?? iconSize) - 2), withState(color, style.active, style.enabled), style);
|
|
const outlineLayer = createLayer(outline, size ? new Rect(size) : null, new Color(style.active ? 4294967295 : 4289243304), style);
|
|
if (backLayer.onColorChange) {
|
|
backLayer.onStateChange = (style2) => backLayer.onColorChange(withState(color, style2.active, style2.enabled));
|
|
}
|
|
if (outlineLayer.onColorChange) {
|
|
outlineLayer.onStateChange = (style2) => outlineLayer.onColorChange(new Color(style2.active ? 4294967295 : 4289243304));
|
|
}
|
|
return [
|
|
backLayer,
|
|
outlineLayer
|
|
];
|
|
}
|
|
function colorOf(tab) {
|
|
switch (tab) {
|
|
case Tab.Sounds:
|
|
return new Color("d92433");
|
|
case Tab.Rows:
|
|
return new Color("2c4fdb");
|
|
case Tab.Actions:
|
|
return new Color("c544b3");
|
|
case Tab.Rooms:
|
|
return new Color("d8b811");
|
|
case Tab.Decorations:
|
|
return new Color("00c459");
|
|
case Tab.Windows:
|
|
return new Color("50b5d7");
|
|
default:
|
|
return new Color("7d7d7d");
|
|
}
|
|
}
|
|
function layerHoverInit(layer) {
|
|
layer.style.opacity = "0";
|
|
layer.onStateChange = (style) => {
|
|
if (style.hover) {
|
|
layer.style.opacity = "1.0";
|
|
} else {
|
|
layer.style.opacity = "0";
|
|
}
|
|
};
|
|
}
|
|
function createHintLayer(hint, width, color) {
|
|
const hintLayer = document.createElement("div");
|
|
hintLayer.style.position = "absolute";
|
|
hintLayer.style.left = `${width}px`;
|
|
hintLayer.style.width = `max-content`;
|
|
hintLayer.innerHTML = hint;
|
|
hintLayer.style.fontSize = `${18}px`;
|
|
hintLayer.style.fontFamily = "d9, Arial, sans-serif";
|
|
hintLayer.style.color = color.toRgbaString();
|
|
hintLayer.style.fontWeight = "bold";
|
|
hintLayer.style.textShadow = `
|
|
2px 2px 0 black,
|
|
2px 0px 0 black,
|
|
2px -2px 0 black,
|
|
0px -2px 0 black,
|
|
-2px -2px 0 black,
|
|
-2px 0px 0 black,
|
|
-2px 2px 0 black,
|
|
0px 2px 0 black
|
|
`;
|
|
hintLayer.style.pointerEvents = "none";
|
|
hintLayer.style.opacity = "0";
|
|
hintLayer.style.zIndex = "10";
|
|
hintLayer.onStateChange = (style) => {
|
|
if (style.hover) {
|
|
hintLayer.style.opacity = "1.0";
|
|
} else {
|
|
hintLayer.style.opacity = "0";
|
|
}
|
|
};
|
|
return hintLayer;
|
|
}
|
|
function createElementEvent(obj, style) {
|
|
style = {
|
|
...new IconStyle(),
|
|
...style
|
|
};
|
|
const evttype = obj.type ?? EventType.ForwardEvent;
|
|
let key0 = `event_${obj.type}`;
|
|
if (!slices.has(key0)) {
|
|
if (!slices.has("event_Unknown")) {
|
|
return null;
|
|
}
|
|
key0 = "event_Unknown";
|
|
}
|
|
const info = slices.get(key0);
|
|
if (!info) {
|
|
console.warn(`Slice info for event type ${evttype} not found.`);
|
|
return null;
|
|
}
|
|
const evttypeEnum = EventType[evttype];
|
|
const evinfo = EventInfos[evttypeEnum];
|
|
const key = "event_" + evttype;
|
|
const pulse = "event_beat_pulse";
|
|
const hit = "event_beat_hit";
|
|
const hitf = "event_beat_hit_freeze";
|
|
const hitb = "event_beat_hit_burn";
|
|
const beatcross = "event_beat_cross";
|
|
const beatx = "event_beat_x";
|
|
const beatsynco = "event_beat_synco";
|
|
const beatline = "event_beat_line";
|
|
const evtag = "event_tag";
|
|
const evbarea = "event_beat_area";
|
|
const evbskip = "event_beat_skip";
|
|
const beatColor = new Color(4284539717);
|
|
const element = document.createElement("div");
|
|
const internalLayers = [];
|
|
if (evttype === EventType.NewWindowDance) {
|
|
obj.tab = obj.customTab ?? Tab.Windows;
|
|
}
|
|
function addLayers(layers) {
|
|
for (const layer of layers) {
|
|
if (layer) {
|
|
element.appendChild(layer);
|
|
internalLayers.push(layer);
|
|
}
|
|
}
|
|
}
|
|
element.style.imageRendering = "pixelated";
|
|
switch (evttype) {
|
|
case EventType.AddClassicBeat:
|
|
{
|
|
const tick = obj.tick ?? 1;
|
|
const swing = (obj.swing ?? 0) || 1;
|
|
const hold = obj.hold ?? 0;
|
|
const syncoSwing = obj.syncoSwing ?? 0;
|
|
const prexs = obj.preXs ?? {
|
|
syncoBeat: -1,
|
|
syncoSwing: 0
|
|
};
|
|
const length = obj.length ?? 7;
|
|
const iconWidth = iconSize * (tick * (length - 1 - prexs.syncoSwing));
|
|
const holdBar = hold > 0 ? createLayer(evbarea, new Rect(iconWidth, 0, iconSize * hold, iconSize), new Color(style.active ? 4291839731 : 4286462352), style) : null;
|
|
if (holdBar) {
|
|
holdBar.style.pointerEvents = "none";
|
|
}
|
|
const backLayers2 = createBackLayer(new Size(iconWidth, iconSize), colorOf(obj.tab ?? evinfo.defaultTab), style);
|
|
const pulses = [];
|
|
for (let i = 0; i < length - 1; i++) {
|
|
const pulseLayer = createLayer(pulse, new Point(iconSize * (tick * (i + i % 2 * (1 - swing) - (i <= prexs.syncoBeat ? 0 : prexs.syncoSwing))), 0), null, style);
|
|
layerHoverInit(pulseLayer);
|
|
pulses.push(pulseLayer);
|
|
}
|
|
const hitLayer = createLayer(hit, new Point(iconSize * (tick * (length - 1 - (prexs.syncoSwing ?? 0))) - 1, 0), null, style);
|
|
addLayers([
|
|
holdBar,
|
|
...backLayers2,
|
|
...pulses,
|
|
hitLayer
|
|
]);
|
|
}
|
|
break;
|
|
case EventType.AddOneshotBeat:
|
|
{
|
|
const tick = obj.tick ?? 1;
|
|
const interval = obj.interval ?? 2;
|
|
const loop = obj.loops ?? 0;
|
|
const subdiv = obj.subdivisions ?? 1;
|
|
const hold = obj.hold ?? false;
|
|
const skip = obj.skipshot ?? false;
|
|
const mode = obj.freezeBurnMode ?? null;
|
|
const delay = obj.freezeBurnMode === "Freezeshot" ? obj.delay ?? 0 : 0;
|
|
const subdivWidth = iconSize * (subdiv - 1) / subdiv * tick;
|
|
const eventWidth = iconSize * (interval * loop + tick + delay);
|
|
const off = interval - tick;
|
|
const backLayers2 = createBackLayer(new Size(eventWidth, iconSize), colorOf(obj.tab ?? evinfo.defaultTab), style);
|
|
const holdWidth = hold ? iconSize * (interval - tick - delay) : 0;
|
|
const holdLayer = hold && holdWidth - subdivWidth > 0 ? createLayer(evbarea, new Rect(eventWidth + subdivWidth, 0, holdWidth - subdivWidth, iconSize), new Color(style.enabled ? 4291839731 : 4285493103), style) : null;
|
|
const subdivLayer = subdiv > 1 ? createLayer(evbarea, new Rect(eventWidth, 0, subdivWidth, iconSize), new Color(style.enabled ? 4279480353 : 4285493103), style) : null;
|
|
const skipshotLayer = skip ? createLayer(evbarea, new Rect(eventWidth + Math.max(subdivWidth, holdWidth), 0, iconSize * (interval - delay) - Math.max(subdivWidth, holdWidth), iconSize), new Color(style.enabled ? 4291115835 : 4285493103), style) : null;
|
|
const skipHitLayer = skip ? createLayer(evbskip, new Point(eventWidth + iconSize * (interval - delay) - 1, 0), null, style) : null;
|
|
if (holdLayer) holdLayer.style.pointerEvents = "none";
|
|
if (subdivLayer) subdivLayer.style.pointerEvents = "none";
|
|
if (skipshotLayer) skipshotLayer.style.pointerEvents = "none";
|
|
if (skipHitLayer) skipHitLayer.style.pointerEvents = "none";
|
|
const pulses = [];
|
|
const crossLayers = [];
|
|
const posx = -off * iconSize;
|
|
const hittype = mode === "Freezeshot" ? hitf : hitb;
|
|
for (let l = 0; l <= loop; l++) {
|
|
for (let i = 0; i < subdiv; i++) {
|
|
const pulseLayer = createLayer(pulse, new Point(iconSize * (l * interval + i * tick / subdiv), 0), null, style);
|
|
layerHoverInit(pulseLayer);
|
|
pulses.push(pulseLayer);
|
|
}
|
|
for (let i = 0; i < subdiv; i++) {
|
|
const hitLayer2 = createLayer(hit, new Point(iconSize * (l * interval + delay + tick + i * tick / subdiv) - 1, 0), null, style);
|
|
pulses.push(hitLayer2);
|
|
}
|
|
const crossLayer1 = mode || hold ? createLayer(beatcross, new Point(iconSize * l * interval + posx - 1, 0), null, style) : null;
|
|
const crossLayer2 = mode ? createLayer(beatcross, new Point(iconSize * (l - (mode === "Freezeshot" ? 0 : 1)) * interval - 1, 0), null, style) : null;
|
|
const hitLayer = createLayer(hittype, new Point(iconSize * (l * interval + tick) - 1, 0), null, style);
|
|
if (crossLayer1) {
|
|
layerHoverInit(crossLayer1);
|
|
crossLayers.push(crossLayer1);
|
|
}
|
|
if (crossLayer2) {
|
|
layerHoverInit(crossLayer2);
|
|
crossLayers.push(crossLayer2);
|
|
}
|
|
pulses.push(hitLayer);
|
|
}
|
|
const loopLayer = createLayer("event_beat_loop", new Point(eventWidth, 0), null, style);
|
|
loopLayer.style.opacity = "0";
|
|
loopLayer.style.zIndex = "5";
|
|
loopLayer.onStateChange = (style2) => {
|
|
if (style2.hover) {
|
|
loopLayer.style.opacity = "1.0";
|
|
} else {
|
|
loopLayer.style.opacity = "0";
|
|
}
|
|
};
|
|
addLayers([
|
|
...backLayers2,
|
|
holdLayer,
|
|
subdivLayer,
|
|
skipshotLayer,
|
|
skipHitLayer,
|
|
...pulses,
|
|
loopLayer,
|
|
...crossLayers
|
|
]);
|
|
}
|
|
break;
|
|
case EventType.AddFreeTimeBeat:
|
|
{
|
|
const hold = obj.hold ?? 0;
|
|
const holdLayer = hold > 0 ? createLayer(evbarea, new Rect(info.bounds.width, 0, iconSize * hold - info.bounds.width, iconSize), new Color(style.active ? 4291839731 : 4286462352), style) : null;
|
|
if (holdLayer) {
|
|
holdLayer.style.pointerEvents = "none";
|
|
}
|
|
const backLayers2 = createBackLayer(new Size(info.bounds.width, iconSize), beatColor, style);
|
|
const hitLayer = obj.pulse === 6 ? createLayer(hit, new Point(0, 0), null, style) : null;
|
|
const textLayer = createRDFontLayer(((obj.pulse ?? 0) + 1).toString(), style, null);
|
|
textLayer.style.left = `${1.5 * style.scale}px`;
|
|
textLayer.style.top = `${10 * style.scale}px`;
|
|
addLayers([
|
|
holdLayer,
|
|
...backLayers2,
|
|
hitLayer,
|
|
textLayer
|
|
]);
|
|
}
|
|
break;
|
|
case EventType.Comment:
|
|
{
|
|
const backLayers2 = createBackLayer(info.bounds.size, new Color(obj.color ?? "7d7d7d"), style);
|
|
const iconLayer = createLayer(key, null, null, style);
|
|
addLayers([
|
|
...backLayers2,
|
|
iconLayer
|
|
]);
|
|
}
|
|
break;
|
|
case EventType.DesktopColor:
|
|
{
|
|
const backLayers2 = createBackLayer(info.bounds.size, colorOf(obj.tab ?? evinfo.defaultTab), style);
|
|
console.log(info.bounds.size);
|
|
const iconColorLayer = createLayer(`${key}_0`, new Point(0, iconSize), new Color(obj.endColor ?? "ffffff"), style);
|
|
const iconLayer = createLayer(`${key}_1`, new Point(0, iconSize), null, style);
|
|
addLayers([
|
|
...backLayers2,
|
|
iconColorLayer,
|
|
iconLayer
|
|
]);
|
|
}
|
|
break;
|
|
case EventType.PulseFreeTimeBeat:
|
|
{
|
|
const hold = obj.hold ?? 0;
|
|
const holdLayer = hold > 0 ? createLayer(evbarea, new Rect(info.bounds.width, 0, iconSize * hold - info.bounds.width, info.bounds.height), new Color(style.active ? 4291839731 : 4286462352), style) : null;
|
|
if (holdLayer) {
|
|
holdLayer.style.pointerEvents = "none";
|
|
}
|
|
const backLayers2 = createBackLayer(new Size(info.bounds.width, info.bounds.height), beatColor, style);
|
|
const hitLayer = obj.pulse === 6 ? createLayer(hit, new Point(0, 0), null, style) : null;
|
|
let text = "";
|
|
switch (obj.action) {
|
|
case "Custom":
|
|
text = ((obj.customPulse ?? 0) + 1).toString();
|
|
break;
|
|
case "Increment":
|
|
text = ">";
|
|
break;
|
|
case "Decrement":
|
|
text = "<";
|
|
break;
|
|
case "Remove":
|
|
text = "x";
|
|
break;
|
|
}
|
|
const textLayer = createRDFontLayer(text, style, null);
|
|
textLayer.style.left = `${1.5 * style.scale}px`;
|
|
textLayer.style.top = `${10 * style.scale}px`;
|
|
addLayers([
|
|
holdLayer,
|
|
...backLayers2,
|
|
hitLayer,
|
|
textLayer
|
|
]);
|
|
}
|
|
break;
|
|
case EventType.ReorderRooms:
|
|
case EventType.ReorderWindows:
|
|
{
|
|
const backLayers2 = createBackLayer(info.bounds.size, colorOf(obj.tab ?? evinfo.defaultTab), style);
|
|
const orderLayers = [];
|
|
const order = obj.order ?? [
|
|
0,
|
|
1,
|
|
2,
|
|
3
|
|
];
|
|
for (let i = 0; i < order.length; i++) {
|
|
{
|
|
const orderLayer = createLayer(`${key}_${order[i]}`, new Point(0, i * iconSize), null, style);
|
|
orderLayers.push(orderLayer);
|
|
}
|
|
}
|
|
addLayers([
|
|
...backLayers2,
|
|
...orderLayers
|
|
]);
|
|
}
|
|
break;
|
|
case EventType.SayReadyGetSetGo:
|
|
{
|
|
const wordInfo = WordInfos[obj.phraseToSay ?? SayReadyGetSetGoWords.JustSayGo];
|
|
const len = wordInfo.length * (obj.tick ?? 0) + 1;
|
|
const stringToJoin = wordInfo.phrase.split(" ");
|
|
const stringToDraw = [
|
|
stringToJoin[0]
|
|
];
|
|
let lw = measureRDFontText(stringToJoin[0]);
|
|
const sw = measureRDFontText(" ");
|
|
const backLayers2 = createBackLayer(new Size(len * iconSize, iconSize), colorOf(obj.tab ?? evinfo.defaultTab), style);
|
|
const wordLayers = [];
|
|
for (let i = 1; i < stringToJoin.length; i++) {
|
|
const part = stringToJoin[i];
|
|
const w = measureRDFontText(part);
|
|
if (lw + sw + w > len * iconSize * style.scale) {
|
|
lw = w;
|
|
stringToDraw.push(part);
|
|
} else {
|
|
lw += sw + w;
|
|
stringToDraw[stringToDraw.length - 1] += " " + part;
|
|
}
|
|
}
|
|
const c = Math.min(stringToDraw.length, 3);
|
|
let top = iconSize / 2 - charHeight * c / 4 + 1;
|
|
for (let i = 0; i < c; i++) {
|
|
const line = stringToDraw[i];
|
|
const p = new Point((len * iconSize - measureRDFontText(line) / 2) / 2, top + (i * charHeight + lineHeight) / 2);
|
|
const wordLayer = createRDFontLayer(line, {
|
|
...style,
|
|
scale: style.scale / 2
|
|
}, null);
|
|
wordLayer.style.left = `${p.x * style.scale}px`;
|
|
wordLayer.style.top = `${p.y * style.scale}px`;
|
|
wordLayers.push(wordLayer);
|
|
}
|
|
addLayers([
|
|
...backLayers2,
|
|
...wordLayers
|
|
]);
|
|
}
|
|
break;
|
|
case EventType.SetRowXs:
|
|
{
|
|
const syncoBeat = obj.syncoBeat ?? -1;
|
|
const width = info.bounds.width / 6;
|
|
const iconBounds = slices.get(beatx).bounds;
|
|
const s = width / iconBounds.width;
|
|
let left = 0;
|
|
const top = iconSize / 2 - iconBounds.height * s / 2;
|
|
const patternLayers = [];
|
|
const backLayers2 = createBackLayer(new Size(info.bounds.width, info.bounds.height), colorOf(obj.tab ?? evinfo.defaultTab), style);
|
|
for (let p of obj.pattern) {
|
|
const beatxLayer = createLayer(p === "x" ? beatx : beatline, new Rect(left, top, width, iconBounds.height * s), null, style);
|
|
patternLayers.push(beatxLayer);
|
|
left += width;
|
|
}
|
|
const syncoBeatLayer = syncoBeat >= 0 ? createLayer(beatsynco, new Rect(width * syncoBeat, top, width, iconBounds.height * s), null, style) : null;
|
|
addLayers([
|
|
...backLayers2,
|
|
...patternLayers,
|
|
syncoBeatLayer
|
|
]);
|
|
}
|
|
break;
|
|
case EventType.ShowRooms:
|
|
{
|
|
const backLayers2 = createBackLayer(new Size(iconSize, iconSize * 4), colorOf(obj.tab ?? evinfo.defaultTab), style);
|
|
const roomLayers = [];
|
|
for (let i = 0; i < 4; i++) {
|
|
const roomLayer = createLayer(`${key}_${obj.rooms.indexOf(i) >= 0 ? "1" : "0"}`, new Point(0, i * iconSize * style.scale), null, {
|
|
...style,
|
|
scale: style.scale / 2
|
|
});
|
|
roomLayers.push(roomLayer);
|
|
}
|
|
addLayers([
|
|
...backLayers2,
|
|
...roomLayers
|
|
]);
|
|
}
|
|
break;
|
|
default:
|
|
const backLayers = createBackLayer(info.bounds.size, colorOf(obj.tab ?? evinfo.defaultTab), style);
|
|
addLayers(backLayers);
|
|
switch (evttype) {
|
|
case EventType.CustomFlash:
|
|
const iconLayer = createLayer(key, null, null, style);
|
|
const startColorLayer = createLayer(`${key}_0`, null, new Color(obj.startColor ?? "000000").withAlpha((obj.startOpacity ?? 0) * 255), style);
|
|
const endColorLayer = createLayer(`${key}_1`, null, new Color(obj.endColor ?? "000000").withAlpha((obj.endOpacity ?? 0) * 255), style);
|
|
addLayers([
|
|
iconLayer,
|
|
startColorLayer,
|
|
endColorLayer
|
|
]);
|
|
break;
|
|
case EventType.FlipScreen:
|
|
{
|
|
const flip = (obj.flipX ? 1 : 0) | (obj.flipY ? 2 : 0);
|
|
const iconLayer2 = createLayer(flip === 0 ? `${key}_0` : `${key}_${flip - 1}`, null, null, style);
|
|
addLayers([
|
|
iconLayer2
|
|
]);
|
|
}
|
|
break;
|
|
case EventType.FloatingText:
|
|
{
|
|
const backColorLayer = createLayer(`${key}_0`, null, Color.FromRgba(obj.color ?? "FFFFFFFF"), style);
|
|
const foreColorLayer = createLayer(`${key}_1`, null, Color.FromRgba(obj.outlineColor ?? "FFFFFFFF"), style);
|
|
addLayers([
|
|
backColorLayer,
|
|
foreColorLayer
|
|
]);
|
|
}
|
|
break;
|
|
case EventType.MoveRoom:
|
|
{
|
|
const degree = obj.angle ?? 0;
|
|
const radius = -degree * Math.PI / 180;
|
|
let width = (obj.scale ? obj.scale[0] ?? 0 : 100) / 100;
|
|
let height = (obj.scale ? obj.scale[1] ?? 0 : 100) / 100;
|
|
const pleft = (obj.pivot ? obj.pivot[0] ?? 0 : 50) / 100;
|
|
const ptop = (obj.pivot ? obj.pivot[1] ?? 0 : 50) / 100;
|
|
if (width === 0 || height === 0) break;
|
|
const uniform = Math.sqrt(width * width + height * height);
|
|
width /= uniform;
|
|
height /= uniform;
|
|
const roomLayer = createLayer(key, new Rect(iconSize / 2, iconSize / 2, iconSize * width, iconSize * height), null, style);
|
|
let pivotx = width * (1 - pleft * 2);
|
|
let pivoty = height * (1 - ptop * 2);
|
|
const widthrotated = pivotx * Math.cos(radius) + pivoty * Math.sin(radius);
|
|
const heightrotated = -pivotx * Math.sin(radius) + pivoty * Math.cos(radius);
|
|
const pointLayer = document.createElement("div");
|
|
pointLayer.style.position = "absolute";
|
|
pointLayer.style.width = `${style.scale}px`;
|
|
pointLayer.style.height = `${style.scale}px`;
|
|
pointLayer.style.left = `${iconSize * (1 - widthrotated) * style.scale / 2}px`;
|
|
pointLayer.style.top = `${iconSize * (1 + heightrotated) * style.scale / 2}px`;
|
|
pointLayer.style.backgroundColor = "#FF0000";
|
|
roomLayer.style.transform = `translate(-50%, -50%) rotate(${-degree}deg)`;
|
|
addLayers([
|
|
roomLayer,
|
|
pointLayer
|
|
]);
|
|
}
|
|
break;
|
|
case EventType.PaintHands:
|
|
case EventType.Tint:
|
|
case EventType.TintRows:
|
|
{
|
|
const border = obj.border;
|
|
const backColorLayer = createLayer(key, null, Color.FromRgba(obj.tintColor ?? "FFFFFFFF"), style);
|
|
const foreColorLayer = border ? createLayer(border === "Outline" ? `${key}_0` : border === "Glow" ? `${key}_1` : "", null, Color.FromRgba(obj.borderColor ?? "FFFFFFFF"), style) : null;
|
|
addLayers([
|
|
backColorLayer,
|
|
foreColorLayer
|
|
]);
|
|
}
|
|
break;
|
|
case EventType.SetBackgroundColor:
|
|
{
|
|
const backType = obj.backgroundType ?? "Color";
|
|
const iconLayer2 = createLayer(key, null, null, style);
|
|
const images = obj.image ?? [];
|
|
const imagePath = images.length > 0 ? images[0] : "";
|
|
const contentInfo = slices.get(`${key}_1`);
|
|
const colorLayer = createLayer(`${key}_0`, null, Color.FromRgba((backType === "Color" ? obj.color : null) ?? "FFFFFF"), style);
|
|
const contentLayer = backType === "Image" ? createLayer("", contentInfo?.bounds ? new Rect(contentInfo?.bounds.size) : null, null, style) : null;
|
|
if (backType === "Image" && contentLayer) {
|
|
contentLayer.style.backgroundImage = `url(${imagePath})`;
|
|
contentLayer.style.left = `${-(contentInfo?.pivot.x ?? 0) * style.scale}px`;
|
|
contentLayer.style.top = `${-(contentInfo?.pivot.y ?? 0) * style.scale}px`;
|
|
}
|
|
addLayers([
|
|
iconLayer2,
|
|
colorLayer,
|
|
contentLayer
|
|
]);
|
|
}
|
|
break;
|
|
case EventType.SetCrotchetsPerBar:
|
|
{
|
|
const cpb = obj.crotchetsPerBar ?? 0;
|
|
const iconLayer2 = createLayer(key, null, null, style);
|
|
const cpbLayer = createRDFontLayer(cpb > 9 ? "-" : cpb.toString(), style, Color.Black);
|
|
const bLayer = createRDFontLayer("4", style, Color.Black);
|
|
cpbLayer.style.left = `${2 * style.scale}px`;
|
|
cpbLayer.style.top = `${9 * style.scale}px`;
|
|
bLayer.style.left = `${8 * style.scale}px`;
|
|
bLayer.style.top = `${14 * style.scale}px`;
|
|
addLayers([
|
|
iconLayer2,
|
|
cpbLayer,
|
|
bLayer
|
|
]);
|
|
}
|
|
break;
|
|
case EventType.SetForeground:
|
|
{
|
|
const iconLayer2 = createLayer(key, null, null, style);
|
|
const images = obj.image ?? [];
|
|
const imagePath = images.length > 0 ? images[0] : "";
|
|
const contentInfo = slices.get(`${key}_1`);
|
|
const colorLayer = imagePath ? createLayer(`${key}_0`, null, Color.Black, style) : null;
|
|
const contentLayer = imagePath ? createLayer("", contentInfo?.bounds ? new Rect(contentInfo?.bounds.size) : null, null, style) : null;
|
|
if (contentLayer) {
|
|
contentLayer.style.backgroundImage = `url(${imagePath})`;
|
|
contentLayer.style.left = `${-(contentInfo?.pivot.x ?? 0) * style.scale}px`;
|
|
contentLayer.style.top = `${-(contentInfo?.pivot.y ?? 0) * style.scale}px`;
|
|
}
|
|
addLayers([
|
|
iconLayer2,
|
|
colorLayer,
|
|
contentLayer
|
|
]);
|
|
}
|
|
break;
|
|
default:
|
|
const layer = createLayer(key, null, null, style);
|
|
addLayers([
|
|
layer
|
|
]);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
if (evinfo.isDurationEvent) {
|
|
const duration = obj[evinfo.durationKey] ?? 0;
|
|
const durWidth = iconSize * duration;
|
|
const durationLayer = durWidth > info.bounds.width ? createLayer(evbarea, new Rect(info.bounds.width, 0, durWidth - info.bounds.width, info.bounds.height), colorOf(obj.tab ?? evinfo.defaultTab), style) : null;
|
|
if (durationLayer) {
|
|
durationLayer.style.pointerEvents = "none";
|
|
layerHoverInit(durationLayer);
|
|
}
|
|
addLayers([
|
|
durationLayer
|
|
]);
|
|
}
|
|
const rooms = obj.rooms ?? [];
|
|
const roomEnabled = new Color(4292392977);
|
|
const roomDisabled = new Color(4284177243);
|
|
if (evinfo.isRoomEvent) {
|
|
const roomLayers = [];
|
|
for (let i = 0; i < 4; i++) {
|
|
const roomLayer = createLayer(`room_${i}`, new Point(iconSize, 0), rooms.indexOf(i) > -1 ? roomEnabled : roomDisabled, style);
|
|
if (roomLayer) {
|
|
layerHoverInit(roomLayer);
|
|
}
|
|
roomLayers.push(roomLayer);
|
|
}
|
|
const roomTopLayer = rooms.indexOf(4) > -1 ? createLayer(`room_top`, new Point(iconSize, 0), roomEnabled, style) : null;
|
|
if (roomTopLayer) {
|
|
layerHoverInit(roomTopLayer);
|
|
}
|
|
roomLayers.push(roomTopLayer);
|
|
addLayers(roomLayers);
|
|
}
|
|
const condition = obj.if ?? "";
|
|
if (condition.length > 0) {
|
|
const positive = /(?<!~)\d(?!$)/g.test(condition);
|
|
const negative = /~\d(?!$)/g.test(condition);
|
|
const conditionLayer = createLayer(evtag, null, positive ? negative ? new Color(4294967040) : new Color(4278255615) : negative ? new Color(4294901760) : null, style);
|
|
addLayers([
|
|
conditionLayer
|
|
]);
|
|
}
|
|
const tagLayer = obj.tag ? createLayer(`${evtag}_0`, new Point(0, info.bounds.height), new Color(4294952838), style) : null;
|
|
addLayers([
|
|
tagLayer
|
|
]);
|
|
switch (evttype) {
|
|
case EventType.Comment:
|
|
addLayers([
|
|
createHintLayer(obj.text ?? "", info.bounds.width * style.scale, new Color(obj.color ?? "7d7d7d"))
|
|
]);
|
|
break;
|
|
case EventType.FloatingText:
|
|
case EventType.AdvanceText:
|
|
case EventType.ShowStatusSign:
|
|
case EventType.TextExplosion:
|
|
case EventType.ShowDialogue:
|
|
case EventType.ReadNarration:
|
|
case EventType.RenameWindow:
|
|
addLayers([
|
|
createHintLayer(obj.text ?? "", info.bounds.width * style.scale, colorOf(obj.tab ?? evinfo.defaultTab))
|
|
]);
|
|
break;
|
|
case EventType.PlaySong:
|
|
addLayers([
|
|
createHintLayer(obj.song?.filename ?? "", info.bounds.width * style.scale, colorOf(obj.tab ?? evinfo.defaultTab))
|
|
]);
|
|
break;
|
|
case EventType.CallCustomMethod:
|
|
addLayers([
|
|
createHintLayer(obj.methodName ?? "", info.bounds.width * style.scale, colorOf(obj.tab ?? evinfo.defaultTab))
|
|
]);
|
|
break;
|
|
case EventType.TagAction:
|
|
addLayers([
|
|
createHintLayer(obj.Tag ?? "", info.bounds.width * style.scale, colorOf(obj.tab ?? evinfo.defaultTab))
|
|
]);
|
|
break;
|
|
case EventType.PlayAnimation:
|
|
case EventType.PlayExpression:
|
|
addLayers([
|
|
createHintLayer(obj.expression ?? "", info.bounds.width * style.scale, colorOf(obj.tab ?? evinfo.defaultTab))
|
|
]);
|
|
break;
|
|
}
|
|
element.onStateChange = (style2) => {
|
|
style2 = {
|
|
...style2
|
|
};
|
|
internalLayers.forEach((layer) => {
|
|
if (layer.onStateChange) {
|
|
layer.onStateChange(style2);
|
|
}
|
|
});
|
|
};
|
|
return element;
|
|
}
|
|
export {
|
|
createElementEvent
|
|
};
|