// 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 = /(? { style2 = { ...style2 }; internalLayers.forEach((layer) => { if (layer.onStateChange) { layer.onStateChange(style2); } }); }; return element; } export { createElementEvent };