Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
T
Taiko Web
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nanahira
Taiko Web
Commits
13ca5e36
Commit
13ca5e36
authored
Feb 20, 2019
by
Bui
Committed by
GitHub
Feb 20, 2019
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #136 from bui/parsetja-add-branches
ParseTja: Add branches
parents
440436b3
92510c30
Changes
18
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
673 additions
and
206 deletions
+673
-206
public/src/css/debug.css
public/src/css/debug.css
+16
-4
public/src/js/canvasdraw.js
public/src/js/canvasdraw.js
+8
-4
public/src/js/circle.js
public/src/js/circle.js
+2
-40
public/src/js/debug.js
public/src/js/debug.js
+59
-11
public/src/js/game.js
public/src/js/game.js
+165
-23
public/src/js/importsongs.js
public/src/js/importsongs.js
+1
-1
public/src/js/keyboard.js
public/src/js/keyboard.js
+2
-2
public/src/js/main.js
public/src/js/main.js
+3
-1
public/src/js/mekadon.js
public/src/js/mekadon.js
+15
-7
public/src/js/p2.js
public/src/js/p2.js
+8
-3
public/src/js/parsetja.js
public/src/js/parsetja.js
+138
-59
public/src/js/songselect.js
public/src/js/songselect.js
+42
-22
public/src/js/soundbuffer.js
public/src/js/soundbuffer.js
+1
-1
public/src/js/strings.js
public/src/js/strings.js
+30
-0
public/src/js/titlescreen.js
public/src/js/titlescreen.js
+5
-1
public/src/js/view.js
public/src/js/view.js
+166
-27
public/src/views/debug.html
public/src/views/debug.html
+11
-0
server.py
server.py
+1
-0
No files found.
public/src/css/debug.css
View file @
13ca5e36
...
...
@@ -44,7 +44,8 @@
box-sizing
:
border-box
;
}
#debug
.input-slider
{
#debug
.input-slider
,
#debug
.select
{
display
:
flex
;
width
:
100%
;
height
:
30px
;
...
...
@@ -59,7 +60,8 @@
padding
:
2px
4px
;
text-align
:
center
;
}
#debug
.input-slider
>
span
{
#debug
.input-slider
>
span
,
#debug
.select
>
span
{
display
:
block
;
width
:
10%
;
height
:
100%
;
...
...
@@ -70,10 +72,19 @@
line-height
:
2em
;
cursor
:
pointer
;
}
#debug
.input-slider
>
span
:hover
{
#debug
.input-slider
>
span
:hover
,
#debug
.select
>
span
:hover
{
opacity
:
1
;
background
:
#333
;
}
#debug
.select
select
{
width
:
90%
;
height
:
100%
;
box-sizing
:
border-box
;
font-size
:
18px
;
font-family
:
sans-serif
;
padding
:
2px
4px
;
}
#debug
label
{
display
:
block
;
...
...
@@ -111,6 +122,7 @@
margin-left
:
3px
;
}
#debug
.autoplay-label
{
#debug
.autoplay-label
,
#debug
.branch-hide
{
display
:
none
;
}
public/src/js/canvasdraw.js
View file @
13ca5e36
...
...
@@ -268,6 +268,9 @@
easeOut
(
pos
){
return
Math
.
sin
(
Math
.
PI
/
2
*
pos
)
}
easeOutBack
(
pos
){
return
Math
.
sin
(
Math
.
PI
/
1.74
*
pos
)
*
1.03
}
easeInOut
(
pos
){
return
(
Math
.
cos
(
Math
.
PI
*
pos
)
-
1
)
/
-
2
}
...
...
@@ -572,7 +575,7 @@
}
if
(
symbol
.
ura
){
ctx
.
font
=
(
30
*
mul
)
+
"
px Meiryo, sans-serif
"
ctx
.
textBaseline
=
"
center
"
ctx
.
textBaseline
=
"
middle
"
ctx
.
beginPath
()
ctx
.
arc
(
currentX
,
currentY
+
(
17
*
mul
),
(
18
*
mul
),
0
,
Math
.
PI
*
2
)
if
(
action
===
"
stroke
"
){
...
...
@@ -581,7 +584,7 @@
}
else
if
(
action
===
"
fill
"
){
ctx
.
strokeStyle
=
config
.
fill
ctx
.
lineWidth
=
2.5
*
mul
ctx
.
fillText
(
symbol
.
text
,
currentX
,
currentY
)
ctx
.
fillText
(
symbol
.
text
,
currentX
,
currentY
+
(
17
*
mul
)
)
}
ctx
.
stroke
()
}
else
{
...
...
@@ -788,7 +791,7 @@
}
if
(
symbol
.
ura
){
ctx
.
font
=
(
30
*
mul
)
+
"
px Meiryo, sans-serif
"
ctx
.
textBaseline
=
"
center
"
ctx
.
textBaseline
=
"
middle
"
ctx
.
beginPath
()
ctx
.
arc
(
currentX
,
currentY
+
(
17
*
mul
),
(
18
*
mul
),
0
,
Math
.
PI
*
2
)
if
(
action
===
"
strokeText
"
){
...
...
@@ -797,7 +800,7 @@
}
else
if
(
action
===
"
fillText
"
){
ctx
.
strokeStyle
=
layer
.
fill
ctx
.
lineWidth
=
2.5
*
mul
ctx
.
fillText
(
symbol
.
text
,
currentX
,
currentY
)
ctx
.
fillText
(
symbol
.
text
,
currentX
,
currentY
+
(
17
*
mul
)
)
}
ctx
.
stroke
()
}
else
{
...
...
@@ -1167,6 +1170,7 @@
var
firstTop
=
config
.
multiplayer
?
0
:
30
var
secondTop
=
config
.
multiplayer
?
0
:
8
config
.
percentage
=
Math
.
max
(
0
,
Math
.
min
(
1
,
config
.
percentage
))
var
cleared
=
config
.
percentage
-
1
/
50
>=
config
.
clear
var
gaugeW
=
14
*
50
...
...
public/src/js/circle.js
View file @
13ca5e36
class
Circle
{
constructor
(
config
){
// id, ms, type, text, speed, endTime, requiredHits
this
.
id
=
config
.
id
this
.
ms
=
config
.
start
this
.
originalMS
=
this
.
ms
...
...
@@ -23,38 +22,13 @@ class Circle{
this
.
gogoChecked
=
false
this
.
beatMS
=
config
.
beatMS
this
.
fixedPos
=
config
.
fixedPos
}
getMS
(){
return
this
.
ms
}
getEndTime
(){
return
this
.
endTime
}
getType
(){
return
this
.
type
}
getLastFrame
(){
return
this
.
lastFrame
this
.
branch
=
config
.
branch
this
.
section
=
config
.
section
}
animate
(
ms
){
this
.
animating
=
true
this
.
animT
=
ms
}
isAnimated
(){
return
this
.
animating
}
getAnimT
(){
return
this
.
animT
}
getPlayed
(){
return
this
.
isPlayed
}
isAnimationFinished
(){
return
this
.
animationEnded
}
endAnimation
(){
this
.
animationEnded
=
true
}
played
(
score
,
big
){
this
.
score
=
score
this
.
isPlayed
=
score
<=
0
?
score
-
1
:
(
big
?
2
:
1
)
...
...
@@ -65,16 +39,4 @@ class Circle{
this
.
timesKa
++
}
}
getScore
(){
return
this
.
score
}
getID
(){
return
this
.
id
}
getText
(){
return
this
.
text
}
getSpeed
(){
return
this
.
speed
}
}
\ No newline at end of file
public/src/js/debug.js
View file @
13ca5e36
...
...
@@ -8,15 +8,19 @@ class Debug{
this
.
debugDiv
.
innerHTML
=
assets
.
pages
[
"
debug
"
]
document
.
body
.
appendChild
(
this
.
debugDiv
)
this
.
titleDiv
=
this
.
debugDiv
.
getElementsByClassName
(
"
title
"
)[
0
]
this
.
minimiseDiv
=
this
.
debugDiv
.
getElementsByClassName
(
"
minimise
"
)[
0
]
this
.
offsetDiv
=
this
.
debugDiv
.
getElementsByClassName
(
"
offset
"
)[
0
]
this
.
measureNumDiv
=
this
.
debugDiv
.
getElementsByClassName
(
"
measure-num
"
)[
0
]
this
.
restartCheckbox
=
this
.
debugDiv
.
getElementsByClassName
(
"
change-restart
"
)[
0
]
this
.
autoplayLabel
=
this
.
debugDiv
.
getElementsByClassName
(
"
autoplay-label
"
)[
0
]
this
.
autoplayCheckbox
=
this
.
debugDiv
.
getElementsByClassName
(
"
autoplay
"
)[
0
]
this
.
restartBtn
=
this
.
debugDiv
.
getElementsByClassName
(
"
restart-btn
"
)[
0
]
this
.
exitBtn
=
this
.
debugDiv
.
getElementsByClassName
(
"
exit-btn
"
)[
0
]
this
.
titleDiv
=
this
.
byClass
(
"
title
"
)
this
.
minimiseDiv
=
this
.
byClass
(
"
minimise
"
)
this
.
offsetDiv
=
this
.
byClass
(
"
offset
"
)
this
.
measureNumDiv
=
this
.
byClass
(
"
measure-num
"
)
this
.
branchHideDiv
=
this
.
byClass
(
"
branch-hide
"
)
this
.
branchSelectDiv
=
this
.
byClass
(
"
branch-select
"
)
this
.
branchSelect
=
this
.
branchSelectDiv
.
getElementsByTagName
(
"
select
"
)[
0
]
this
.
branchResetBtn
=
this
.
branchSelectDiv
.
getElementsByClassName
(
"
reset
"
)[
0
]
this
.
restartCheckbox
=
this
.
byClass
(
"
change-restart
"
)
this
.
autoplayLabel
=
this
.
byClass
(
"
autoplay-label
"
)
this
.
autoplayCheckbox
=
this
.
byClass
(
"
autoplay
"
)
this
.
restartBtn
=
this
.
byClass
(
"
restart-btn
"
)
this
.
exitBtn
=
this
.
byClass
(
"
exit-btn
"
)
this
.
moving
=
false
pageEvents
.
add
(
window
,
[
"
mousedown
"
,
"
mouseup
"
,
"
blur
"
],
this
.
stopMove
.
bind
(
this
))
...
...
@@ -26,6 +30,8 @@ class Debug{
pageEvents
.
add
(
this
.
restartBtn
,
"
click
"
,
this
.
restartSong
.
bind
(
this
))
pageEvents
.
add
(
this
.
exitBtn
,
"
click
"
,
this
.
clean
.
bind
(
this
))
pageEvents
.
add
(
this
.
autoplayCheckbox
,
"
change
"
,
this
.
toggleAutoplay
.
bind
(
this
))
pageEvents
.
add
(
this
.
branchSelect
,
"
change
"
,
this
.
branchChange
.
bind
(
this
))
pageEvents
.
add
(
this
.
branchResetBtn
,
"
click
"
,
this
.
branchReset
.
bind
(
this
))
this
.
offsetSlider
=
new
InputSlider
(
this
.
offsetDiv
,
-
60
,
60
,
3
)
this
.
offsetSlider
.
onchange
(
this
.
offsetChange
.
bind
(
this
))
...
...
@@ -39,6 +45,9 @@ class Debug{
this
.
updateStatus
()
pageEvents
.
send
(
"
debug
"
)
}
byClass
(
name
){
return
this
.
debugDiv
.
getElementsByClassName
(
name
)[
0
]
}
startMove
(
event
){
if
(
event
.
which
===
1
){
event
.
stopPropagation
()
...
...
@@ -88,20 +97,28 @@ class Debug{
}
updateStatus
(){
if
(
debugObj
.
controller
&&
!
this
.
controller
){
this
.
controller
=
debugObj
.
controller
this
.
restartBtn
.
style
.
display
=
"
block
"
this
.
autoplayLabel
.
style
.
display
=
"
block
"
if
(
this
.
controller
.
parsedSongData
.
branches
){
this
.
branchHideDiv
.
style
.
display
=
"
block
"
}
this
.
controller
=
debugObj
.
controller
var
selectedSong
=
this
.
controller
.
selectedSong
this
.
defaultOffset
=
selectedSong
.
offset
||
0
if
(
this
.
songFolder
===
selectedSong
.
folder
){
this
.
offsetChange
(
this
.
offsetSlider
.
get
(),
true
)
this
.
branchChange
(
null
,
true
)
}
else
{
this
.
songFolder
=
selectedSong
.
folder
this
.
offsetSlider
.
set
(
this
.
defaultOffset
)
this
.
branchReset
(
null
,
true
)
}
var
measures
=
this
.
controller
.
parsedSongData
.
measures
var
measures
=
this
.
controller
.
parsedSongData
.
measures
.
filter
((
measure
,
i
,
array
)
=>
{
return
i
===
0
||
Math
.
abs
(
measure
.
ms
-
array
[
i
-
1
].
ms
)
>
0.01
})
this
.
measureNumSlider
.
setMinMax
(
0
,
measures
.
length
-
1
)
if
(
this
.
measureNum
&&
measures
.
length
>
this
.
measureNum
){
var
measureMS
=
measures
[
this
.
measureNum
].
ms
...
...
@@ -128,6 +145,7 @@ class Debug{
if
(
this
.
controller
&&
!
debugObj
.
controller
){
this
.
restartBtn
.
style
.
display
=
""
this
.
autoplayLabel
.
style
.
display
=
""
this
.
branchHideDiv
.
style
.
display
=
""
this
.
controller
=
null
}
}
...
...
@@ -142,6 +160,11 @@ class Debug{
songData
.
measures
.
forEach
(
measure
=>
{
measure
.
ms
=
measure
.
originalMS
+
offset
})
if
(
songData
.
branches
){
songData
.
branches
.
forEach
(
branch
=>
{
branch
.
ms
=
branch
.
originalMS
+
offset
})
}
if
(
this
.
restartCheckbox
.
checked
&&
!
noRestart
){
this
.
restartSong
()
}
...
...
@@ -171,21 +194,46 @@ class Debug{
}
}
}
branchChange
(
event
,
noRestart
){
if
(
this
.
controller
){
var
game
=
this
.
controller
.
game
var
name
=
this
.
branchSelect
.
value
game
.
branch
=
name
===
"
auto
"
?
false
:
name
game
.
branchSet
=
name
===
"
auto
"
var
selectedOption
=
this
.
branchSelect
.
selectedOptions
[
0
]
this
.
branchSelect
.
style
.
background
=
selectedOption
.
style
.
background
if
(
this
.
restartCheckbox
.
checked
&&
!
noRestart
){
this
.
restartSong
()
}
}
}
branchReset
(
event
,
noRestart
){
this
.
branchSelect
.
value
=
"
auto
"
this
.
branchChange
(
null
,
noRestart
)
}
clean
(){
this
.
offsetSlider
.
clean
()
this
.
measureNumSlider
.
clean
()
pageEvents
.
remove
(
window
,
[
"
mousedown
"
,
"
mouseup
"
,
"
blur
"
])
pageEvents
.
mouseRemove
(
this
)
pageEvents
.
remove
(
this
.
titleDiv
,
"
mousedown
"
)
pageEvents
.
remove
(
this
.
title
,
"
mousedown
"
)
pageEvents
.
remove
(
this
.
minimiseDiv
,
"
click
"
)
pageEvents
.
remove
(
this
.
restartBtn
,
"
click
"
)
pageEvents
.
remove
(
this
.
exitBtn
,
"
click
"
)
pageEvents
.
remove
(
this
.
autoplayCheckbox
,
"
change
"
)
pageEvents
.
remove
(
this
.
branchSelect
,
"
change
"
)
pageEvents
.
remove
(
this
.
branchResetBtn
,
"
click
"
)
delete
this
.
titleDiv
delete
this
.
minimiseDiv
delete
this
.
offsetDiv
delete
this
.
measureNumDiv
delete
this
.
branchHideDiv
delete
this
.
branchSelectDiv
delete
this
.
branchSelect
delete
this
.
branchResetBtn
delete
this
.
restartCheckbox
delete
this
.
autoplayLabel
delete
this
.
autoplayCheckbox
...
...
public/src/js/game.js
View file @
13ca5e36
This diff is collapsed.
Click to expand it.
public/src/js/importsongs.js
View file @
13ca5e36
...
...
@@ -199,7 +199,7 @@
songObj
.
subtitle
=
songObj
.
subtitle_en
=
subtitle
songObj
.
preview
=
meta
.
demostart
?
Math
.
floor
(
meta
.
demostart
*
1000
)
:
0
if
(
meta
.
level
){
songObj
.
stars
[
this
.
courseTypes
[
diff
]]
=
meta
.
level
songObj
.
stars
[
this
.
courseTypes
[
diff
]]
=
meta
.
level
+
(
meta
.
branch
?
"
B
"
:
""
)
}
if
(
meta
.
wave
){
songObj
.
music
=
this
.
otherFiles
[
dir
+
meta
.
wave
.
toLowerCase
()]
...
...
public/src/js/keyboard.js
View file @
13ca5e36
...
...
@@ -199,8 +199,8 @@ class Keyboard{
if
(
sound
===
"
don
"
&&
circle
&&
!
circle
.
getPlayed
()
&&
circle
.
getType
()
===
"
balloon
"
&&
!
circle
.
isPlayed
&&
circle
.
type
===
"
balloon
"
&&
circle
.
requiredHits
-
circle
.
timesHit
<=
1
){
this
.
controller
.
playSound
(
"
se_balloon
"
)
...
...
public/src/js/main.js
View file @
13ca5e36
...
...
@@ -106,7 +106,9 @@ pageEvents.keyAdd(debugObj, "all", "down", event => {
}
else
if
(
debugObj
.
state
===
"
minimised
"
){
debugObj
.
debug
.
restore
()
}
else
{
try
{
debugObj
.
debug
=
new
Debug
()
}
catch
(
e
){}
}
}
if
(
event
.
keyCode
===
82
&&
debugObj
.
debug
&&
debugObj
.
controller
){
...
...
public/src/js/mekadon.js
View file @
13ca5e36
...
...
@@ -6,12 +6,15 @@ class Mekadon{
this
.
lastHit
=
-
Infinity
}
play
(
circle
){
var
type
=
circle
.
getType
()
if
((
type
===
"
balloon
"
||
type
===
"
drumroll
"
||
type
===
"
daiDrumroll
"
)
&&
this
.
getMS
()
>
circle
.
getEndTime
()){
var
type
=
circle
.
type
if
((
type
===
"
balloon
"
||
type
===
"
drumroll
"
||
type
===
"
daiDrumroll
"
)
&&
this
.
getMS
()
>
circle
.
endTime
){
if
(
circle
.
section
&&
circle
.
timesHit
===
0
){
this
.
game
.
resetSection
()
}
circle
.
played
(
-
1
,
false
)
this
.
game
.
updateCurrentCircle
()
}
type
=
circle
.
getType
()
type
=
circle
.
type
if
(
type
===
"
balloon
"
){
this
.
playDrumrollAt
(
circle
,
0
,
30
)
}
else
if
(
type
===
"
drumroll
"
||
type
===
"
daiDrumroll
"
){
...
...
@@ -21,7 +24,7 @@ class Mekadon{
}
}
playAt
(
circle
,
ms
,
score
,
dai
,
reverse
){
var
currentMs
=
circle
.
getMS
()
-
this
.
getMS
()
var
currentMs
=
circle
.
ms
-
this
.
getMS
()
if
(
ms
>
currentMs
-
10
){
return
this
.
playNow
(
circle
,
score
,
dai
,
reverse
)
}
...
...
@@ -36,18 +39,19 @@ class Mekadon{
}
}
miss
(
circle
){
var
currentMs
=
circle
.
getMS
()
-
this
.
getMS
()
var
currentMs
=
circle
.
ms
-
this
.
getMS
()
if
(
0
>=
currentMs
-
10
){
this
.
controller
.
displayScore
(
0
,
true
)
this
.
game
.
updateCurrentCircle
()
this
.
game
.
updateCombo
(
0
)
this
.
game
.
updateGlobalScore
(
0
,
1
,
circle
.
gogoTime
)
this
.
game
.
sectionNotes
.
push
(
0
)
return
true
}
}
playNow
(
circle
,
score
,
dai
,
reverse
){
var
kbd
=
this
.
controller
.
getBindings
()
var
type
=
circle
.
getType
()
var
type
=
circle
.
type
var
keyDai
=
false
var
playDai
=
!
dai
||
dai
===
2
var
drumrollNotes
=
type
===
"
balloon
"
||
type
===
"
drumroll
"
||
type
===
"
daiDrumroll
"
...
...
@@ -55,7 +59,7 @@ class Mekadon{
if
(
drumrollNotes
){
var
ms
=
this
.
getMS
()
}
else
{
var
ms
=
circle
.
getMS
()
var
ms
=
circle
.
ms
}
if
(
reverse
){
...
...
@@ -95,6 +99,10 @@ class Mekadon{
this
.
game
.
updateGlobalScore
(
score
,
keyDai
?
2
:
1
,
circle
.
gogoTime
)
this
.
game
.
updateCurrentCircle
()
circle
.
played
(
score
,
keyDai
)
if
(
circle
.
section
){
this
.
game
.
resetSection
()
}
this
.
game
.
sectionNotes
.
push
(
score
===
450
?
1
:
(
score
===
230
?
0.5
:
0
))
}
this
.
lastHit
=
ms
return
true
...
...
public/src/js/p2.js
View file @
13ca5e36
...
...
@@ -109,6 +109,7 @@ class P2Connection{
this
.
dai
=
2
this
.
kaAmount
=
0
this
.
results
=
false
this
.
branch
=
"
normal
"
break
case
"
gameend
"
:
this
.
otherConnected
=
false
...
...
@@ -141,6 +142,10 @@ class P2Connection{
this
.
kaAmount
=
response
.
value
.
kaAmount
}
break
case
"
branch
"
:
this
.
branch
=
response
.
value
this
.
branchSet
=
false
break
case
"
session
"
:
this
.
clearMessage
(
"
users
"
)
this
.
otherConnected
=
true
...
...
@@ -161,10 +166,10 @@ class P2Connection{
}
play
(
circle
,
mekadon
){
if
(
this
.
otherConnected
||
this
.
notes
.
length
>
0
){
var
type
=
circle
.
getType
()
var
type
=
circle
.
type
var
drumrollNotes
=
type
===
"
balloon
"
||
type
===
"
drumroll
"
||
type
===
"
daiDrumroll
"
if
(
drumrollNotes
&&
mekadon
.
getMS
()
>
circle
.
getEndTime
()
){
if
(
drumrollNotes
&&
mekadon
.
getMS
()
>
circle
.
endTime
){
circle
.
played
(
-
1
,
false
)
mekadon
.
game
.
updateCurrentCircle
()
}
...
...
@@ -177,7 +182,7 @@ class P2Connection{
var
note
=
this
.
notes
[
0
]
if
(
note
.
score
>=
0
){
var
dai
=
1
if
(
circle
.
getType
()
===
"
daiDon
"
||
circle
.
getType
()
===
"
daiKa
"
){
if
(
circle
.
type
===
"
daiDon
"
||
circle
.
type
===
"
daiKa
"
){
dai
=
this
.
dai
}
if
(
mekadon
.
playAt
(
circle
,
note
.
ms
,
note
.
score
,
dai
,
note
.
reverse
)){
...
...
public/src/js/parsetja.js
View file @
13ca5e36
...
...
@@ -59,8 +59,10 @@
if
(
!
(
courseName
in
courses
)){
courses
[
courseName
]
=
{}
}
if
(
name
!==
"
branch
"
){
courses
[
courseName
][
name
]
=
currentCourse
[
name
]
}
}
courses
[
courseName
].
start
=
lineNum
+
1
courses
[
courseName
].
end
=
this
.
data
.
length
}
...
...
@@ -70,6 +72,8 @@
hasSong
=
true
courses
[
courseName
].
end
=
lineNum
}
}
else
if
(
name
.
startsWith
(
"
branchstart
"
)
&&
inSong
){
courses
[
courseName
].
branch
=
true
}
}
else
if
(
!
inSong
){
...
...
@@ -128,9 +132,13 @@
var
balloons
=
meta
.
balloon
||
[]
var
lastDrumroll
=
false
var
branch
=
false
var
branchType
var
branchPreference
=
"
m
"
var
branchObj
=
{}
var
currentBranch
=
false
var
branchSettings
=
{}
var
branchFirstMeasure
=
false
var
sectionBegin
=
true
var
currentMeasure
=
[]
var
firstNote
=
true
...
...
@@ -138,7 +146,6 @@
var
circleID
=
0
var
pushMeasure
=
()
=>
{
if
(
barLine
){
var
note
=
currentMeasure
[
0
]
if
(
note
){
var
speed
=
note
.
bpm
*
note
.
scroll
/
60
...
...
@@ -148,9 +155,12 @@
this
.
measures
.
push
({
ms
:
ms
,
originalMS
:
ms
,
speed
:
speed
speed
:
speed
,
visible
:
barLine
,
branch
:
currentBranch
,
branchFirst
:
branchFirstMeasure
})
}
branchFirstMeasure
=
false
if
(
currentMeasure
.
length
){
for
(
var
i
=
0
;
i
<
currentMeasure
.
length
;
i
++
){
var
note
=
currentMeasure
[
i
]
...
...
@@ -182,7 +192,9 @@
gogoTime
:
note
.
gogo
,
endTime
:
note
.
endTime
,
requiredHits
:
note
.
requiredHits
,
beatMS
:
60000
/
note
.
bpm
beatMS
:
60000
/
note
.
bpm
,
branch
:
currentBranch
,
section
:
note
.
section
})
if
(
lastDrumroll
===
note
){
lastDrumroll
=
circleObj
...
...
@@ -204,7 +216,6 @@
var
line
=
line
.
slice
(
1
).
toLowerCase
()
var
[
name
,
value
]
=
this
.
split
(
line
,
"
"
)
if
(
!
branch
||
branch
&&
branchType
===
branchPreference
){
switch
(
name
){
case
"
gogostart
"
:
gogo
=
true
...
...
@@ -213,14 +224,14 @@
gogo
=
false
break
case
"
bpmchange
"
:
bpm
=
parseFloat
(
value
)
bpm
=
parseFloat
(
value
)
||
bpm
break
case
"
scroll
"
:
scroll
=
parseFloat
(
value
)
scroll
=
parseFloat
(
value
)
||
scroll
break
case
"
measure
"
:
var
[
numerator
,
denominator
]
=
value
.
split
(
"
/
"
)
measure
=
numerator
/
denominator
*
4
measure
=
numerator
/
denominator
*
4
||
measure
break
case
"
delay
"
:
ms
+=
(
parseFloat
(
value
)
||
0
)
*
1000
...
...
@@ -231,32 +242,87 @@
case
"
barlineoff
"
:
barLine
=
false
break
}
}
switch
(
name
){
case
"
branchstart
"
:
branch
=
true
branchType
=
""
currentBranch
=
false
branchFirstMeasure
=
true
branchSettings
=
{
ms
:
ms
,
gogo
:
gogo
,
bpm
:
bpm
,
scroll
:
scroll
,
sectionBegin
:
sectionBegin
}
value
=
value
.
split
(
"
,
"
)
var
forkType
=
value
[
0
].
toLowerCase
()
if
(
forkType
===
"
r
"
||
parseFloat
(
value
[
2
])
<=
100
){
branchPreference
=
"
m
"
}
else
if
(
parseFloat
(
value
[
1
])
<=
100
){
branchPreference
=
"
e
"
if
(
!
this
.
branches
){
this
.
branches
=
[]
}
var
req
=
{
advanced
:
parseFloat
(
value
[
1
])
||
0
,
master
:
parseFloat
(
value
[
2
])
||
0
}
if
(
req
.
advanced
>
0
){
var
active
=
req
.
master
>
0
?
"
normal
"
:
"
master
"
}
else
{
branchPreference
=
"
n
"
var
active
=
req
.
master
>
0
?
"
advanced
"
:
"
master
"
}
branchObj
=
{
ms
:
ms
,
originalMS
:
ms
,
active
:
active
,
type
:
value
[
0
].
trim
().
toLowerCase
()
===
"
r
"
?
"
drumroll
"
:
"
accuracy
"
,
requirement
:
req
}
this
.
branches
.
push
(
branchObj
)
if
(
this
.
measures
.
length
===
1
&&
branchObj
.
type
===
"
drumroll
"
){
for
(
var
i
=
circles
.
length
;
i
--
;){
var
circle
=
circles
[
i
]
if
(
circle
.
endTime
&&
circle
.
type
===
"
drumroll
"
||
circle
.
type
===
"
daiDrumroll
"
||
circle
.
type
===
"
balloon
"
){
this
.
measures
.
push
({
ms
:
circle
.
endTime
,
originalMS
:
circle
.
endTime
,
speed
:
circle
.
bpm
*
circle
.
scroll
/
60
,
visible
:
false
,
branch
:
circle
.
branch
})
break
}
}
}
if
(
this
.
measures
.
length
!==
0
){
this
.
measures
[
this
.
measures
.
length
-
1
].
nextBranch
=
branchObj
}
break
case
"
branchend
"
:
case
"
section
"
:
branch
=
false
currentBranch
=
false
break
case
"
section
"
:
sectionBegin
=
true
if
(
branch
&&
!
currentBranch
){
branchSettings
.
sectionBegin
=
true
}
break
case
"
n
"
:
case
"
e
"
:
case
"
m
"
:
branchType
=
name
if
(
!
branch
){
break
}
ms
=
branchSettings
.
ms
gogo
=
branchSettings
.
gogo
bpm
=
branchSettings
.
bpm
scroll
=
branchSettings
.
scroll
sectionBegin
=
branchSettings
.
sectionBegin
branchFirstMeasure
=
true
var
branchName
=
name
===
"
m
"
?
"
master
"
:
(
name
===
"
e
"
?
"
advanced
"
:
"
normal
"
)
currentBranch
=
{
name
:
branchName
,
active
:
branchName
===
branchObj
.
active
}
branchObj
[
branchName
]
=
currentBranch
break
}
}
else
if
(
!
branch
||
branch
&&
branchType
===
branchPreference
)
{
}
else
{
var
string
=
line
.
split
(
""
)
...
...
@@ -278,8 +344,10 @@
txt
:
type
.
txt
,
gogo
:
gogo
,
bpm
:
bpm
,
scroll
:
scroll
scroll
:
scroll
,
section
:
sectionBegin
}
sectionBegin
=
false
if
(
lastDrumroll
){
circleObj
.
endDrumroll
=
lastDrumroll
lastDrumroll
=
false
...
...
@@ -293,15 +361,19 @@
txt
:
type
.
txt
,
gogo
:
gogo
,
bpm
:
bpm
,
scroll
:
scroll
scroll
:
scroll
,
section
:
sectionBegin
}
sectionBegin
=
false
if
(
lastDrumroll
){
if
(
symbol
===
"
9
"
){
currentMeasure
.
push
({
endDrumroll
:
lastDrumroll
,
bpm
:
bpm
,
scroll
:
scroll
scroll
:
scroll
,
section
:
sectionBegin
})
sectionBegin
=
false
lastDrumroll
=
false
}
else
{
currentMeasure
.
push
({
...
...
@@ -327,8 +399,10 @@
currentMeasure
.
push
({
endDrumroll
:
lastDrumroll
,
bpm
:
bpm
,
scroll
:
scroll
scroll
:
scroll
,
section
:
sectionBegin
})
sectionBegin
=
false
lastDrumroll
=
false
}
else
{
currentMeasure
.
push
({
...
...
@@ -359,6 +433,11 @@
lastDrumroll
.
originalEndTime
=
ms
}
if
(
this
.
branches
){
circles
.
sort
((
a
,
b
)
=>
a
.
ms
>
b
.
ms
?
1
:
-
1
)
this
.
measures
.
sort
((
a
,
b
)
=>
a
.
ms
>
b
.
ms
?
1
:
-
1
)
circles
.
forEach
((
circle
,
i
)
=>
circle
.
id
=
i
+
1
)
}
return
circles
}
}
public/src/js/songselect.js
View file @
13ca5e36
...
...
@@ -351,7 +351,7 @@ class SongSelect{
down
:
code
==
40
// Down
}
if
(
key
.
cancel
&&
event
){
if
(
event
&&
(
code
==
27
||
code
==
8
)
){
event
.
preventDefault
()
}
if
(
this
.
state
.
screen
===
"
song
"
){
...
...
@@ -1322,7 +1322,26 @@ class SongSelect{
outlineSize
:
currentUra
?
this
.
songAsset
.
letterBorder
:
0
})
})
var
songStars
=
currentUra
?
currentSong
.
stars
[
4
]
:
currentSong
.
stars
[
i
]
var
songStarsArray
=
(
currentUra
?
currentSong
.
stars
[
4
]
:
currentSong
.
stars
[
i
]).
toString
().
split
(
"
"
)
var
songStars
=
songStarsArray
[
0
]
var
songBranch
=
songStarsArray
[
1
]
===
"
B
"
var
elapsedMS
=
this
.
state
.
screenMS
>
this
.
state
.
moveMS
||
!
songSel
?
this
.
state
.
screenMS
:
this
.
state
.
moveMS
var
fade
=
((
ms
-
elapsedMS
)
%
2000
)
/
2000
if
(
songBranch
&&
fade
>
0.25
&&
fade
<
0.75
){
this
.
draw
.
verticalText
({
ctx
:
ctx
,
text
:
strings
.
songBranch
,
x
:
_x
,
y
:
_y
+
(
songSel
?
110
:
185
),
width
:
songSel
?
44
:
56
,
height
:
songSel
?
160
:
170
,
fill
:
songSel
&&
!
currentUra
?
"
#c85200
"
:
"
#fff
"
,
fontSize
:
songSel
?
25
:
27
,
fontFamily
:
songSel
?
"
Meiryo, Microsoft YaHei, sans-serif
"
:
this
.
font
,
outline
:
songSel
?
false
:
"
#f22666
"
,
outlineSize
:
songSel
?
0
:
this
.
songAsset
.
letterBorder
})
}
else
{
for
(
var
j
=
0
;
j
<
10
;
j
++
){
if
(
songSel
){
var
yPos
=
_y
+
113
+
j
*
17
...
...
@@ -1345,6 +1364,7 @@ class SongSelect{
})
}
}
}
var
currentDiff
=
this
.
selectedDiff
-
this
.
diffOptions
.
length
if
(
this
.
selectedDiff
===
4
+
this
.
diffOptions
.
length
){
currentDiff
=
3
...
...
public/src/js/soundbuffer.js
View file @
13ca5e36
...
...
@@ -86,7 +86,7 @@ class SoundGain{
this
.
volume
=
amount
}
setCrossfade
(
amount
){
this
.
setVolume
(
Math
.
pow
(
Math
.
sin
(
Math
.
PI
/
2
*
amount
),
1
/
4
))
this
.
setVolume
(
Math
.
sqrt
(
Math
.
sin
(
Math
.
PI
/
2
*
amount
)
))
}
fadeIn
(
duration
,
time
,
absolute
){
this
.
fadeVolume
(
0
,
this
.
volume
*
this
.
volume
,
duration
,
time
,
absolute
)
...
...
public/src/js/strings.js
View file @
13ca5e36
...
...
@@ -34,6 +34,7 @@
this
.
normal
=
"
ふつう
"
this
.
hard
=
"
むずかしい
"
this
.
oni
=
"
おに
"
this
.
songBranch
=
"
譜面分岐あり
"
this
.
sessionStart
=
"
オンラインセッションを開始する!
"
this
.
sessionEnd
=
"
オンラインセッションを終了する
"
this
.
loading
=
"
ロード中...
"
...
...
@@ -53,6 +54,11 @@
this
.
good
=
"
良
"
this
.
ok
=
"
可
"
this
.
bad
=
"
不可
"
this
.
branch
=
{
"
normal
"
:
"
普通譜面
"
,
"
advanced
"
:
"
玄人譜面
"
,
"
master
"
:
"
達人譜面
"
}
this
.
pauseOptions
=
[
"
演奏をつづける
"
,
"
はじめからやりなおす
"
,
...
...
@@ -135,6 +141,7 @@ function StringsEn(){
this
.
normal
=
"
Normal
"
this
.
hard
=
"
Hard
"
this
.
oni
=
"
Extreme
"
this
.
songBranch
=
"
Diverge Notes
"
this
.
sessionStart
=
"
Begin an Online Session!
"
this
.
sessionEnd
=
"
End Online Session
"
this
.
loading
=
"
Loading...
"
...
...
@@ -154,6 +161,11 @@ function StringsEn(){
this
.
good
=
"
GOOD
"
this
.
ok
=
"
OK
"
this
.
bad
=
"
BAD
"
this
.
branch
=
{
"
normal
"
:
"
Normal
"
,
"
advanced
"
:
"
Professional
"
,
"
master
"
:
"
Master
"
}
this
.
pauseOptions
=
[
"
Continue
"
,
"
Retry
"
,
...
...
@@ -236,6 +248,7 @@ function StringsCn(){
this
.
normal
=
"
普通
"
this
.
hard
=
"
困难
"
this
.
oni
=
"
魔王
"
this
.
songBranch
=
"
有谱面分歧
"
this
.
sessionStart
=
"
开始在线会话!
"
this
.
sessionEnd
=
"
结束在线会话
"
this
.
loading
=
"
加载中...
"
...
...
@@ -255,6 +268,11 @@ function StringsCn(){
this
.
good
=
"
良
"
this
.
ok
=
"
可
"
this
.
bad
=
"
不可
"
this
.
branch
=
{
"
normal
"
:
"
一般谱面
"
,
"
advanced
"
:
"
进阶谱面
"
,
"
master
"
:
"
达人谱面
"
}
this
.
pauseOptions
=
[
"
继续演奏
"
,
"
从头开始
"
,
...
...
@@ -337,6 +355,7 @@ function StringsTw(){
this
.
normal
=
"
普通
"
this
.
hard
=
"
困難
"
this
.
oni
=
"
魔王
"
this
.
songBranch
=
"
有譜面分歧
"
this
.
sessionStart
=
"
開始多人模式!
"
this
.
sessionEnd
=
"
結束多人模式
"
this
.
loading
=
"
讀取中...
"
...
...
@@ -356,6 +375,11 @@ function StringsTw(){
this
.
good
=
"
良
"
this
.
ok
=
"
可
"
this
.
bad
=
"
不可
"
this
.
branch
=
{
"
normal
"
:
"
一般譜面
"
,
"
advanced
"
:
"
進階譜面
"
,
"
master
"
:
"
達人譜面
"
}
this
.
pauseOptions
=
[
"
繼續演奏
"
,
"
從頭開始
"
,
...
...
@@ -438,6 +462,7 @@ function StringsKo(){
this
.
normal
=
"
보통
"
this
.
hard
=
"
어려움
"
this
.
oni
=
"
귀신
"
this
.
songBranch
=
"
악보 분기 있습니다
"
this
.
sessionStart
=
"
온라인 세션 시작!
"
this
.
sessionEnd
=
"
온라인 세션 끝내기
"
this
.
loading
=
"
로딩 중...
"
...
...
@@ -457,6 +482,11 @@ function StringsKo(){
this
.
good
=
"
얼쑤
"
this
.
ok
=
"
좋다
"
this
.
bad
=
"
에구
"
this
.
branch
=
{
"
normal
"
:
"
보통 악보
"
,
"
advanced
"
:
"
현인 악보
"
,
"
master
"
:
"
달인 악보
"
}
this
.
pauseOptions
=
[
"
연주 계속하기
"
,
"
처음부터 다시
"
,
...
...
public/src/js/titlescreen.js
View file @
13ca5e36
...
...
@@ -18,7 +18,11 @@ class Titlescreen{
this
.
setLang
(
allStrings
[
this
.
lang
],
true
)
if
(
songId
){
this
.
goNext
()
if
(
localStorage
.
getItem
(
"
tutorial
"
)
===
"
true
"
){
new
SongSelect
(
false
,
false
,
this
.
touched
,
this
.
songId
)
}
else
{
new
Tutorial
(
false
,
this
.
songId
)
}
}
else
{
this
.
addLangs
()
...
...
public/src/js/view.js
View file @
13ca5e36
This diff is collapsed.
Click to expand it.
public/src/views/debug.html
View file @
13ca5e36
...
...
@@ -9,6 +9,17 @@
<div
class=
"measure-num input-slider"
>
<span
class=
"reset"
>
x
</span><input
type=
"text"
value=
""
readonly
><span
class=
"minus"
>
-
</span><span
class=
"plus"
>
+
</span>
</div>
<div
class=
"branch-hide"
>
<div>
Branch:
</div>
<div
class=
"branch-select select"
>
<span
class=
"reset"
>
x
</span><select>
<option
value=
"auto"
selected
style=
"background:#fff"
>
Auto
</option>
<option
value=
"normal"
style=
"background:#ccc"
>
Normal
</option>
<option
value=
"advanced"
style=
"background:#bdf"
>
Professional
</option>
<option
value=
"master"
style=
"background:#ebf"
>
Master
</option>
</select>
</div>
</div>
<label><input
class=
"change-restart"
type=
"checkbox"
>
Restart on change
</label>
<label
class=
"autoplay-label"
><input
class=
"autoplay"
type=
"checkbox"
>
Auto play
</label>
<div
class=
"bottom-btns"
>
...
...
server.py
View file @
13ca5e36
...
...
@@ -185,6 +185,7 @@ async def connection(ws, path):
if
"other_user"
in
user
and
"ws"
in
user
[
"other_user"
]:
if
type
==
"note"
\
or
type
==
"drumroll"
\
or
type
==
"branch"
\
or
type
==
"gameresults"
:
await
user
[
"other_user"
][
"ws"
]
.
send
(
msgobj
(
type
,
value
))
elif
type
==
"songsel"
and
user
[
"session"
]:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment