comic-bubbles
Version:
Animated comic bubbles - what else?
76 lines (66 loc) • 2.23 kB
JavaScript
import { getScene } from "./sceneCache.mjs"
import { getResourceUrl } from "./helperFunctions.mjs"
export let scenePrefs = undefined
export let scenePrefsMap = new Map()
export async function loadScenePrefs() {
if (scenePrefs != undefined) return
try {
const jsonPath = getResourceUrl('scenePrefs JSON path', '/scenePrefs.json')
const response = await fetch(jsonPath)
scenePrefs = await response.json()
} catch (error) {
console.error(error)
}
}
export async function injectScenePrefs(sceneId) {
await loadScenePrefs()
await flattenPrefs()
fillObj(getScene(sceneId))
}
function fillObj(obj) {
for (let prop in obj) {
//console.log(obj.getPrefStr() + '.' + prop)
if (prop == 'parent' || prop == 'canvas') {
continue
} else if (Array.isArray(obj[prop])) {
// console.log("...isArray")
for (let arrIdx = 0; arrIdx < obj[prop].length; arrIdx++) {
fillObj(obj[prop][arrIdx], scenePrefs)
}
} else if (obj[prop] === undefined || typeof obj[prop] === 'number' || typeof obj[prop] === 'string') {
// console.log('scenePrefs.' + obj.getPrefStr() + '.' + prop)
try {
let key = obj.getPrefStr() + '.' + prop
let scenePrefsValue = scenePrefsMap.get(key)
if (scenePrefsValue !== null && scenePrefsValue != undefined) {
if (key == 'scene.bubCon.bubble.arrow.width' && obj.parent.arrIdx == 0) {
obj.parent.arrow.painted = true
}
if (key == 'scene.bubCon.bubble.connector.height' && obj.parent.arrIdx != 0) {
obj.parent.connector.painted = true
}
obj[prop] = scenePrefsValue
}
} catch (exc) {}
} else {
fillObj(obj[prop])
}
}
}
async function flattenPrefs() {
if (scenePrefsMap.size > 0) return
await loadScenePrefs()
flattenPrefObj(scenePrefs, '', '')
}
function flattenPrefObj(obj, prefix) {
let oldPrefix = prefix
for (let prop in obj) {
if (typeof obj[prop] === 'number' || typeof obj[prop] === 'string') {
let objName = prefix + prop
scenePrefsMap.set(objName, obj[prop])
} else {
let newPrefix = oldPrefix + prop + '.'
flattenPrefObj(obj[prop], newPrefix)
}
}
}