diff --git a/app.py b/app.py
index 1830b88..e43d7a7 100644
--- a/app.py
+++ b/app.py
@@ -166,7 +166,7 @@ def route_api_songs():
categories = {}
def_category = {'title': None, 'title_en': None}
for cat in raw_categories:
- categories[cat[0]] = {'title': cat[1], 'title_en': cat[2]}
+ categories[cat[0]] = cat[1]
raw_song_skins = query_db('select * from song_skins')
song_skins = {}
@@ -185,15 +185,14 @@ def route_api_songs():
songs_out.append({
'id': song_id,
'title': song[1],
- 'title_en': song[2],
+ 'title_lang': song[2],
'subtitle': song[3],
- 'subtitle_en': song[4],
+ 'subtitle_lang': song[4],
'stars': [
song[5], song[6], song[7], song[8], song[9]
],
'preview': preview,
- 'category': category_out['title'],
- 'category_en': category_out['title_en'],
+ 'category': category_out,
'type': song_type,
'offset': song[13],
'song_skin': song_skin_out
diff --git a/public/src/css/songbg.css b/public/src/css/songbg.css
index 86b4987..6261158 100644
--- a/public/src/css/songbg.css
+++ b/public/src/css/songbg.css
@@ -33,7 +33,8 @@
max-height: calc(50% + 24vw);
}
.touchp2 #songbg{
- height: calc(50% - 5.5vw);
+ height: calc(50% - 5.9vw);
+ min-height: 39.5%;
}
.multiplayer.portrait #songbg{
height: calc(50% - 37vw);
@@ -89,6 +90,9 @@
height: calc(50% - 13.7vw);
min-height: 25.6%;
}
+.multiplayer .donbg{
+ min-height: 27.2%;
+}
.portrait .donbg{
height: calc(50% - 48.9vw);
min-height: 22.5%;
diff --git a/public/src/js/about.js b/public/src/js/about.js
index 7afbfd4..15d54f4 100644
--- a/public/src/js/about.js
+++ b/public/src/js/about.js
@@ -11,7 +11,7 @@
if(touchEnabled){
this.tutorialOuter.classList.add("touch-enabled")
}
- this.linkGithub = document.getElementById("link-github")
+ this.linkIssues = document.getElementById("link-issues")
this.linkEmail = document.getElementById("link-email")
var tutorialTitle = document.getElementById("tutorial-title")
@@ -29,7 +29,13 @@
this.endButton.innerText = strings.tutorial.ok
this.endButton.setAttribute("alt", strings.tutorial.ok)
- pageEvents.add(this.linkGithub, ["click", "touchend"], this.linkButton.bind(this))
+ var versionUrl = "https://github.com/bui/taiko-web/"
+ if(gameConfig._version){
+ versionUrl = gameConfig._version.url
+ }
+ this.getLink(this.linkIssues).href = versionUrl + "issues"
+
+ pageEvents.add(this.linkIssues, ["click", "touchend"], this.linkButton.bind(this))
pageEvents.add(this.linkEmail, ["click", "touchend"], this.linkButton.bind(this))
pageEvents.once(this.endButton, ["mousedown", "touchstart"]).then(this.onEnd.bind(this))
pageEvents.keyOnce(this, 13, "down").then(this.onEnd.bind(this))
@@ -141,7 +147,6 @@
}
var issueBody = strings.issueTemplate + "\n\n\n\n" + diag
- this.getLink(this.linkGithub).href += "?body=" + encodeURIComponent(issueBody)
this.getLink(this.linkEmail).href += "?body=" + encodeURIComponent(issueBody.replace(/\n/g, "
\r\n"))
}
getLink(target){
@@ -153,7 +158,7 @@
clean(){
cancelTouch = true
this.gamepad.clean()
- pageEvents.remove(this.linkGithub, ["click", "touchend"])
+ pageEvents.remove(this.linkIssues, ["click", "touchend"])
pageEvents.remove(this.linkEmail, ["click", "touchend"])
pageEvents.remove(this.endButton, ["mousedown", "touchstart"])
if(this.textarea){
@@ -164,7 +169,7 @@
delete this.diagTxt
delete this.version
delete this.tutorialOuter
- delete this.linkGithub
+ delete this.linkIssues
delete this.linkEmail
delete this.textarea
}
diff --git a/public/src/js/controller.js b/public/src/js/controller.js
index d99369d..91204a2 100644
--- a/public/src/js/controller.js
+++ b/public/src/js/controller.js
@@ -32,13 +32,15 @@ class Controller{
this.playedSounds = {}
}
run(syncWith){
+ if(syncWith){
+ this.syncWith = syncWith
+ }
this.game.run()
this.view.run()
- if(syncWith){
- syncWith.run()
+ if(this.multiplayer === 1){
+ syncWith.run(this)
syncWith.game.elapsedTime = this.game.elapsedTime
syncWith.game.startDate = this.game.startDate
- this.syncWith = syncWith
}
requestAnimationFrame(() => {
this.startMainLoop()
@@ -54,16 +56,20 @@ class Controller{
this.mainLoopRunning = true
this.gameLoop()
this.viewLoop()
- this.gameInterval = setInterval(this.gameLoop.bind(this), 1000 / 60)
+ if(this.multiplayer !== 2){
+ this.gameInterval = setInterval(this.gameLoop.bind(this), 1000 / 60)
+ }
}
stopMainLoop(){
this.mainLoopRunning = false
this.mainAsset.stop()
- clearInterval(this.gameInterval)
+ if(this.multiplayer !== 2){
+ clearInterval(this.gameInterval)
+ }
}
gameLoop(){
if(this.mainLoopRunning){
- if(this.syncWith){
+ if(this.multiplayer === 1){
this.syncWith.game.elapsedTime = this.game.elapsedTime
this.syncWith.game.startDate = this.game.startDate
}
@@ -83,6 +89,9 @@ class Controller{
this.game.playMainMusic()
}
}
+ if(this.multiplayer === 1){
+ this.syncWith.gameLoop()
+ }
}
}
viewLoop(){
@@ -90,7 +99,7 @@ class Controller{
if(this.multiplayer !== 2){
requestAnimationFrame(() => {
this.viewLoop()
- if(this.syncWith){
+ if(this.multiplayer === 1){
this.syncWith.viewLoop()
}
if(this.scoresheet){
@@ -161,7 +170,7 @@ class Controller{
this.playSound(soundID + meka, time)
}
togglePause(){
- if(this.syncWith){
+ if(this.multiplayer === 1){
this.syncWith.game.togglePause()
}
this.game.togglePause()
@@ -207,7 +216,7 @@ class Controller{
}
}
clean(){
- if(this.syncWith){
+ if(this.multiplayer === 1){
this.syncWith.clean()
}
this.stopMainLoop()
diff --git a/public/src/js/game.js b/public/src/js/game.js
index 513c0c2..ac74ee8 100644
--- a/public/src/js/game.js
+++ b/public/src/js/game.js
@@ -43,6 +43,12 @@ class Game{
initTiming(){
// Date when the chrono is started (before the game begins)
var offsetTime = Math.max(0, this.timeForDistanceCircle - this.songData.circles[0].ms) |0
+ if(this.controller.multiplayer){
+ var syncWith = this.controller.syncWith
+ var syncCircles = syncWith.game.songData.circles
+ var syncOffsetTime = Math.max(0, this.timeForDistanceCircle - syncCircles[0].ms) |0
+ offsetTime = Math.max(offsetTime, syncOffsetTime)
+ }
this.elapsedTime = -offsetTime
// The real start for the game will start when chrono will reach 0
this.startDate = Date.now() + offsetTime
@@ -320,7 +326,7 @@ class Game{
this.musicFadeOut++
}else if(this.musicFadeOut === 1 && ms >= started + 1600){
this.controller.gameEnded()
- if(!p2.session){
+ if(!p2.session && this.controller.multiplayer === 1){
p2.send("gameend")
}
this.musicFadeOut++
diff --git a/public/src/js/importsongs.js b/public/src/js/importsongs.js
index d81241f..f979240 100644
--- a/public/src/js/importsongs.js
+++ b/public/src/js/importsongs.js
@@ -35,33 +35,23 @@
"ura": 4
}
this.categories = {
- "j-pop": "J-POP",
- "pop": "J-POP",
- "アニメ": "アニメ",
- "anime": "アニメ",
- "アニメ": "アニメ",
- "ボーカロイド™曲": "ボーカロイド™曲",
"ボーカロイド曲": "ボーカロイド™曲",
"ボーカロイド": "ボーカロイド™曲",
- "vocaloid™ music": "ボーカロイド™曲",
"vocaloid music": "ボーカロイド™曲",
"vocaloid": "ボーカロイド™曲",
- "バラエティ": "バラエティ",
"バラエティー": "バラエティ",
"どうよう": "バラエティ",
"童謡・民謡": "バラエティ",
- "variety": "バラエティ",
"children": "バラエティ",
"children/folk": "バラエティ",
"children-folk": "バラエティ",
- "クラシック": "クラシック",
"クラッシック": "クラシック",
- "classical": "クラシック",
- "classic": "クラシック",
- "ゲームミュージック": "ゲームミュージック",
- "game music": "ゲームミュージック",
- "ナムコオリジナル": "ナムコオリジナル",
- "namco original": "ナムコオリジナル"
+ "classic": "クラシック"
+ }
+ for(var i in allStrings){
+ for(var ja in allStrings[i].categories){
+ this.categories[allStrings[i].categories[ja].toLowerCase()] = ja
+ }
}
for(var i = 0; i < files.length; i++){
diff --git a/public/src/js/songselect.js b/public/src/js/songselect.js
index c94cb83..27a2556 100644
--- a/public/src/js/songselect.js
+++ b/public/src/js/songselect.js
@@ -94,11 +94,12 @@ class SongSelect{
this.songs = []
for(let song of assets.songs){
- var en = strings.id === "en" && song.title_en
+ var title = this.getLocalTitle(song.title, song.title_lang)
+ var subtitle = this.getLocalTitle(title === song.title ? song.subtitle : "", song.subtitle_lang)
this.songs.push({
id: song.id,
- title: en ? song.title_en : song.title,
- subtitle: en ? song.subtitle_en : song.subtitle,
+ title: title,
+ subtitle: subtitle,
skin: song.category in this.songSkin ? this.songSkin[song.category] : this.songSkin.default,
stars: song.stars,
category: song.category,
@@ -1325,7 +1326,7 @@ class SongSelect{
if(this.selectedDiff === 4 + this.diffOptions.length){
currentDiff = 3
}
- if(i === currentSong.p2Cursor){
+ if(i === currentSong.p2Cursor && p2.socket.readyState === 1){
this.draw.diffCursor({
ctx: ctx,
font: this.font,
@@ -1349,7 +1350,7 @@ class SongSelect{
font: this.font,
x: _x,
y: _y - 65,
- side: currentSong.p2Cursor === currentDiff
+ side: currentSong.p2Cursor === currentDiff && p2.socket.readyState === 1
})
}
if(highlight){
@@ -1664,7 +1665,7 @@ class SongSelect{
})
}
this.draw.songFrame(config)
- if(config.song.p2Cursor){
+ if(config.song.p2Cursor && p2.socket.readyState === 1){
this.draw.diffCursor({
ctx: ctx,
font: this.font,
@@ -1853,6 +1854,22 @@ class SongSelect{
return ((index % length) + length) % length
}
+ getLocalTitle(title, titleLang){
+ if(titleLang){
+ titleLang = titleLang.split("\n")
+ titleLang.forEach(line => {
+ var space = line.indexOf(" ")
+ var id = line.slice(0, space)
+ if(id === strings.id){
+ title = line.slice(space + 1)
+ }else if(titleLang.length === 1 && strings.id === "en" && !(id in allStrings)){
+ title = line
+ }
+ })
+ }
+ return title
+ }
+
getMS(){
return Date.now()
}
diff --git a/public/src/js/strings.js b/public/src/js/strings.js
index 92ca76c..e0a68c2 100644
--- a/public/src/js/strings.js
+++ b/public/src/js/strings.js
@@ -78,7 +78,7 @@
bugReporting: [
"このシミュレータは現在開発中です。",
"バグが発生した場合は、報告してください。",
- "GitHubかメールでバグを報告してください。"
+ "Gitリポジトリかメールでバグを報告してください。"
],
diagnosticWarning: "以下の端末診断情報も併せて報告してください!",
issueTemplate: "###### 下記の問題を説明してください。 スクリーンショットと診断情報を含めてください。"
@@ -169,7 +169,7 @@ function StringsEn(){
bugReporting: [
"This simulator is still in development.",
"Please report any bugs you find.",
- "You can report bugs either via GitHub or email."
+ "You can report bugs either via our Git repository or email."
],
diagnosticWarning: "Be sure to include the following diagnostic data!",
issueTemplate: "###### Describe the problem you are having below. Please include a screenshot and the diagnostic information."
@@ -260,7 +260,7 @@ function StringsCn(){
bugReporting: [
"This simulator is still in development.",
"Please report any bugs you find.",
- "You can report bugs either via GitHub or email."
+ "You can report bugs either via our Git repository or email."
],
diagnosticWarning: "Be sure to include the following diagnostic data!",
issueTemplate: "###### Describe the problem you are having below. Please include a screenshot and the diagnostic information."
@@ -351,7 +351,7 @@ function StringsTw(){
bugReporting: [
"This simulator is still in development.",
"Please report any bugs you find.",
- "You can report bugs either via GitHub or email."
+ "You can report bugs either via our Git repository or email."
],
diagnosticWarning: "Be sure to include the following diagnostic data!",
issueTemplate: "###### Describe the problem you are having below. Please include a screenshot and the diagnostic information."
@@ -442,7 +442,7 @@ function StringsKo(){
bugReporting: [
"This simulator is still in development.",
"Please report any bugs you find.",
- "You can report bugs either via GitHub or email."
+ "You can report bugs either via our Git repository or email."
],
diagnosticWarning: "Be sure to include the following diagnostic data!",
issueTemplate: "###### Describe the problem you are having below. Please include a screenshot and the diagnostic information."
diff --git a/public/src/js/view.js b/public/src/js/view.js
index eb860bb..046286f 100644
--- a/public/src/js/view.js
+++ b/public/src/js/view.js
@@ -220,7 +220,7 @@
this.drawGogoTime()
- if(!touchMultiplayer){
+ if(!touchMultiplayer || this.multiplayer === 1 && frameTop >= 0){
this.assets.drawAssets("background")
}
diff --git a/public/src/views/about.html b/public/src/views/about.html
index 070bb2c..7ec8436 100644
--- a/public/src/views/about.html
+++ b/public/src/views/about.html
@@ -4,8 +4,8 @@