taiko-web/public/src/js/loader.js

249 lines
7.0 KiB
JavaScript
Raw Normal View History

2018-09-11 00:17:13 +02:00
class Loader{
constructor(callback){
this.callback = callback
2018-09-11 00:17:13 +02:00
this.loadedAssets = 0
this.assetsDiv = document.getElementById("assets")
this.screen = document.getElementById("screen")
2018-12-13 10:18:52 +01:00
this.startTime = Date.now()
var promises = []
promises.push(this.ajax("/src/views/loader.html").then(page => {
this.screen.innerHTML = page
}))
promises.push(this.ajax("/api/config").then(conf => {
gameConfig = JSON.parse(conf)
}))
Promise.all(promises).then(this.run.bind(this))
2018-09-11 00:17:13 +02:00
}
run(){
2018-09-18 00:37:59 +02:00
this.promises = []
2018-09-11 00:17:13 +02:00
this.loaderPercentage = document.querySelector("#loader .percentage")
2018-09-18 00:37:59 +02:00
this.loaderProgress = document.querySelector("#loader .progress")
var queryString = gameConfig._version ? "?" + gameConfig._version.commit_short : ""
assets.js.forEach(name => {
var script = document.createElement("script")
this.addPromise(pageEvents.load(script))
script.src = "/src/js/" + name + queryString
document.head.appendChild(script)
})
this.addPromise(new Promise(resolve => {
var cssCount = document.styleSheets.length + assets.css.length
assets.css.forEach(name => {
var stylesheet = document.createElement("link")
stylesheet.rel = "stylesheet"
stylesheet.href = "/src/css/" + name + queryString
document.head.appendChild(stylesheet)
})
var checkStyles = () => {
if(document.styleSheets.length >= cssCount){
resolve()
clearInterval(interval)
}
}
var interval = setInterval(checkStyles, 100)
checkStyles()
}))
assets.fonts.forEach(name => {
var font = document.createElement("h1")
font.style.fontFamily = name
font.appendChild(document.createTextNode("I am a font"))
this.assetsDiv.appendChild(font)
})
assets.img.forEach(name => {
var id = this.getFilename(name)
var image = document.createElement("img")
this.addPromise(pageEvents.load(image))
image.id = name
image.src = gameConfig.assets_baseurl + "img/" + name
this.assetsDiv.appendChild(image)
assets.image[id] = image
})
assets.views.forEach(name => {
var id = this.getFilename(name)
this.addPromise(this.ajax("/src/views/" + name + queryString).then(page => {
assets.pages[id] = page
}))
})
this.addPromise(this.ajax("/api/songs").then(songs => {
assets.songsDefault = JSON.parse(songs)
assets.songs = assets.songsDefault
}))
this.afterJSCount =
[assets.audioOgg, "blurPerformance", "P2Connection"].length +
assets.fonts.length +
assets.audioSfx.length +
assets.audioMusic.length +
assets.audioSfxLR.length +
assets.audioSfxLoud.length
Promise.all(this.promises).then(() => {
snd.buffer = new SoundBuffer()
snd.musicGain = snd.buffer.createGain()
snd.sfxGain = snd.buffer.createGain()
snd.previewGain = snd.buffer.createGain()
snd.sfxGainL = snd.buffer.createGain("left")
snd.sfxGainR = snd.buffer.createGain("right")
snd.sfxLoudGain = snd.buffer.createGain()
snd.buffer.setCrossfade(
[snd.musicGain, snd.previewGain],
[snd.sfxGain, snd.sfxGainL, snd.sfxGainR],
0.5
)
snd.sfxLoudGain.setVolume(1.2)
this.afterJSCount--
this.addPromise(snd.buffer.load(gameConfig.assets_baseurl + "audio/" + assets.audioOgg).then(() => {
2018-10-28 10:59:49 +01:00
this.oggNotSupported = false
}, () => {
this.oggNotSupported = true
}).then(() => {
this.afterJSCount = 0
2018-10-28 10:59:49 +01:00
assets.fonts.forEach(name => {
this.addPromise(new Promise(resolve => {
FontDetect.onFontLoaded(name, resolve, resolve, {msTimeout: Infinity})
2018-10-28 10:59:49 +01:00
}))
})
assets.audioSfx.forEach(name => {
this.addPromise(this.loadSound(name, snd.sfxGain))
2018-10-28 10:59:49 +01:00
})
assets.audioMusic.forEach(name => {
this.addPromise(this.loadSound(name, snd.musicGain))
2018-10-28 10:59:49 +01:00
})
assets.audioSfxLR.forEach(name => {
this.addPromise(this.loadSound(name, snd.sfxGain).then(sound => {
2018-10-28 10:59:49 +01:00
var id = this.getFilename(name)
assets.sounds[id + "_p1"] = assets.sounds[id].copy(snd.sfxGainL)
assets.sounds[id + "_p2"] = assets.sounds[id].copy(snd.sfxGainR)
}))
})
assets.audioSfxLoud.forEach(name => {
this.addPromise(this.loadSound(name, snd.sfxLoudGain))
2018-10-28 10:59:49 +01:00
})
this.canvasTest = new CanvasTest()
this.addPromise(this.canvasTest.blurPerformance().then(result => {
2018-10-28 10:59:49 +01:00
perf.blur = result
if(result > 1000 / 50){
// Less than 50 fps with blur enabled
disableBlur = true
}
}))
2018-10-28 10:59:49 +01:00
p2 = new P2Connection()
2018-11-01 23:05:18 +01:00
if(location.hash.length === 6){
p2.hashLock = true
this.addPromise(new Promise(resolve => {
2018-11-01 23:05:18 +01:00
p2.open()
pageEvents.add(p2, "message", response => {
if(response.type === "session"){
resolve()
}else if(response.type === "gameend"){
p2.hash("")
p2.hashLock = false
resolve()
}
})
p2.send("invite", location.hash.slice(1).toLowerCase())
2018-11-27 00:05:02 +01:00
setTimeout(() => {
if(p2.socket.readyState !== 1){
p2.hash("")
p2.hashLock = false
resolve()
}
}, 10000)
2018-11-01 23:05:18 +01:00
}).then(() => {
pageEvents.remove(p2, "message")
}))
}else{
p2.hash("")
2018-11-01 23:05:18 +01:00
}
2018-10-28 10:59:49 +01:00
Promise.all(this.promises).then(() => {
this.canvasTest.drawAllImages().then(result => {
perf.allImg = result
2018-12-13 10:18:52 +01:00
perf.load = Date.now() - this.startTime
2018-10-28 10:59:49 +01:00
this.canvasTest.clean()
this.clean()
this.callback()
})
}, this.errorMsg.bind(this))
}))
})
}
addPromise(promise){
this.promises.push(promise)
promise.then(this.assetLoaded.bind(this))
2018-09-18 00:37:59 +02:00
}
loadSound(name, gain){
if(this.oggNotSupported && name.endsWith(".ogg")){
name = name.slice(0, -4) + ".wav"
}
2018-09-18 00:37:59 +02:00
var id = this.getFilename(name)
2018-10-28 10:59:49 +01:00
return gain.load(gameConfig.assets_baseurl + "audio/" + name).then(sound => {
2018-09-18 00:37:59 +02:00
assets.sounds[id] = sound
2018-09-11 00:17:13 +02:00
})
2015-07-17 10:22:46 +02:00
}
2018-09-18 00:37:59 +02:00
getFilename(name){
return name.slice(0, name.lastIndexOf("."))
}
2018-12-03 23:23:11 +01:00
errorMsg(error){
console.error(error)
2018-09-18 00:37:59 +02:00
this.error = true
this.loaderPercentage.appendChild(document.createElement("br"))
this.loaderPercentage.appendChild(document.createTextNode("An error occurred, please refresh"))
this.clean()
2015-07-17 10:22:46 +02:00
}
2018-09-11 00:17:13 +02:00
assetLoaded(){
2018-09-18 00:37:59 +02:00
if(!this.error){
this.loadedAssets++
var percentage = Math.floor(this.loadedAssets * 100 / (this.promises.length + this.afterJSCount))
2018-09-18 00:37:59 +02:00
this.loaderProgress.style.width = percentage + "%"
this.loaderPercentage.firstChild.data = percentage + "%"
}
}
changePage(name, patternBg){
2018-10-09 08:59:36 +02:00
this.screen.innerHTML = assets.pages[name]
this.screen.classList[patternBg ? "add" : "remove"]("pattern-bg")
2018-09-18 00:37:59 +02:00
}
ajax(url, customRequest){
return new Promise((resolve, reject) => {
var request = new XMLHttpRequest()
request.open("GET", url)
pageEvents.load(request).then(() => {
resolve(request.response)
}, reject)
if(customRequest){
customRequest(request)
}
request.send()
})
}
clean(){
2018-12-13 10:18:52 +01:00
var fontDetectDiv = document.getElementById("fontdetectHelper")
fontDetectDiv.parentNode.removeChild(fontDetectDiv)
2018-09-18 00:37:59 +02:00
delete this.assetsDiv
delete this.loaderPercentage
delete this.loaderProgress
delete this.promises
2018-10-12 20:04:28 +02:00
pageEvents.remove(root, "touchstart")
2015-07-17 10:22:46 +02:00
}
2018-09-11 00:17:13 +02:00
}