diff --git a/public/src/css/loader.css b/public/src/css/loader.css index de0e97d..2899ce0 100644 --- a/public/src/css/loader.css +++ b/public/src/css/loader.css @@ -64,28 +64,27 @@ body{ left: 0; max-height: 100%; overflow: hidden auto; - padding: 10px; + padding: 0.5em; background: #aef; font-family: sans-serif; font-size: 20px; cursor: default; z-index: 10; } -#unsupportedBrowser::before{ - content: "!"; +#unsupportedWarn{ display: inline-block; - width: 30px; - height: 30px; - margin-right: 10px; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; background: #39a; color: #fff; text-align: center; - line-height: 30px; + line-height: 1.5em; } #unsupportedBrowser.hidden{ - width: 30px; + width: 1.5em; } -#unsupportedBrowser.hidden *{ +#unsupportedBrowser.hidden *:not(#unsupportedWarn){ display: none !important; } #unsupportedBrowser a{ @@ -97,13 +96,13 @@ body{ text-decoration: underline; } #unsupportedBrowser ul{ - margin: 5px; + margin: 0.25em; } #unsupportedDetails{ display: none; - margin: 10px 50px 0 50px; - border: 3px solid #39a; - padding: 5px; + margin: 0.5em 2.5em 0 2.5em; + border: 0.15em solid #39a; + padding: 0.25em; cursor: auto; user-select: text; } @@ -111,10 +110,10 @@ body{ position: absolute; right: 0; top: 0; - width: 50px; - height: 50px; + width: 2.5em; + height: 2.5em; text-align: center; - line-height: 45px; + line-height: 2.25em; color: #777; - text-shadow: 1px 1px #fff; + text-shadow: 0.05em 0.05em #fff; } diff --git a/public/src/css/songbg.css b/public/src/css/songbg.css index 6261158..05cbe6b 100644 --- a/public/src/css/songbg.css +++ b/public/src/css/songbg.css @@ -110,9 +110,13 @@ top: calc(50% + -1vw); bottom: auto; } -@keyframes donbg-scroll{ +@keyframes donbg-scroll1{ from{background-position-x: 0} - to{background-position-x: calc(var(--h) / var(--sh1) * var(--sw) * -1)} + to{background-position-x: calc(var(--h) / var(--sh1) * var(--sw1) * -1)} +} +@keyframes donbg-scroll2{ + from{background-position-x: 0} + to{background-position-x: calc(var(--h) / var(--sh1) * var(--sw2) * -1)} } @keyframes donbg-raise{ from{background-position-y: 0} @@ -134,7 +138,7 @@ 30%{background-position-y: 0} } .donlayer1{ - animation: 5s linear donbg-scroll infinite; + animation: 5s linear donbg-scroll1 infinite; background-size: auto 100%; } .donlayer2{ @@ -154,21 +158,27 @@ .donbg-4 .donlayer2, .donbg-6 .donlayer2, .donbg-raise .donlayer2{ - animation: 5s linear donbg-scroll infinite, 1s linear donbg-raise infinite alternate; + animation: 5s linear donbg-scroll2 infinite, 1s linear donbg-raise infinite alternate; } .donbg-3 .donlayer2, .donbg-anim3 .donlayer2{ - animation: 3.4s linear donbg-scroll infinite, 1.8s linear donbg-anim3 infinite; + animation: 3.4s linear donbg-scroll2 infinite, 1.8s linear donbg-anim3 infinite; } .donbg-5 .donlayer2, .donbg-anim5 .donlayer2{ - animation: 2.7s linear donbg-scroll infinite, 2.2s linear donbg-anim5 infinite; + animation: 2.7s linear donbg-scroll2 infinite, 2.2s linear donbg-anim5 infinite; +} +.donbg-equalscroll .donlayer1{ + animation: 5.3s linear donbg-scroll1 infinite; +} +.donbg-equalscroll .donlayer2{ + animation: 5.3s linear donbg-scroll2 infinite; } .donbg-fastscroll .donlayer1{ - animation: 2s linear donbg-scroll infinite; + animation: 2s linear donbg-scroll1 infinite; } .donbg-fastscroll .donlayer2{ - animation: 1s linear donbg-scroll infinite; + animation: 1s linear donbg-scroll2 infinite; } #tetsuohana{ diff --git a/public/src/js/assets.js b/public/src/js/assets.js index 91eb0fa..22ddedd 100644 --- a/public/src/js/assets.js +++ b/public/src/js/assets.js @@ -26,7 +26,6 @@ var assets = { "about.js", "debug.js", "session.js", - "strings.js", "importsongs.js" ], "css": [ diff --git a/public/src/js/browsersupport.js b/public/src/js/browsersupport.js index ab142f9..0ba2898 100644 --- a/public/src/js/browsersupport.js +++ b/public/src/js/browsersupport.js @@ -49,72 +49,138 @@ function browserSupport(){ return el.style.length !== 0 } } - var failedTests = [] + failedTests = [] for(var name in tests){ var result = false try{ result = tests[name]() }catch(e){} if(result === false){ - failedTests.push("
  • " + name + "
  • ") + failedTests.push(name) } } if(failedTests.length !== 0){ - var div = document.createElement("div") - div.id = "unsupportedBrowser" - - div.innerHTML = -'
    x
    \ -You are running an unsupported browser (\ -Details...)\ -
    \ -The following tests have failed:\ -\ -Please use a supported browser such as \ -Google Chrome\ -
    ' - - document.body.appendChild(div) - var link = document.getElementById("unsupportedLink") - var details = document.getElementById("unsupportedDetails") - var hide = document.getElementById("unsupportedHide") - var chrome = document.getElementById("unsupportedChrome") - var divClick = function(event){ - if(event.type === "touchstart"){ - event.preventDefault() - getSelection().removeAllRanges() - } - div.classList.remove("hidden") - } - div.addEventListener("click", divClick) - div.addEventListener("touchstart", divClick) - var toggleDetails = function(event){ - if(event.type === "touchstart"){ - event.preventDefault() - } - if(details.style.display === "block"){ - details.style.display = "" - }else{ - details.style.display = "block" - } - } - link.addEventListener("click", toggleDetails) - link.addEventListener("touchstart", toggleDetails) - var hideClick = function(event){ - if(event.type === "touchstart"){ - event.preventDefault() - } - event.stopPropagation() - div.classList.add("hidden") - } - hide.addEventListener("click", hideClick) - hide.addEventListener("touchstart", hideClick) - chrome.addEventListener("touchend", function(event){ - event.preventDefault() - chrome.click() - }) + showUnsupported() } } +function showUnsupported(strings){ + if(!strings){ + var lang + try{ + if("localStorage" in window && window.localStorage.lang && window.localStorage.lang in allStrings){ + lang = window.localStorage.lang + } + if(!lang && "languages" in navigator){ + var userLang = navigator.languages.slice() + userLang.unshift(navigator.language) + for(var i in userLang){ + for(var j in allStrings){ + if(allStrings[j].regex.test(userLang[i])){ + lang = j + } + } + } + } + }catch(e){} + if(!lang){ + lang = "en" + } + strings = allStrings[lang] + } + + var div = document.getElementById("unsupportedBrowser") + if(div){ + div.parentNode.removeChild(div) + } + div = document.createElement("div") + div.id = "unsupportedBrowser" + + var warn = document.createElement("div") + warn.id = "unsupportedWarn" + warn.innerText = "!" + div.appendChild(warn) + var hide = document.createElement("div") + hide.id = "unsupportedHide" + hide.innerText = "x" + div.appendChild(hide) + + var span = document.createElement("span") + var browserWarning = strings.browserSupport.browserWarning.split("%s") + for(var i = 0; i < browserWarning.length; i++){ + if(i !== 0){ + var link = document.createElement("a") + link.innerText = strings.browserSupport.details + span.appendChild(link) + } + span.appendChild(document.createTextNode(browserWarning[i])) + } + div.appendChild(span) + + var details = document.createElement("div") + details.id = "unsupportedDetails" + details.appendChild(document.createTextNode(strings.browserSupport.failedTests)) + + var ul = document.createElement("ul") + for(var i = 0; i < failedTests.length; i++){ + var li = document.createElement("li") + li.innerText = failedTests[i] + ul.appendChild(li) + } + details.appendChild(ul) + + var supportedBrowser = strings.browserSupport.supportedBrowser.split("%s") + for(var i = 0; i < supportedBrowser.length; i++){ + if(i !== 0){ + var chrome = document.createElement("a") + chrome.href = "https://www.google.com/chrome/" + chrome.innerText = "Google Chrome" + details.appendChild(chrome) + } + details.appendChild(document.createTextNode(supportedBrowser[i])) + } + + div.appendChild(details) + + document.body.appendChild(div) + var divClick = function(event){ + if(event.type === "touchstart"){ + event.preventDefault() + getSelection().removeAllRanges() + } + div.classList.remove("hidden") + } + div.addEventListener("click", divClick) + div.addEventListener("touchstart", divClick) + var toggleDetails = function(event){ + if(event.type === "touchstart"){ + event.preventDefault() + } + if(details.style.display === "block"){ + details.style.display = "" + }else{ + details.style.display = "block" + } + } + link.addEventListener("click", toggleDetails) + link.addEventListener("touchstart", toggleDetails) + var hideClick = function(event){ + if(event.type === "touchstart"){ + event.preventDefault() + } + event.stopPropagation() + div.classList.add("hidden") + } + hide.addEventListener("click", hideClick) + hide.addEventListener("touchstart", hideClick) + chrome.addEventListener("touchend", function(event){ + event.preventDefault() + chrome.click() + }) + var touchText = function(){ + div.style.fontSize = "4em" + removeEventListener("touchstart", touchText) + } + addEventListener("touchstart", touchText) +} +var failedTests browserSupport() diff --git a/public/src/js/circle.js b/public/src/js/circle.js index de780e7..6d3c650 100644 --- a/public/src/js/circle.js +++ b/public/src/js/circle.js @@ -22,6 +22,7 @@ class Circle{ this.gogoTime = config.gogoTime this.gogoChecked = false this.beatMS = config.beatMS + this.fixedPos = config.fixedPos } getMS(){ return this.ms diff --git a/public/src/js/game.js b/public/src/js/game.js index ac74ee8..75ad645 100644 --- a/public/src/js/game.js +++ b/public/src/js/game.js @@ -284,7 +284,8 @@ class Game{ type: sound, txt: "", speed: circle.speed, - gogoTime: circle.gogoTime + gogoTime: circle.gogoTime, + fixedPos: document.hasFocus() }) circleAnim.played(score, dai) circleAnim.animate(ms) diff --git a/public/src/js/scoresheet.js b/public/src/js/scoresheet.js index 392d8e4..c90381f 100644 --- a/public/src/js/scoresheet.js +++ b/public/src/js/scoresheet.js @@ -396,6 +396,7 @@ class Scoresheet{ fontFamily: this.font, x: 1257, y: 20, + width: 600, align: "right", forceShadow: true }, [ diff --git a/public/src/js/strings.js b/public/src/js/strings.js index e0a68c2..90fd159 100644 --- a/public/src/js/strings.js +++ b/public/src/js/strings.js @@ -88,6 +88,12 @@ linkTutorial: "Share this link with your friend to start playing together! Do not leave this screen while they join.", cancel: "Cancel" } + this.browserSupport = { + browserWarning: "サポートされていないブラウザを実行しています (%s)", + details: "詳しく", + failedTests: "このテストは失敗しました:", + supportedBrowser: "%sなどのサポートされているブラウザを使用してください" + } } function StringsEn(){ this.id = "en" @@ -179,6 +185,12 @@ function StringsEn(){ linkTutorial: "Share this link with your friend to start playing together! Do not leave this screen while they join.", cancel: "Cancel" } + this.browserSupport = { + browserWarning: "You are running an unsupported browser (%s)", + details: "Details...", + failedTests: "The following tests have failed:", + supportedBrowser: "Please use a supported browser such as %s" + } } function StringsCn(){ this.id = "cn" @@ -270,6 +282,12 @@ function StringsCn(){ linkTutorial: "Share this link with your friend to start playing together! Do not leave this screen while they join.", cancel: "Cancel" } + this.browserSupport = { + browserWarning: "You are running an unsupported browser (%s)", + details: "Details...", + failedTests: "The following tests have failed:", + supportedBrowser: "Please use a supported browser such as %s" + } } function StringsTw(){ this.id = "tw" @@ -361,6 +379,12 @@ function StringsTw(){ linkTutorial: "Share this link with your friend to start playing together! Do not leave this screen while they join.", cancel: "Cancel" } + this.browserSupport = { + browserWarning: "You are running an unsupported browser (%s)", + details: "Details...", + failedTests: "The following tests have failed:", + supportedBrowser: "Please use a supported browser such as %s" + } } function StringsKo(){ this.id = "ko" @@ -452,6 +476,12 @@ function StringsKo(){ linkTutorial: "Share this link with your friend to start playing together! Do not leave this screen while they join.", cancel: "Cancel" } + this.browserSupport = { + browserWarning: "You are running an unsupported browser (%s)", + details: "Details...", + failedTests: "The following tests have failed:", + supportedBrowser: "Please use a supported browser such as %s" + } } var allStrings = { "ja": new StringsJa(), diff --git a/public/src/js/titlescreen.js b/public/src/js/titlescreen.js index ee12b42..c39f9ea 100644 --- a/public/src/js/titlescreen.js +++ b/public/src/js/titlescreen.js @@ -98,6 +98,9 @@ class Titlescreen{ this.langId.setAttribute("alt", strings.id.toUpperCase()) loader.screen.style.fontFamily = strings.font loader.screen.style.fontWeight = strings.font === "Microsoft YaHei, sans-serif" ? "bold" : "" + if(failedTests.length !== 0){ + showUnsupported(strings) + } } addLangs(){ for(var i in allStrings){ diff --git a/public/src/js/view.js b/public/src/js/view.js index 046286f..4de2e81 100644 --- a/public/src/js/view.js +++ b/public/src/js/view.js @@ -1062,9 +1062,8 @@ } this.setLayers(donLayers, filename + songSkinName + (notStatic ? "_" : ""), notStatic) } - var w1 = assets.image[asset1].width - var w2 = assets.image[asset2].width - this.donBg.style.setProperty("--sw", w1 > w2 ? w1 : w2) + this.donBg.style.setProperty("--sw1", assets.image[asset1].width) + this.donBg.style.setProperty("--sw2", assets.image[asset2].width) this.donBg.style.setProperty("--sh1", assets.image[asset1].height) this.donBg.style.setProperty("--sh2", assets.image[asset2].height) } @@ -1163,6 +1162,11 @@ var animT = circle.getAnimT() if(ms < animT + 490){ + if(circle.fixedPos){ + circle.fixedPos = false + circle.animT = ms + animT = ms + } var animPoint = (ms - animT) / 490 var bezierPoint = this.calcBezierPoint(this.draw.easeOut(animPoint), this.animateBezier) this.drawCircle(circle, {x: bezierPoint.x, y: bezierPoint.y})