diff --git a/src/ts/globalApi.svelte.ts b/src/ts/globalApi.svelte.ts
index 168dafe1..c2e7af2a 100644
--- a/src/ts/globalApi.svelte.ts
+++ b/src/ts/globalApi.svelte.ts
@@ -35,7 +35,7 @@ import { save } from "@tauri-apps/plugin-dialog";
import { listen } from '@tauri-apps/api/event'
import { registerPlugin } from '@capacitor/core';
import { language } from "src/lang";
-import { startObserveDom } from "./observer";
+import { startObserveDom } from "./observer.svelte";
import { updateGuisize } from "./gui/guisize";
import { encodeCapKeySafe } from "./storage/mobileStorage";
import { updateLorebooks } from "./characters";
diff --git a/src/ts/observer.ts b/src/ts/observer.svelte.ts
similarity index 81%
rename from src/ts/observer.ts
rename to src/ts/observer.svelte.ts
index 652250bc..8d7f2fe3 100644
--- a/src/ts/observer.ts
+++ b/src/ts/observer.svelte.ts
@@ -3,12 +3,14 @@ import { sleep } from "./util";
import { getCurrentCharacter, getCurrentChat, setCurrentChat } from "./storage/database.svelte";
import { runLuaButtonTrigger } from "./process/lua";
+let bgmElement:HTMLAudioElement|null = null;
function nodeObserve(node:HTMLElement){
const triggerName = node.getAttribute('risu-trigger');
const btnEvent = node.getAttribute('risu-btn');
const observerAdded = node.getAttribute('risu-observer');
const hlLang = node.getAttribute('x-hl-lang');
+ const ctrlName = node.getAttribute('risu-ctrl');
if(observerAdded){
return
@@ -87,6 +89,27 @@ function nodeObserve(node:HTMLElement){
}, {once: true})
})
}
+
+ if(ctrlName){
+ const split = ctrlName.split('___');
+
+ switch(split[0]){
+ case 'bgm':{
+ const volume = split[1] === 'auto' ? 0.5 : parseFloat(split[1]);
+ if(!bgmElement){
+ bgmElement = new Audio(split[2]);
+ bgmElement.volume = volume
+ bgmElement.addEventListener('ended', ()=>{
+ bgmElement.remove();
+ bgmElement = null;
+ })
+ bgmElement.play();
+ }
+ break
+ }
+ }
+ }
+
}
export async function startObserveDom(){
@@ -102,11 +125,8 @@ export async function startObserveDom(){
})
})
- //We are using a while loop intead of MutationObserver because MutationObserver is expensive for just a few elements
while(true){
- document.querySelectorAll('[risu-trigger]').forEach(nodeObserve);
- document.querySelectorAll('[risu-btn]').forEach(nodeObserve);
- document.querySelectorAll('[x-hl-lang]').forEach(nodeObserve);
+ document.querySelectorAll('[risu-trigger], [risu-btn], [x-hl-lang], [risu-ctrl]').forEach(nodeObserve);
await sleep(100);
}
}
\ No newline at end of file
diff --git a/src/ts/parser.svelte.ts b/src/ts/parser.svelte.ts
index 4d6d8a3e..75ae99df 100644
--- a/src/ts/parser.svelte.ts
+++ b/src/ts/parser.svelte.ts
@@ -292,7 +292,7 @@ async function renderHighlightableMarkdown(data:string) {
}
-export const assetRegex = /{{(raw|path|img|image|video|audio|bg|emotion|asset|video-img|source)::(.+?)}}/gms
+export const assetRegex = /{{(raw|path|img|image|video|audio|bgm|bg|emotion|asset|video-img|source)::(.+?)}}/gms
async function replaceAsync(string, regexp, replacerFunction) {
const replacements = await Promise.all(
@@ -407,6 +407,8 @@ async function parseAdditionalAssets(data:string, char:simpleCharacterArgument|c
}
return `\n`
}
+ case 'bgm':
+ return `