Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
177 commits
Select commit Hold shift + click to select a range
5e22c18
Add online login
Bobini1 Feb 27, 2026
d28828d
Working auth
Bobini1 Feb 28, 2026
8c6e27c
Score uploads
Bobini1 Mar 1, 2026
5e81866
Don't upload autoplay scores and set the right timestamp on replays
Bobini1 Mar 1, 2026
a0cd1fb
Add parens
Bobini1 Mar 1, 2026
a48924a
Remove parens
Bobini1 Mar 1, 2026
e1c306d
Don't send chart path
Bobini1 Mar 1, 2026
9462c9f
Score syncing
Bobini1 Mar 1, 2026
ce15b7b
Update score counts after syncing
Bobini1 Mar 2, 2026
288cc28
Improve error reporting on login/sync
Bobini1 Mar 2, 2026
36b8da9
Publish submission state
Bobini1 Mar 2, 2026
8e188db
Mean, SD, ranking ui
Bobini1 Mar 2, 2026
193b499
Make mean and sd prettier
Bobini1 Mar 2, 2026
1217ef3
Fix score submission status
Bobini1 Mar 2, 2026
49f85be
Querying online scores
Bobini1 Mar 3, 2026
9ae7b77
Fix formatting
Bobini1 Mar 3, 2026
3c5d629
Fix search bar size
Bobini1 Mar 3, 2026
4ea00ab
Online ranking stuff
Bobini1 Mar 6, 2026
40d7124
Fix keychain on linux
Bobini1 Mar 6, 2026
7787ad7
Add game version to chart data
Bobini1 Mar 8, 2026
2f78498
Ranking in select
Bobini1 Mar 9, 2026
370c9f7
Refactor requests
Bobini1 Mar 10, 2026
e24d81b
Ranking stats
Bobini1 Mar 10, 2026
dcb677d
Add a Score Details label
Bobini1 Mar 10, 2026
9dd26aa
Read reply after checking errors
Bobini1 Mar 10, 2026
5e225b4
Add additional keymode filters
Bobini1 Mar 10, 2026
4c1536b
Add missing options to settings
Bobini1 Mar 10, 2026
efeaf25
Add aliasing for k5/k10
Bobini1 Mar 10, 2026
7d7f709
Fix stops getting assigned to exbpms in #RANDOM chart branches
Bobini1 Mar 11, 2026
4a81c3d
Modernize strong typedef macro a bit
Bobini1 Mar 11, 2026
a3cbcbc
Parse base and scrolls
Bobini1 Mar 11, 2026
4eb72a8
Handle base62 charts
Bobini1 Mar 11, 2026
054d777
Improve keymode buttons
Bobini1 Mar 11, 2026
7c169b7
Fix old-school bpm
Bobini1 Mar 11, 2026
834feaa
Use the common network access manager in profiles
Bobini1 Mar 12, 2026
656890e
FIx deleted reference to ranking model in callback
Bobini1 Mar 13, 2026
12838e8
Sort notes and barlines to account for negative scroll
Bobini1 Mar 13, 2026
8528eb7
Use stable sort just in case
Bobini1 Mar 13, 2026
1f17a6d
Update visibility in edge cases where lns can overlap
Bobini1 Mar 13, 2026
98e521a
Fix old-school bpm changes
Bobini1 Mar 14, 2026
f91d78f
#SCROLL almost working
Bobini1 Mar 14, 2026
4c0f387
Fix base62 to base16 conversion
Bobini1 Mar 14, 2026
7660a31
Clean up
Bobini1 Mar 14, 2026
dedcef6
Fix base62 to base16 conversion
Bobini1 Mar 14, 2026
f05fc00
Fix base62 to base16 conversion
Bobini1 Mar 14, 2026
201ab7e
Fix the order of scrolls and stops
Bobini1 Mar 14, 2026
784d4d8
Cosmetic changes
Bobini1 Mar 15, 2026
975f647
Improve the performance of displaying barlines
Bobini1 Mar 15, 2026
e115462
Remove debug print
Bobini1 Mar 15, 2026
b3c95fe
Improve state filtering logic
Bobini1 Mar 16, 2026
358bd73
Fix barlines at very high position values
Bobini1 Mar 16, 2026
b69d01a
Remove helper rectangles
Bobini1 Mar 16, 2026
9157ad5
Move barlines up slightly
Bobini1 Mar 16, 2026
7997447
Fix ln begin/end height
Bobini1 Mar 16, 2026
41ba05a
Only check for invalid bpm and stop values in BmsNotesData
Bobini1 Mar 16, 2026
b80aa9a
Store score owner
Bobini1 Mar 16, 2026
f44c19c
Improve score upload flow
Bobini1 Mar 16, 2026
8c4c75e
Working online replays
Bobini1 Mar 18, 2026
e13b88f
Online replays for "best clear"
Bobini1 Mar 18, 2026
8cbdfb3
Improve bounding boxes and links
Bobini1 Mar 18, 2026
e6891ea
Bounding rect on usename
Bobini1 Mar 18, 2026
e5ff93c
Fix chart links
Bobini1 Mar 18, 2026
18660c5
Don't resubmit replayed online scores
Bobini1 Mar 18, 2026
ebb0428
Improve mainBpm calculation
Bobini1 Mar 18, 2026
ea7f7f2
Simplify ranking data requests
Bobini1 Mar 18, 2026
f9bd06e
Fix binding loop
Bobini1 Mar 18, 2026
f310c63
Expose ranking entries in a property
Bobini1 Mar 18, 2026
9bd8724
Refactor
Bobini1 Mar 18, 2026
5331182
Use new score summary shape
Bobini1 Mar 18, 2026
7abc59d
Allow 0 limit
Bobini1 Mar 18, 2026
32423eb
Ranking position in result
Bobini1 Mar 19, 2026
cb9a571
Change position of busy indicator in result ranking
Bobini1 Mar 19, 2026
8a665c3
Change position of busy indicator
Bobini1 Mar 19, 2026
8295cec
Adjust the size of the busy indicator again
Bobini1 Mar 19, 2026
c58cadf
Highlight current user in ranking
Bobini1 Mar 19, 2026
e3c8fbd
Restrict dateLte on replays
Bobini1 Mar 19, 2026
efb0412
Ranking position in song select
Bobini1 Mar 19, 2026
b81f2a4
Handle G-Battle
Bobini1 Mar 19, 2026
dc435b9
Adjust ranking logic in result screen to account for online scores
Bobini1 Mar 19, 2026
a8afbca
Adjust logic for dp replays in battle
Bobini1 Mar 19, 2026
c613077
Refactor ranking components
Bobini1 Mar 19, 2026
61fcd4a
Rename ranking components
Bobini1 Mar 19, 2026
ec40031
Result screen and gbattle from ranking
Bobini1 Mar 19, 2026
ce25f4f
Fix buttons on best points score in ranking
Bobini1 Mar 19, 2026
2b6831a
Result screen and g-battle on replay button
Bobini1 Mar 19, 2026
bee1ee1
Refresh ranking when returning from result
Bobini1 Mar 19, 2026
de2ddc3
Fix login section gaps
Bobini1 Mar 19, 2026
dd4ec7b
Bring back translation connections
Bobini1 Mar 19, 2026
eaeb10e
Update translations
Bobini1 Mar 19, 2026
43777ae
LR2IR ranking
Bobini1 Mar 21, 2026
f7a70ad
IR links
Bobini1 Mar 21, 2026
7b33292
LR2IR integration improved
Bobini1 Mar 21, 2026
52a7c77
Remove profile link when LR2IR
Bobini1 Mar 21, 2026
31f3f26
Handle LR2IR on result
Bobini1 Mar 21, 2026
19dafc2
Fix ranking link in result
Bobini1 Mar 21, 2026
ee6edfd
Fix ranking link in result
Bobini1 Mar 21, 2026
348306e
Fetch tachi data
Bobini1 Mar 22, 2026
361aa54
Handle tachi
Bobini1 Mar 22, 2026
fb21645
Adjust margin slightly
Bobini1 Mar 22, 2026
f0457ce
Add keymode to score
Bobini1 Mar 22, 2026
e8affff
Handle 5k random
Bobini1 Mar 22, 2026
d78dfa8
Proper handling for 5k
Bobini1 Mar 22, 2026
af00e25
Fix 10k input mapping
Bobini1 Mar 22, 2026
f4ae0b3
Change default mapping for p2 k5
Bobini1 Mar 22, 2026
1937451
Remove unused var
Bobini1 Mar 22, 2026
c29fe48
Improve some things about keymode handling
Bobini1 Mar 22, 2026
acba328
Namespace closing comment
Bobini1 Mar 22, 2026
2f27e59
Change include
Bobini1 Mar 22, 2026
eebfeee
Adjust keymode on uploaded scores
Bobini1 Mar 22, 2026
ec641e2
Remove print
Bobini1 Mar 23, 2026
4388cd4
Remove console.info
Bobini1 Mar 23, 2026
c521696
Fix logging out
Bobini1 Mar 23, 2026
ceb326c
Improve login ux
Bobini1 Mar 23, 2026
f608172
Remove logging of response body
Bobini1 Mar 23, 2026
02c5c12
Fix tachi userids
Bobini1 Mar 23, 2026
48a04e9
Show the right ranking position for tachi
Bobini1 Mar 23, 2026
1da682e
Fix 0 points edge case when looking for best scores
Bobini1 Mar 23, 2026
aae55c5
Don't show busy indicator when we have some entries
Bobini1 Mar 23, 2026
671122a
Fix busy indicator on charts not in ir
Bobini1 Mar 23, 2026
8a59bb1
Remove date filters
Bobini1 Mar 23, 2026
cf2f351
Simplify type name
Bobini1 Mar 23, 2026
1de9bfd
Remove unnecessary keymode passing to components
Bobini1 Mar 23, 2026
7e9188c
Remove date properties
Bobini1 Mar 23, 2026
6d291f5
Fix ln bodies
Bobini1 Mar 23, 2026
7096992
Fix ln bodies
Bobini1 Mar 23, 2026
e9d777e
Handle implicit subtitle
Bobini1 Mar 24, 2026
367e5ba
Fix implicit subtitle
Bobini1 Mar 24, 2026
a993a83
Fix 14k rankings for tachi provider
Bobini1 Mar 24, 2026
a7b202e
Previous ranking position in result
Bobini1 Mar 24, 2026
0cb7053
Basic ranking switching in result
Bobini1 Mar 24, 2026
1aedd6b
remove "online links"
Bobini1 Mar 24, 2026
c1d0d0c
Fix ln body logic
Bobini1 Mar 24, 2026
4ba4847
Remove the empty space from the beginning of path
Bobini1 Mar 24, 2026
edf3fb1
Arrows for switching IR
Bobini1 Mar 24, 2026
bbc5952
Fix IR box sizes
Bobini1 Mar 24, 2026
5c3b5ee
Ranking selection ui
Bobini1 Mar 24, 2026
662061f
Show new score as old in IR when showing replays older than 5 secs
Bobini1 Mar 25, 2026
0b20bcb
Clean up
Bobini1 Mar 25, 2026
4e148de
Handle more implicit subtitle delimiters
Bobini1 Mar 25, 2026
3ecdb7a
Fix RG IR
Bobini1 Mar 25, 2026
5ab0af8
Ease logs
Bobini1 Mar 25, 2026
8f9bd79
Improve bpm length calculation
Bobini1 Mar 25, 2026
98838dc
Arrows for switching IR in select
Bobini1 Mar 25, 2026
a97061f
Don't enable link when lr2ir entry count is 1
Bobini1 Mar 25, 2026
81d9174
Disable ranking loading in gameplay
Bobini1 Mar 25, 2026
cdf2df9
Move entries
Bobini1 Mar 25, 2026
1592182
Apply sortfilter to tachi
Bobini1 Mar 25, 2026
a31dfa9
Make tachi one request faster
Bobini1 Mar 25, 2026
ddcacd6
Remove unused class
Bobini1 Mar 25, 2026
5cca6f3
Special handling for loading lr2ir
Bobini1 Mar 25, 2026
59858b9
Fix filtering
Bobini1 Mar 25, 2026
dd12170
Fix filtering for maxPoints = 0
Bobini1 Mar 25, 2026
7b21586
Remembering ranking preference in result
Bobini1 Mar 25, 2026
9ca05dd
Smarter appending of entries
Bobini1 Mar 25, 2026
2ae59c4
Fix ranking entries during loading for LR2IR
Bobini1 Mar 25, 2026
81619e0
Fix Tachi appending
Bobini1 Mar 25, 2026
cc7b910
Use floor for showing percentages in ranking
Bobini1 Mar 25, 2026
d29d1d0
Improve positioning for rankings with more than 10000 scores
Bobini1 Mar 25, 2026
ed9f997
Refactor and improve score syncing
Bobini1 Mar 25, 2026
d2e1d84
Improve result ux for users that are not logged in
Bobini1 Mar 25, 2026
8b2b7c6
Handle nested delimiters
Bobini1 Mar 25, 2026
7d0031a
Clip select
Bobini1 Mar 25, 2026
c1c5414
Fix delims
Bobini1 Mar 25, 2026
b2da7d5
Special handling for sakura fubuki
Bobini1 Mar 25, 2026
c0564ff
Fix note counts in ui
Bobini1 Mar 25, 2026
934e91b
Handle special (^^) cases
Bobini1 Mar 25, 2026
e62d80f
Add bg to main screen
Bobini1 Mar 26, 2026
02cb978
Prepend game name to keychain key name
Bobini1 Mar 26, 2026
b5f12fc
Window visibility settings
Bobini1 Mar 26, 2026
790f8db
Add attributions for QtKeychain
Bobini1 Mar 26, 2026
3d8ec2a
Update website base url
Bobini1 Mar 26, 2026
5c25e48
Fix and update nix
Bobini1 Mar 26, 2026
762ed6e
Fix warning
Bobini1 Mar 26, 2026
855d4f2
Reset clear counts when re-fetching
Bobini1 Mar 26, 2026
5055daf
Mention the IR in readme
Bobini1 Mar 26, 2026
784adc2
Don't show stats until finished loading for lr2ir
Bobini1 Mar 26, 2026
f335247
Remove online link from lr2 charts with 0 players
Bobini1 Mar 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 65 additions & 1 deletion ATTRIBUTIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ https://github.com/souki202/my_beatoraja_skin

#### SocialSkin dependencies:

* Background image: (Originally: \*/background/\*.png; RhythmGame: bg.png, clear.png, failed.png):
* Background image: (Originally: \*/background/\*.png; RhythmGame: bg.png, clear.png, failed.png, flower-back0716.png):
Flower images from [百花繚乱](https://flowerillust.com/).
* Font: Copyright © 2014, 2015 Adobe Systems Incorporated (http://www.adobe.com/),
with Reserved Font Name 'Source', Kozuka Gothic.
Expand Down Expand Up @@ -132,6 +132,13 @@ Copyright © The Qt Company Ltd.

https://doc.qt.io/qt-6/lgpl.html

### QtKeychain

BSD 3-Clause "New" or "Revised" License (BSD 3-Clause)

Copyright © 2011–2015 Frank Osterfeld
Copyright © 2016 Mathias Hasselmann

### libxml2

The MIT License (MIT)
Expand Down Expand Up @@ -827,3 +834,60 @@ BSD 2-Clause License (BSD-2-Clause)
Copyright © 2001-2014 Peter Johnson and other Yasm developers

https://github.com/yasm/yasm/blob/master/COPYING

### libdbus-1 headers

Academic Free License v2.1 (AFL-2.1)

Copyright © 2002, 2003 CodeFactory AB
Copyright © 2004, 2005 Red Hat, Inc.

### libsecret

GNU Lesser General Public License v2.1 or later (LGPL-2.1-or-later)

### libgcrypt

GNU Lesser General Public License v2.1 or later (LGPL-2.1-or-later)

#### BSD 3-Clause License (BSD-3-Clause):

cipher/sha256-avx-amd64.S
cipher/sha256-avx2-bmi2-amd64.S
cipher/sha256-ssse3-amd64.S
cipher/sha512-avx-amd64.S
cipher/sha512-avx2-bmi2-amd64.S
cipher/sha512-ssse3-amd64.S
cipher/sha512-ssse3-i386.c
cipher/sha512-avx512-amd64.S

Copyright © 2012, Intel Corporation

cipher/poly1305-amd64-avx512.S

Copyright © 2021–2022, Intel Corporation

random/jitterentropy-base.c
random/jitterentropy-gcd.c
random/jitterentropy-gcd.h
random/jitterentropy-health.c
random/jitterentropy-health.h
random/jitterentropy-noise.c
random/jitterentropy-noise.h
random/jitterentropy-sha3.c
random/jitterentropy-sha3.h
random/jitterentropy-timer.c
random/jitterentropy-timer.h
random/jitterentropy.h
random/rndjent.c (plus common Libgcrypt copyright holders)

Copyright © 2017–2021, Stephan Mueller <smueller@chronox.de>

cipher/cipher-gcm-ppc.c
cipher/keccak-amd64-avx512.S

Copyright © 2006, CRYPTOGAMS by <appro@openssl.org> All rights reserved.

### libgpg-error

GNU Lesser General Public License v2.1 or later (LGPL-2.1-or-later)
25 changes: 19 additions & 6 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.21)
include(cmake/prelude.cmake)
project(
RhythmGame
VERSION 1.2.8
VERSION 1.3.0
DESCRIPTION "A customizable BMS player for Windows and Linux. "
HOMEPAGE_URL "https://github.com/Bobini1/RhythmGame"
LANGUAGES C CXX
Expand All @@ -20,8 +20,6 @@ if (supported)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
endif ()

option(PORTABLE_BUILD "Deploy the entire game to a portable folder, without using system dirs" ON)

# <---- mimalloc (faster memory allocation) ---->

find_package(mimalloc CONFIG REQUIRED)
Expand Down Expand Up @@ -61,6 +59,9 @@ message(STATUS "miniaudio include dirs: ${MINIAUDIO_INCLUDE_DIRS}")
find_package(Qt6 COMPONENTS ShaderTools Quick Concurrent Multimedia Svg InterfaceFramework LinguistTools QuickControls2 REQUIRED)
qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES pl jp)

# <------------ QtKeychain (storing login data) --------------->
find_package(Qt6Keychain CONFIG REQUIRED)

# <------------ zstd (compression) --------------->

find_package(zstd REQUIRED)
Expand Down Expand Up @@ -181,6 +182,12 @@ qt_add_library(RhythmGame_lib OBJECT
src/qml_components/PreviewFilePathFetcher.h
src/qml_components/ScoreDb.cpp
src/qml_components/ScoreDb.h
src/qml_components/ScoreSyncOperation.cpp
src/qml_components/ScoreSyncOperation.h
src/qml_components/OnlineScores.cpp
src/qml_components/OnlineScores.h
src/qml_components/OnlineRankingModel.cpp
src/qml_components/OnlineRankingModel.h
src/qml_components/FileQuery.cpp
src/qml_components/FileQuery.h
src/qml_components/Bga.cpp
Expand Down Expand Up @@ -243,6 +250,12 @@ qt_add_library(RhythmGame_lib OBJECT
src/sounds/NormalSoundBuffer.h
src/sounds/NormalSound.cpp
src/sounds/NormalSound.h
src/qml_components/OnlineProfileInfo.cpp
src/qml_components/OnlineProfileInfo.h
src/charts/Base62.cpp
src/charts/Base62.h
src/support/ConvertTachiClearType.cpp
src/support/ConvertTachiClearType.h
)

if (WIN32)
Expand All @@ -261,7 +274,7 @@ target_link_libraries(RhythmGame_lib PUBLIC $<IF:$<TARGET_EXISTS:mimalloc-static

# <------------ SndFile (audio file reading) --------------->

find_package(SndFile)
find_package(SndFile QUIET)
if (NOT SndFile_FOUND)
find_package(PkgConfig REQUIRED)
pkg_check_modules(SndFile REQUIRED IMPORTED_TARGET sndfile)
Expand All @@ -270,7 +283,7 @@ else ()
target_link_libraries(RhythmGame_lib PUBLIC SndFile::sndfile)
endif ()

find_package(Stb)
find_package(Stb QUIET)
if (NOT Stb_FOUND)
find_package(PkgConfig REQUIRED)
pkg_check_modules(stb REQUIRED IMPORTED_TARGET stb)
Expand All @@ -279,7 +292,7 @@ if (NOT Stb_FOUND)
else ()
target_link_libraries(RhythmGame_lib PUBLIC ${Stb_LIBRARIES})
endif ()
target_link_libraries(RhythmGame_lib PUBLIC SDL2::SDL2 Qt6::Quick Qt6::QuickControls2 Qt6::OpenGL Qt6::Concurrent Qt6::Multimedia Qt6::InterfaceFramework Threads::Threads Boost::headers SQLiteCpp spdlog::spdlog foonathan::lexy magic_enum::magic_enum $<IF:$<TARGET_EXISTS:zstd::libzstd_static>,zstd::libzstd_static,zstd::libzstd> LibXml2::LibXml2)
target_link_libraries(RhythmGame_lib PUBLIC SDL2::SDL2 Qt6::Quick Qt6::QuickControls2 Qt6::OpenGL Qt6::Concurrent Qt6::Multimedia Qt6::InterfaceFramework Qt6Keychain::Qt6Keychain Threads::Threads Boost::headers SQLiteCpp spdlog::spdlog foonathan::lexy magic_enum::magic_enum $<IF:$<TARGET_EXISTS:zstd::libzstd_static>,zstd::libzstd_static,zstd::libzstd> LibXml2::LibXml2)
target_include_directories(RhythmGame_lib PUBLIC ${MINIAUDIO_INCLUDE_DIRS})

if (WIN32)
Expand Down
66 changes: 33 additions & 33 deletions DEV_THEME.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ Here is an example of a minimal `theme.json` file:

```json
{
"scripts": {
"result": "result.qml"
}
"scripts": {
"result": "result.qml"
}
}
```

Expand All @@ -33,12 +33,12 @@ you can define a `settings` field in `theme.json`.

```json
{
"scripts": {
"result": "result.qml"
},
"settings": {
"result": "result.json"
}
"scripts": {
"result": "result.qml"
},
"settings": {
"result": "result.json"
}
}
```

Expand Down Expand Up @@ -98,15 +98,15 @@ You can override the auto-generated settings page for a screen by providing a QM

```json
{
"scripts": {
"result": "result.qml"
},
"settings": {
"result": "result.json"
},
"settingsScripts": {
"result": "resultSettings.qml"
}
"scripts": {
"result": "result.qml"
},
"settings": {
"result": "result.json"
},
"settingsScripts": {
"result": "resultSettings.qml"
}
}
```

Expand All @@ -118,19 +118,19 @@ Translations are described in [DEV_LANG.md](DEV_LANG.md).

```json
{
"scripts": {
"result": "result.qml"
},
"settings": {
"result": "result.json"
},
"settingsScripts": {
"result": "resultSettings.qml"
},
"translations": {
"en": "en.qm",
"pl": "pl.qm"
}
"scripts": {
"result": "result.qml"
},
"settings": {
"result": "result.json"
},
"settingsScripts": {
"result": "resultSettings.qml"
},
"translations": {
"en": "en.qm",
"pl": "pl.qm"
}
}
```

Expand Down Expand Up @@ -169,8 +169,8 @@ Do not remove screens from under yourself. It's messy and unnecessary.
`sceneStack` contains a few helper methods:

```qml
function openChart(path, profile1, autoplay1, score1, profile2, autoplay2, score2)
function openCourse(course, profile1, autoplay1, score1, profile2, autoplay2, score2)
function openChart(path, profile1, autoplay1, replay1, score1, profile2, autoplay2, replay2, score2)
function openCourse(course, profile1, autoplay1, replay1, score1, profile2, autoplay2, replay2, score2)
function openResult(scores, profiles, chartData)
function openCourseResult(scores, profiles, chartDatas, course)
```
Expand Down
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,18 @@ You can use the [default theme](https://github.com/Bobini1/RhythmGame/tree/maste
reference.
See the [DEV_THEME.md](DEV_THEME.md) document for more information.

### Internet Ranking with Bokutachi and LR2IR support

Compete with players around the world! RhythmGame supports has its own native IR server at https://rhythmgame.eu,
but you can also submit your scores to [Bokutachi](https://boku.tachi.ac/) and see the scores from
the [Lunatic Rave 2 Internet Ranking](http://www.dream-pro.info/~lavalse/LR2IR/search.cgi).

[![Internet ranking](docs/images/ranking.png)](https://rhythmgame.eu)

| Ranking | Online Stats |
|:--------------------------------------------------:|:-------------------------------------------------------:|
| ![In-game ranking](docs/images/ranking-ingame.png) | ![In-game ranking stats](docs/images/ranking-stats.png) |

### Rules based on Lunatic Rave 2

The timing windows and gauges match Lunatic Rave 2/Lr2oraja
Expand Down
24 changes: 18 additions & 6 deletions RhythmGameQml/ContentFrame.qml
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,31 @@ ApplicationWindow {
property alias width: contentContainer.width
property int visibility
}
property bool settingsRestored: false
Component.onCompleted: {
if (settings.visibility) {
contentContainer.visibility = settings.visibility;
}
}
onActiveChanged: {
if (active && !settingsRestored) {
settingsRestored = true;
}
}
onVisibilityChanged: {
if (settingsRestored && (contentContainer.visibility === Window.Windowed || contentContainer.visibility === Window.FullScreen)) {
settings.visibility = contentContainer.visibility;
}
}
Shortcut {
autoRepeat: false
sequence: "F11"

onActivated: {
if (contentContainer.visibility === Window.FullScreen) {
contentContainer.visibility = Window.Windowed;
settings.visibility = Window.Windowed;
} else {
contentContainer.visibility = Window.FullScreen;
settings.visibility = Window.FullScreen;
}
}
}
Expand All @@ -44,14 +53,17 @@ ApplicationWindow {
readonly property Component k7Component: Qt.createComponent(Rg.themes.availableThemeFamilies[mainProfile.themeConfig.k7].screens.k7.script)
readonly property Component k7battleComponent: Qt.createComponent(Rg.themes.availableThemeFamilies[mainProfile.themeConfig.k7battle].screens.k7battle.script)
readonly property Component k14Component: Qt.createComponent(Rg.themes.availableThemeFamilies[mainProfile.themeConfig.k14].screens.k14.script)
readonly property Component k5Component: Qt.createComponent(Rg.themes.availableThemeFamilies[mainProfile.themeConfig.k5].screens.k5.script)
readonly property Component k5battleComponent: Qt.createComponent(Rg.themes.availableThemeFamilies[mainProfile.themeConfig.k5battle].screens.k5battle.script)
readonly property Component k10Component: Qt.createComponent(Rg.themes.availableThemeFamilies[mainProfile.themeConfig.k10].screens.k10.script)
readonly property Component mainComponent: Qt.createComponent(Rg.themes.availableThemeFamilies[mainProfile.themeConfig.main].screens.main.script)
readonly property Component resultComponent: Qt.createComponent(Rg.themes.availableThemeFamilies[mainProfile.themeConfig.result].screens.result.script)
readonly property Component settingsComponent: Qt.createComponent(Rg.themes.availableThemeFamilies[mainProfile.themeConfig.settings].screens.settings.script)
readonly property Component selectComponent: Qt.createComponent(Rg.themes.availableThemeFamilies[mainProfile.themeConfig.select].screens.select.script)
readonly property Component decideComponent: Qt.createComponent(Rg.themes.availableThemeFamilies[mainProfile.themeConfig.decide].screens.decide.script)

function openChart(path, profile1, autoplay1, score1, profile2, autoplay2, score2) {
let chart = Rg.chartLoader.loadChart(path, profile1, autoplay1, score1, profile2, autoplay2, score2);
function openChart(path, profile1, autoplay1, replay1, score1, profile2, autoplay2, replay2, score2) {
let chart = Rg.chartLoader.loadChart(path, profile1, autoplay1, replay1, score1, profile2, autoplay2, replay2, score2);
if (!chart) {
console.error("Failed to load chart");
return;
Expand All @@ -61,8 +73,8 @@ ApplicationWindow {
});
}

function openCourse(course, profile1, autoplay1, score1, profile2, autoplay2, score2) {
let runner = Rg.chartLoader.loadCourse(course, profile1, autoplay1, score1, profile2, autoplay2, score2);
function openCourse(course, profile1, autoplay1, replay1, score1, profile2, autoplay2, replay2, score2) {
let runner = Rg.chartLoader.loadCourse(course, profile1, autoplay1, replay1, score1, profile2, autoplay2, replay2, score2);
if (!runner) {
console.error("Failed to load course");
return;
Expand Down
2 changes: 2 additions & 0 deletions RhythmGameQml/Rg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ Rg::Rg(qml_components::ProgramSettings* programSettings,
resource_managers::Tables* tables,
resource_managers::Languages* languages,
sounds::AudioEngine* audioEngine,
qml_components::OnlineScores* onlineScores,
QObject* parent)
: QObject(parent)
, programSettings(programSettings)
Expand All @@ -32,6 +33,7 @@ Rg::Rg(qml_components::ProgramSettings* programSettings,
, tables(tables)
, languages(languages)
, audioEngine(audioEngine)
, onlineScores(onlineScores)
{
}
Rg*
Expand Down
Loading
Loading