diff --git a/assets/markers/long/classic/background.png b/assets/markers/long/classic/background.png new file mode 100644 index 0000000..6569395 Binary files /dev/null and b/assets/markers/long/classic/background.png differ diff --git a/assets/markers/long/classic/highlight.png b/assets/markers/long/classic/highlight.png new file mode 100644 index 0000000..534cf32 Binary files /dev/null and b/assets/markers/long/classic/highlight.png differ diff --git a/assets/markers/long/classic/long.json b/assets/markers/long/classic/long.json new file mode 100644 index 0000000..8e6140a --- /dev/null +++ b/assets/markers/long/classic/long.json @@ -0,0 +1,51 @@ +{ + "name": "classic", + "fps": 30, + "size": 160, + "note": { + "background": { + "sprite_sheet": "background.png", + "count": 16, + "columns": 4, + "rows": 4 + }, + "outline": { + "sprite_sheet": "outline.png", + "count": 16, + "columns": 4, + "rows": 4 + }, + "highlight": { + "sprite_sheet": "highlight.png", + "count": 16, + "columns": 4, + "rows": 4 + } + }, + "tail": { + "sprite_sheet": "tail.png", + "count": 16, + "columns": 4, + "rows": 4 + }, + "tip": { + "appearance": { + "sprite_sheet": "tip_appearance.png", + "count": 16, + "columns": 4, + "rows": 4 + }, + "begin cycle": { + "sprite_sheet": "tip_begin_cycle.png", + "count": 8, + "columns": 3, + "rows": 3 + }, + "cycle": { + "sprite_sheet": "tip_cycle.png", + "count": 16, + "columns": 4, + "rows": 4 + } + } +} \ No newline at end of file diff --git a/assets/markers/long/classic/outline.png b/assets/markers/long/classic/outline.png new file mode 100644 index 0000000..5b5b900 Binary files /dev/null and b/assets/markers/long/classic/outline.png differ diff --git a/assets/markers/long/classic/tail.png b/assets/markers/long/classic/tail.png new file mode 100644 index 0000000..fa94cc1 Binary files /dev/null and b/assets/markers/long/classic/tail.png differ diff --git a/assets/markers/long/classic/triangle_appearance.png b/assets/markers/long/classic/triangle_appearance.png new file mode 100644 index 0000000..5a15aff Binary files /dev/null and b/assets/markers/long/classic/triangle_appearance.png differ diff --git a/assets/markers/long/classic/triangle_begin_cycle.png b/assets/markers/long/classic/triangle_begin_cycle.png new file mode 100644 index 0000000..069ac80 Binary files /dev/null and b/assets/markers/long/classic/triangle_begin_cycle.png differ diff --git a/assets/markers/long/classic/triangle_cycle.png b/assets/markers/long/classic/triangle_cycle.png new file mode 100644 index 0000000..c1c27a0 Binary files /dev/null and b/assets/markers/long/classic/triangle_cycle.png differ diff --git a/meson.build b/meson.build index c4e151b..b1440d6 100644 --- a/meson.build +++ b/meson.build @@ -37,10 +37,14 @@ sources = [ 'src/Input/Events.cpp', 'src/Resources/TextureCache.cpp', 'src/Resources/TextureCache.hpp', + 'src/Resources/LNMarker.cpp', + 'src/Resources/LNMarker.hpp', 'src/Resources/Marker.cpp', 'src/Resources/Marker.hpp', 'src/Resources/SharedResources.hpp', 'src/Resources/SharedResources.cpp', + 'src/Resources/SpriteSheet.cpp', + 'src/Resources/SpriteSheet.hpp', # 'src/Resources/CoverAtlas.hpp', # 'src/Resources/CoverAtlas.cpp', 'src/Screens/MusicSelect/Drawables/ControlPanels.hpp', diff --git a/src/Data/Preferences.cpp b/src/Data/Preferences.cpp index 0e7bcd7..b38e8b8 100644 --- a/src/Data/Preferences.cpp +++ b/src/Data/Preferences.cpp @@ -39,11 +39,15 @@ namespace Data { } void to_json(nlohmann::json& j, const Options& o) { - j = nlohmann::json{{"marker", o.marker}}; + j = nlohmann::json{ + {"marker", o.marker}, + {"ln_marker", o.ln_marker} + }; } void from_json(const nlohmann::json& j, Options& o) { j.at("marker").get_to(o.marker); + j.at("ln_marker").get_to(o.ln_marker); } // RAII style class which loads preferences from the dedicated file when constructed and saves them when destructed @@ -63,8 +67,8 @@ namespace Data { prefs_file >> j; j.get_to(*this); } catch (const std::exception& e) { - std::cerr << "Error while loading data/preferences.json : " << e.what() << std::endl; - std::cerr << "Using fallback preferences instead" << std::endl; + std::cerr << "Error while loading data/preferences.json : " << e.what() << '\n'; + std::cerr << "Using fallback preferences instead" << '\n'; return; } key_mapping = Input::KeyMapping{key_mapping.m_button_to_key}; @@ -77,7 +81,7 @@ namespace Data { ghc::filesystem::create_directory(data_folder); } if (not ghc::filesystem::is_directory(data_folder)) { - std::cerr << "Can't create data folder to save preferences, a file named 'data' exists" << std::endl; + std::cerr << "Can't create data folder to save preferences, a file named 'data' exists" << '\n'; } std::ofstream preferences_file; preferences_file.open(data_folder/"preferences.json", std::ofstream::trunc | std::ofstream::out); diff --git a/src/Data/Preferences.hpp b/src/Data/Preferences.hpp index d736247..e89c8f7 100644 --- a/src/Data/Preferences.hpp +++ b/src/Data/Preferences.hpp @@ -39,6 +39,7 @@ namespace Data { struct Options { std::string marker; + std::string ln_marker; }; void to_json(nlohmann::json& j, const Options& o); diff --git a/src/Data/Song.cpp b/src/Data/Song.cpp index c1c79b5..86ea74d 100644 --- a/src/Data/Song.cpp +++ b/src/Data/Song.cpp @@ -55,7 +55,7 @@ namespace Data { } } } - std::cout << "Loaded Data::SongList, found " << songs.size() << " songs" << std::endl; + std::cout << "Loaded Data::SongList, found " << songs.size() << " songs" << '\n'; } std::list> recursiveSongSearch(fs::path song_or_pack) { diff --git a/src/Main.cpp b/src/Main.cpp index 5c44eae..e5f6b9a 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -35,6 +35,9 @@ int main(int, char const **) { if (shared_resources.markers.find(preferences.options.marker) == shared_resources.markers.end()) { preferences.options.marker = shared_resources.markers.begin()->first; } + if (shared_resources.ln_markers.find(preferences.options.ln_marker) == shared_resources.ln_markers.end()) { + preferences.options.ln_marker = shared_resources.ln_markers.begin()->first; + } MusicSelect::Screen music_select{song_list, music_select_resources}; // Create the window @@ -53,9 +56,9 @@ int main(int, char const **) { ImGui::SFML::Init(window); auto chart = music_select.select_chart(window); if (chart) { - std::cout << "Selected Chart : " << chart->song.title << " [" << chart->difficulty << "]" << std::endl; + std::cout << "Selected Chart : " << chart->song.title << " [" << chart->difficulty << "]" << '\n'; } else { - std::cout << "Exited MusicSelect::Screen without selecting a chart" << std::endl; + std::cout << "Exited MusicSelect::Screen without selecting a chart" << '\n'; return 0; } diff --git a/src/Resources/LNMarker.cpp b/src/Resources/LNMarker.cpp index c7ab552..88cde72 100644 --- a/src/Resources/LNMarker.cpp +++ b/src/Resources/LNMarker.cpp @@ -1,6 +1,7 @@ #include "LNMarker.hpp" #include +#include namespace Resources { LNMarker::LNMarker(const fs::path& t_folder) : @@ -37,4 +38,28 @@ namespace Resources { j.at("tip").at("begin cycle").get_to(m.tip_begin_cycle); j.at("tip").at("cycle").get_to(m.tip_cycle); } + + LNMarkers::LNMarkers(const fs::path& jujube_path) { + load_from_folder(jujube_path/"markers"/"long"); + load_from_folder(jujube_path/"assets"/"markers"/"long"); + if (empty()) { + throw std::runtime_error("No long note markers found, jujube needs at least one to operate"); + } + } + void LNMarkers::load_from_folder(const fs::path& lnmarkers_folder) { + if (fs::exists(lnmarkers_folder)) { + for (auto& p : fs::directory_iterator(lnmarkers_folder)) { + if (p.is_directory()) { + try { + LNMarker m{p.path()}; + emplace(m.name, m); + } catch (const std::exception& e) { + std::cerr << "Unable to load marker folder " + << p.path().filename().string() << " : " + << e.what() << '\n'; + } + } + } + } + } } diff --git a/src/Resources/LNMarker.hpp b/src/Resources/LNMarker.hpp index c7f06a4..b9793d5 100644 --- a/src/Resources/LNMarker.hpp +++ b/src/Resources/LNMarker.hpp @@ -1,5 +1,8 @@ #pragma once +#include +#include + #include #include @@ -25,4 +28,11 @@ namespace Resources { }; void from_json(const nlohmann::json& j, LNMarker& m); + + class LNMarkers : public std::map { + public: + LNMarkers(const fs::path& jujube_path); + private: + void load_from_folder(const fs::path& lnmarkers_folder); + } } \ No newline at end of file diff --git a/src/Resources/Marker.cpp b/src/Resources/Marker.cpp index 7c80e9f..a303fa8 100644 --- a/src/Resources/Marker.cpp +++ b/src/Resources/Marker.cpp @@ -111,26 +111,28 @@ namespace Resources { } } - Markers load_markers(const fs::path& jujube_path) { - Markers res; - auto markers_folder = jujube_path/"markers"; + Markers::Markers(const fs::path& jujube_path) { + load_from_folder(jujube_path/"markers"/"tap"); + load_from_folder(jujube_path/"assets"/"markers"/"tap"); + if (empty()) { + throw std::runtime_error("No tap note markers found in marker folder, jujube needs at least one to operate"); + } + } + + void Markers::load_from_folder(const fs::path& markers_folder) { if (fs::exists(markers_folder)) { for (auto& p : fs::directory_iterator(markers_folder)) { if (p.is_directory()) { try { Marker m{p.path()}; - res.emplace(m.name, m); + emplace(m.name, m); } catch (const std::exception& e) { std::cerr << "Unable to load marker folder " << p.path().filename().string() << " : " - << e.what() << std::endl; + << e.what() << '\n'; } } } } - if (res.empty()) { - throw std::runtime_error("No markers found in marker folder, jujube needs at least one to operate"); - } - return res; } } diff --git a/src/Resources/Marker.hpp b/src/Resources/Marker.hpp index 64f7e0b..28b574a 100644 --- a/src/Resources/Marker.hpp +++ b/src/Resources/Marker.hpp @@ -42,6 +42,10 @@ namespace Resources { void from_json(const nlohmann::json& j, Marker& m); - using Markers = std::map; - Markers load_markers(const ghc::filesystem::path& jujube_path); + class Markers : public std::map { + public: + Markers(const fs::path& jujube_path); + private: + void load_from_folder(const fs::path& markers_folder); + }; } diff --git a/src/Resources/SharedResources.cpp b/src/Resources/SharedResources.cpp index 995024a..5465030 100644 --- a/src/Resources/SharedResources.cpp +++ b/src/Resources/SharedResources.cpp @@ -28,10 +28,11 @@ namespace Resources { fallback_font(p.jujube_path), black_frame(p), button_highlight(p), - markers(Resources::load_markers(p.jujube_path)) + markers(p.jujube_path), + ln_markers(p.jujube_path) { covers.reserve(256); - std::cout << "Loaded MusicSelect::SharedResources" << std::endl; + std::cout << "Loaded MusicSelect::SharedResources" << '\n'; } sf::Color SharedResources::get_chart_color(const std::string& chart) { diff --git a/src/Resources/SharedResources.hpp b/src/Resources/SharedResources.hpp index 91b793b..b89b734 100644 --- a/src/Resources/SharedResources.hpp +++ b/src/Resources/SharedResources.hpp @@ -15,6 +15,7 @@ #include "../Drawables/ButtonHighlight.hpp" #include "../Drawables/DensityGraph.hpp" #include "../Resources/Marker.hpp" +#include "../Resources/LNMarker.hpp" #include "../Resources/TextureCache.hpp" namespace Resources { @@ -57,6 +58,9 @@ namespace Resources { Resources::Markers markers; Resources::Marker& get_selected_marker(); + + Resources::LNMarkers ln_markers; + Resources::LNMarker& get_selected_ln_marker(); }; // Proxy for HoldsPreferences diff --git a/src/Screens/MusicSelect/MusicSelect.cpp b/src/Screens/MusicSelect/MusicSelect.cpp index 4f75fdd..316706f 100644 --- a/src/Screens/MusicSelect/MusicSelect.cpp +++ b/src/Screens/MusicSelect/MusicSelect.cpp @@ -23,7 +23,7 @@ MusicSelect::Screen::Screen(const Data::SongList& t_song_list, ScreenResources& start_button(t_resources) { panel_filter.setFillColor(sf::Color(0,0,0,200)); - std::cout << "loaded MusicSelect::Screen" << std::endl; + std::cout << "loaded MusicSelect::Screen" << '\n'; } std::optional MusicSelect::Screen::select_chart(sf::RenderWindow& window) { diff --git a/src/Screens/MusicSelect/Ribbon.cpp b/src/Screens/MusicSelect/Ribbon.cpp index eb79f11..cc00f19 100644 --- a/src/Screens/MusicSelect/Ribbon.cpp +++ b/src/Screens/MusicSelect/Ribbon.cpp @@ -71,7 +71,7 @@ namespace MusicSelect { left_button(t_resources), right_button(t_resources) { - std::cout << "Loaded MusicSelect::Ribbon" << std::endl; + std::cout << "Loaded MusicSelect::Ribbon" << '\n'; }